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

<channel>
	<title>DeServ - Info</title>
	<atom:link href="http://blog.deserv.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.deserv.info</link>
	<description>Seu Caderno de Anotações de Informática</description>
	<lastBuildDate>Sat, 04 Sep 2010 18:53:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.6.3" -->
	<copyright>2006-2007 </copyright>
	<managingEditor>flavio.aparecido@gmail.com (DeServ - Info)</managingEditor>
	<webMaster>flavio.aparecido@gmail.com (DeServ - Info)</webMaster>
	<category>posts</category>
	<image>
		<url>http://blog.deserv.info/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>DeServ - Info</title>
		<link>http://blog.deserv.info</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary>Just another WordPress weblog</itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Society &amp; Culture" />
	<itunes:author>DeServ - Info</itunes:author>
	<itunes:owner>
		<itunes:name>DeServ - Info</itunes:name>
		<itunes:email>flavio.aparecido@gmail.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://blog.deserv.info/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<item>
		<title>Ferramentas de detecção e NMAP</title>
		<link>http://blog.deserv.info/2010/09/04/ferramentas-de-deteccao-e-nmap/</link>
		<comments>http://blog.deserv.info/2010/09/04/ferramentas-de-deteccao-e-nmap/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 18:51:43 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Enganando um firewall]]></category>
		<category><![CDATA[Examinado portas específicas]]></category>
		<category><![CDATA[Ferramentas de detecção e NMAP]]></category>
		<category><![CDATA[Identificando o sistema operacional]]></category>
		<category><![CDATA[Obtendo o NMAP]]></category>
		<category><![CDATA[Opções do NMAP]]></category>
		<category><![CDATA[Scaneando faixas de IPs]]></category>
		<category><![CDATA[TCP]]></category>
		<category><![CDATA[UDP]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=426</guid>
		<description><![CDATA[Ferramentas de detecção Esse artigo e voltado para explicação do que é o NMAP e de como instalá-lo e utiliza-lo. Antes disso é interessante passar o conceito de ferramentas de detecção, pois o NMAP é uma. Ferramentas de detecção As ferramentas de detecção nada mais são do que um sistema que analisa se um computador [...]


No related posts.

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<h1>Ferramentas de detecção</h1>
<p>Esse artigo e voltado para explicação do que é o <em>NMAP</em> e de como instalá-lo e utiliza-lo. Antes disso é  interessante passar o conceito de ferramentas de detecção, pois  o NMAP é uma. <span id="more-426"></span></p>
<h1>Ferramentas de detecção</h1>
<p>As ferramentas de detecção nada mais são do que um sistema  que analisa se um computador tem portas UDP ou TCP abertas,  ele faz uma varredura pelas mais de 65000 portas existentes  nesses protocolos.</p>
<p>A forma como essa detecção é feita varia de programa para  programa e claro, da forma como cada um é utilizado. De  uma forma geral, podemos falar que as ferramentas instaladas  em uma máquina enviam pacotes para um servidor (ou uma máquina  qualquer), direcionando esse pacotes para cada uma das portas  existentes, quando ele recebe uma confirmação do pacote, isso  significa que a porta X a qual foi encaminhada um pacote está  ativa.</p>
<p>Esse é um modo bem simples de se ver o processo de detecção de  portas. Com os avançados sistemas de firewall que existem hoje  em dia esse procedimento não daria certo, pois eles são capazes  de restringir acesso de redes externas, mas com o NMAP podemos  camuflar (mudar) nosso IP e assim tentar confundir o firewall,  mas isso será visto mais a frente.</p>
<p>Outra maneira de detecção usada pelas ferramentas é a do envio  de pacotes especiais, esse pacotes são exclusivos para portas  que estação fechadas. Ora, se uma porta não responder significa  que a mesma está aberta. Essa é apenas uma noção que devemos  ter sobre ferramentas de detecção.</p>
<h1>Obtendo o NMAP</h1>
<p>Antes de tudo precisamos instalar os pacotes do NMAP:</p>
<ul>
<li> nmap-3.50-3.i386.rpm</li>
<li> nmap-frontend-3.50-3.i386.rpm</li>
</ul>
<p>Você pode encontrá-los a partir de <a href="http://rpm.pbone.net/">rpm.pbone.net</a> ou através do site oficial do software: <a href="http://www.insecure.org/nmap/">www.insecure.org/nmap/</a>.</p>
<p>Esses são os dois pacotes necessários para a utilização  do NMAP, para instalarmos utilizaremos os seguintes comando:</p>
<p><strong># rpm -ivh nmap-3.50-3.i386.rpm<br />
# rpm -ivh nmap-frontend-3.50-3.i386.rpm </strong></p>
<p>Pronto, depois disto já estaremos com o nosso programa  instalado e para que tenhamos certeza disso, vamos usar  os comandos abaixo para verificar:</p>
<p><strong>$ rpm -q nmap<br />
$ rpm -q nmap-frontend</strong></p>
<p>Se obtivermos uma saída mostrando a versão do pacote,  pimba!!! Nosso pacote está instado.</p>
<p>Depois de passar por essa etapa vamos agora para sua sintaxe de  utilização. Vale lembrar que ele não possui daemon e com isso  não precisamos ativar nenhum serviço.</p>
<p>Sintaxe:</p>
<p><em>nmap &lt;opção&gt; NET/HOST</em></p>
<h1>Opções do NMAP</h1>
<p>Opções do NMAP</p>
<ul>
<li> -sP =&gt; Essa opção envia um pacote ICMP Ping Scan, que é usado para encontrar um host na rede.</li>
</ul>
<p>Exemplo:</p>
<p><strong># nmap -sP 10.100.102.39/24</strong></p>
<p>OBS: O /24 é referente a máscara de rede.</p>
<ul>
<li> -sU =&gt; Essa opção  determina quais portas UDP estão ativas.</li>
</ul>
<p>Exemplo:</p>
<p><strong># nmap -sU 10.100.102.39</strong></p>
<p>Podemos colocar também um número de rede.</p>
<ul>
<li> -sS =&gt; Essa opção já e mais aprimorada, além de mandar  o pacote e esperar uma confirmação, no meio da conexão ele a  interrompe, com isso ele consegue burlar algumas sistemas de  proteção. O -sS procura por portas do tipo TCP.</li>
</ul>
<p>Exemplo:</p>
<p><strong># nmap -sS 10.100.102.39</strong></p>
<p>A saída deste comando irá lhe mostrar as portas abertas e os seus respectivos serviços que estão rodando.</p>
<ul>
<li> -sT =&gt; Similar a opção -sS, só que ela tem uma maior garantia de sucesso, ou seja, ela é melhor.</li>
</ul>
<h1>Enganando um firewall</h1>
<p>O NMAP também pode burlar os firewalls que são configurados para  descartar os pedidos de conexões de outras redes, como já foi comentado  no início.</p>
<p>Para isso mudaremos a opção -D, que na verdade vai camuflar seu IP e com isso conseguiremos fazer nossa varredura.</p>
<p>Essa opção será utilizada em conjunto com as outras vindo a frente das demais. Exemplo:</p>
<p><strong># nmap -sS 10.100.102.39 -D 10.100.102.113,200.192.35.6</strong></p>
<p>Onde:</p>
<ul>
<li> 10.100.102.39 é o IP o qual vou fazer a verificação.</li>
<li> 10.100.102.113 é o meu IP é.</li>
<li> 200.192.35.6 é um IP qualquer que escolher para que camufle o meu.</li>
</ul>
<p>Usando essa opção associada com as outras temos uma das melhores buscas por portas possível.</p>
<h1>Examinado portas específicas</h1>
<p>Com isso podemos examinar determinadas portas em um determinado IP ou rede. Veja um exemplo:</p>
<p><strong># nmap -sT -p 22,23,110 10.100.102.37</strong></p>
<p>Onde:</p>
<ul>
<li> 22,23,110 =&gt; portas desejadas.</li>
<li> 10.100.102.37 =&gt; IP ou rede de destino.</li>
</ul>
<p>Usando isso associado às opções citadas e um bom conhecimento de  portas, podemos conseguir bons resultados!</p>
<h1>Scaneando faixas de IPs</h1>
<p>Em uma rede podemos querer apenas fazer uma varredura em alguns IPs, ou  seja, em uma faixa de IPs específica e isso e extremamente possível.</p>
<p>Para scanearmos uma determinada faixa de IPs usamos o seguinte comando:</p>
<p><strong># nmap -sX -p 22,23,110 10.100.*.1-12</strong></p>
<p>A opção &#8220;-sX&#8221; nos permite especificar uma determinada faixa de IPs. O  comando acima fará uma varredura em todas as redes de prefixo &#8220;10.100&#8243; e  em cada rede buscará apenas nos IPs de 1 à 12.</p>
<h1>Identificando o sistema operacional</h1>
<p>Sabemos que a vulnerabilidade está associada ao sistema operacional,  pois cada um tem sua particularidade, por isso é importante saber qual é  o sistema operacional de uma máquina em determinadas situações.</p>
<p>Para descobrir detalhes sobre o sistema operacional, usamos:</p>
<p><strong># nmap -sX -O IP/HOST</strong></p>
<p>A opção &#8220;-O&#8221; pode ser associada a qualquer outra do NMAP.</p>
<p>Teremos assim uma descrição do sistema operacional em questão.</p>
<h1>Resumo</h1>
<p>Como foi visto nesse artigo, o <em>NMAP</em> é uma ótima ferramenta de detecção que nos traz muitas opções de uso.</p>
<p>O software em geral é usado por administradores de redes para que possa  ser feita uma boa análise contra invasões e prevenções das mesmas.</p>
<p>O NMAP é útil para vários tipos de tarefas e recomendado para qualquer um que tenha contato em modo geral com redes.</p>
<p>Esse artigo trata do conceito usado pelas ferramentas de detecção e faz  um tour pelas principais funcionalidades do NMAP. Dentre elas podemos  citar: varreduras de rede, identificação de portas abertas,  identificação de sistema operacional, camunflagem de IP dentre outras.</p>
<div><strong>Por:</strong> Bruno Lima Queiroz</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 2238px; width: 1px; height: 1px; overflow: hidden;">
<h1>Scaneando faixas de IPs</h1>
<p>Em uma rede podemos querer apenas fazer uma varredura em alguns IPs, ou  seja, em uma faixa de IPs específica e isso e extremamente possível.</p>
<p>Para scanearmos uma determinada faixa de IPs usamos o seguinte comando:</p>
<p><strong># nmap -sX -p 22,23,110 10.100.*.1-12</strong></p>
<p>A opção &#8220;-sX&#8221; nos permite especificar uma determinada faixa de IPs. O  comando acima fará uma varredura em todas as redes de prefixo &#8220;10.100&#8243; e  em cada rede buscará apenas nos IPs de 1 à 12.</p>
<h1>Identificando o sistema operacional</h1>
<p>Sabemos que a vulnerabilidade está associada ao sistema operacional,  pois cada um tem sua particularidade, por isso é importante saber qual é  o sistema operacional de uma máquina em determinadas situações.</p>
<p>Para descobrir detalhes sobre o sistema operacional, usamos:</p>
<p><strong># nmap -sX -O IP/HOST</strong></p>
<p>A opção &#8220;-O&#8221; pode ser associada a qualquer outra do NMAP.</p>
<p>Teremos assim uma descrição do sistema operacional em questão.</p>
</div>



<p>No related posts.</p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/09/04/ferramentas-de-deteccao-e-nmap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uma MySQL Performance Dica Tem de ver</title>
		<link>http://blog.deserv.info/2010/08/31/uma-mysql-performance-dica-tem-de-ver/</link>
		<comments>http://blog.deserv.info/2010/08/31/uma-mysql-performance-dica-tem-de-ver/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 16:56:27 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Perfomance MySQL]]></category>
		<category><![CDATA[Tunning Mysql]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=421</guid>
		<description><![CDATA[Eu corro cerca de vinte sites, anteriormente repartidas por duas contas de hospedagem compartilhada. No mês passado, meus anfitriões, tanto de forma independente fechar-me no chão por mais de utilização da CPU. Muito justo, eu não acho que eu estava abusando das contas, mas eu não faço as regras. O preço era de direita e [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/23/gerando-log-das-queries-lentas-do-mysql/' rel='bookmark' title='Permanent Link: Gerando log das &#8220;queries&#8221; lentas do MySQL'>Gerando log das &#8220;queries&#8221; lentas do MySQL</a> <small>Primeiramente verifique se a variável que gera o log está...</small></li>
<li><a href='http://blog.deserv.info/2010/01/17/alterando-a-senha-do-usuario-root-no-mysql/' rel='bookmark' title='Permanent Link: Alterando a senha do usuário root no MySQL'>Alterando a senha do usuário root no MySQL</a> <small>Algumas vezes já me deparei com a dificuldade de tentar...</small></li>
<li><a href='http://blog.deserv.info/2010/02/01/scripts-de-conexao-ao-mysql-%e2%80%93-php/' rel='bookmark' title='Permanent Link: Scripts de conexão ao MySQL – PHP'>Scripts de conexão ao MySQL – PHP</a> <small>Existem funções no PHP específicas para conexão ao servidor e...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Eu corro cerca de vinte sites, anteriormente repartidas por duas  contas de hospedagem compartilhada. No mês passado, meus anfitriões,  tanto de forma independente fechar-me no chão por mais de utilização da  CPU. Muito justo, eu não acho que eu estava abusando das contas, mas eu  não faço as regras. <span id="more-421"></span></p>
<p>O preço era de direita e um pouco mais de US $  100 por mês eu tenho um servidor bom com 2 GB de memória, 500GB de banda  mensal, uma CPU rápida todo o meu ego, a abusos como eu achar melhor.</p>
<p>Fast forward to UFC 77. Você vê que eu executar um web site que faz  previsões e os resultados UFC UFC. Na noite de luta, o site pode ficar  bastante movimentado, o meu anterior, alta foi de 18.000 visitantes nos 3  ou mais horas que as brigas ocorrem. Minha conta de hospedagem  compartilhada nunca tive um problema com esta carga, pelo menos não  tanto quanto eu poderia dizer. No entanto, com o UFC 77 na minha conta  de hospedagem dedicada de novo o meu servidor atingiu uma parede de  tijolos. A CPU estava em 100% e houve 200 processos apache todos  competindo para o CPU e memória disponível. Imediatamente comecei a  procurar razões e mais importante de soluções. Três dias depois, eu acho  que a maioria das minhas respostas.</p>
<p>É importante saber que o Go  Daddy não houve culpa, eu perguntei para uma caixa com especificações  determinadas, e que é exatamente o que eles me deram, completo com todos  os softwares que eles disseram. MySQL, PHOP 4.3.9 e Apache 2.0.52.  Então comecei a procurar (quando o servidor se acalmou) com o que estava  acontecendo quando um usuário requisitou uma página. A primeira coisa  que eu notei foi que o processo apache corrente levaria <a title="Conselhos  relacionado a tag cerca" href="http://www.compute-rs.com/pt/termo-cerca-t-0.htm">cerca</a> de 5% da CPU, eu não prestar atenção  a quanto tempo ele correu. A próxima coisa que eu notei foi que o MySQL  também aproveita CPU significativo, mesmo que apenas por um curto  período de tempo. É importante saber que, durante o UFC 77 MySQL estava  levando <a title="Conselhos relacionado a tag cerca" href="http://www.compute-rs.com/pt/termo-cerca-t-0.htm">cerca</a> de 50% da CPU  durante todo o período ocupado. Tempo para procurar algumas otimizações.</p>
<p>Para o meu site, onde existem 20.000 visitantes em 3 horas e  talvez 10 atualizações durante esse tempo, o cache seria, obviamente,  ser útil. Notei pesquisar na web que o Apache tem <a title="Conselhos  relacionado a tag cerca" href="http://www.compute-rs.com/pt/termo-cerca-t-0.htm">cerca</a> de cache e ainda melhor alguns cache  min, no entanto, não se considera produção pronta no 2.0.52 build que  eu tenho, por isso, descartada a idéia bastante rápido. Eu entretanto  notar algumas coisas quando eu olhei para otimizações MySQL.</p>
<p>A  otimização do MySQL mais importante que eu encontrei é a opção  query_cache_size. Você vê, o MySQL tem esse conceito de cache de  consulta, aqui está uma explicação simples. Se eu fizer uma consulta  simples, digamos</p>
<p>Customer_name SELECT cliente onde  customer_id&gt; 10 (eu sei, uma pergunta boba)</p>
<p>Geralmente, o  banco passa por toda a sua magia e devolve o resultado conjunto de todos  os nomes de clientes que o id são superiores aos 10. Para esta consulta  não tomaria muito tempo, mas quanto mais complexa a consulta a mais que  seria necessário. No entanto, com o MySQL cache de consulta, o  resultado dessa consulta seria mantida na memória, juntamente com a  consulta em si, o que significa que da próxima vez que a mesma consulta  foi executar o banco de dados seria apenas verificar se há tabelas na  consulta ter sido alterado e, em seguida procurar o resultado na memória  e devolvê-lo. Isto é muito mais rápido. O MySQL tem consulta cache  ativado por padrão, mas a variável query_cache_size é definido como 0,  essencialmente desactivar a funcionalidade. Para ativá-la você deve  fazer:</p>
<blockquote><p>query_cache_size = 64M em my.cnf</p></blockquote>
<p>Nota: Eu também  aumentou minha query_cache_limit de 4M e meu thread_cache_size a 384. Há  muitas outras opções MySQL que você pode definir para melhorar o  desempenho, procurar um bom livro MySQL ou talvez eu vou postar algumas  delas no meu depósito de fonte aberta blog at  [http://www.open-source-depot.com / blog].</p>
<p>Depois de configurar  as opções no my.cnf você precisará reiniciar o MySQL, sendo que eu sou  do tipo impaciente e não gosto de reiniciar o processo, fui para a linha  de comando do MySQL e definir as opções globais. Por alguma razão os  64M não trabalho para mim lá, então eu usei o expandido (bytes) version</p>
<p>ou seja, <a title="Conselhos relacionado a tag mysql" href="http://www.compute-rs.com/pt/termo-mysql-t-0.htm">mysql</a>&gt; SET GLOBAL  query_cache_size = 60000000;</p>
<p>para ver o que está definido, faça  um:</p>
<blockquote><p><a title="Conselhos relacionado a tag mysql" href="http://www.compute-rs.com/pt/termo-mysql-t-0.htm">mysql</a>&gt; SHOW VARIABLES  LIKE have_query_cache &#8216;;</p></blockquote>
<p>Nota: Você precisa dizer ao MySQL para  &#8220;ir&#8221; com ag na próxima linha.</p>
<p>Agora eu tentei bater o meu blog  um pouco e descobri que nunca a CPU para o MySQL foi mais de 1 ou 2  (exceto para o primeiro hit), muito muito legal. Eu devo fazer uma nota  que eu encontrei algumas referências sobre a rede onde o cache de  consulta no MySQL realmente degrada o desempenho de determinadas  circunstâncias. Eu diria que em um ambiente de atualização pesados (um  carrinho de compras, por exemplo) que a sobrecarga do cache pode  outweight é usefullness, mas para sites como mina onde é 99,9% da  leitura e escrita de apenas 1% de cache de consulta é impressionante.  Existem outras otimizações MySQL que eu quero olhar, como cache de  tabela e talvez até mesmo persistente connections, mas um passo de cada  vez. Eu quero ver que tipo de diferença esta mudança um vai fazer. Eu  estou esperando por coisas boas. Meu próximo passo é o cache do PHP, mas  vou guardar isso para outro artigo.</p>
<p>Fonte: http://www.compute-rs.com</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/23/gerando-log-das-queries-lentas-do-mysql/' rel='bookmark' title='Permanent Link: Gerando log das &#8220;queries&#8221; lentas do MySQL'>Gerando log das &#8220;queries&#8221; lentas do MySQL</a> <small>Primeiramente verifique se a variável que gera o log está...</small></li>
<li><a href='http://blog.deserv.info/2010/01/17/alterando-a-senha-do-usuario-root-no-mysql/' rel='bookmark' title='Permanent Link: Alterando a senha do usuário root no MySQL'>Alterando a senha do usuário root no MySQL</a> <small>Algumas vezes já me deparei com a dificuldade de tentar...</small></li>
<li><a href='http://blog.deserv.info/2010/02/01/scripts-de-conexao-ao-mysql-%e2%80%93-php/' rel='bookmark' title='Permanent Link: Scripts de conexão ao MySQL – PHP'>Scripts de conexão ao MySQL – PHP</a> <small>Existem funções no PHP específicas para conexão ao servidor e...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/31/uma-mysql-performance-dica-tem-de-ver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integração Apache =&gt; Tomcat</title>
		<link>http://blog.deserv.info/2010/08/12/integracao-apache-tomcat/</link>
		<comments>http://blog.deserv.info/2010/08/12/integracao-apache-tomcat/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 20:45:02 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[TomCat]]></category>
		<category><![CDATA[Apache2]]></category>
		<category><![CDATA[JRE]]></category>
		<category><![CDATA[Mod_jk]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=415</guid>
		<description><![CDATA[Integrando o Apache com o TOMCAT para que as páginas estáticas sejam executadas pelo Apache e as em JSP pelo contêiner TOMCAT, além do direcionamento das aplicações via APACHE, sendo o WebServer de acesso para as aplicações que estão no TOMCAT. Conceito Integração APACHE/TOMCAT vou dividir em duas partes e abordar a primeira delas aqui. [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/' rel='bookmark' title='Permanent Link: Integração simples do Apache 2 com Tomcat 5'>Integração simples do Apache 2 com Tomcat 5</a> <small>Tutorial Basico de integração do Apache 2 com Tomcat. Instalando...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
<li><a href='http://blog.deserv.info/2010/01/22/tutorial-tomcat-instalacao-e-configuracao-basica/' rel='bookmark' title='Permanent Link: Tutorial Tomcat &#8211; Instalação e Configuração Básica'>Tutorial Tomcat &#8211; Instalação e Configuração Básica</a> <small>Nota: Na revisão 13 deste tutorial, o conteúdo foi bastante...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Integrando o Apache com o TOMCAT para que as páginas estáticas sejam  executadas pelo Apache e as em JSP pelo contêiner TOMCAT, além do  direcionamento das aplicações via APACHE, sendo o WebServer de acesso  para as aplicações que estão no TOMCAT. <span id="more-415"></span></p>
<div>
<h1>Conceito</h1>
<div>
<p>Integração <em>APACHE</em>/<em>TOMCAT</em> vou dividir em duas partes e  abordar a primeira delas aqui. São elas a integração com apenas  &#8220;simples&#8221;, a qual as páginas ESTÁTICAS serão executadas pelo APACHE  (ganho de performance) e as páginas dinâmicas (JSP) executadas pelo  contêiner TOMCAT.</p>
<p>Além dessa funcionalidade, nessa primeira integração conseguimos  &#8220;esconder&#8221; as portas do TOMCAT, já que sua aplicação será chamada por  uma URL na porta 80 e o APACHE sim, irá pegar sua aplicação no TOMCAT e  mostrar ela.</p>
<p>Temos também a segunda integração do APACHE/TOMCAT, que consiste nas  vantagens da primeira acrescidas da possibilidade de se realizar  LOADBALANCER entre dois TOMCATs usando o APACHE como o WebServer que irá  gerenciar essa carga e dividirá ela, porém esse assunto não será  abortado aqui.</p>
<h1>Pré-requisitos</h1>
<p>Iremos instalar os seguintes serviços em um servidor LINUX/UNIX:</p>
<ul>
<li> OPENSSL</li>
<li> APACHE</li>
<li> TOMCAT</li>
<li> TOMCAT CONECTOR(MOD_JK)</li>
<li> JDK+JRE(JAVA)</li>
</ul>
</div>
<div>
<h1>Instalando OpenSSL, Apache, Tomcat e Java</h1>
<h1>OpenSSL</h1>
<p>Baixar última versão do SOURCE em <a href="http://www.openssl.org/">www.openssl.org</a>.</p>
<p>Consideremos que estamos usando a versão 0.98e do OPENSSL, que está em  um diretório de instalação de nosso servidor, vamos descompactar e  instalar o mesmo:</p>
<p><strong># tar -xvf openssl-0.9.8e.tar.tar<br />
# cd openssl-0.9.8e<br />
# ./configure &#8211;prefix=/usr/local/ssl<br />
# make<br />
# make install</strong></p>
<h1>Apache</h1>
<p>Baixar o último SOURCE em  <a href="http://www.apache.org/">www.apache.org</a>.</p>
<p>Consideremos que estamos usando a versão 2.2.6 do APACHE, que está em um  diretório de instalação de nosso servidor, vamos descompactar e  instalar o mesmo:</p>
<p><strong># tar -xvf httpd-2.2.6.tar.gz<br />
# cd httpd-2.2.6<br />
# ./configure &#8211;prefix=/usr/local/apache2 &#8211;enable-ssl=/usr/local/ssl<br />
# make<br />
# make install<br />
# /usr/local/apache2/bin/apachectl start</strong></p>
<p>Pronto, o Apache está instalado com suporte a SSL no diretório padrão que definimos: /usr/local/apache2.</p>
<h1>Tomcat e Java</h1>
<p>Baixar o último SOURCE em <a href="http://tomcat.apache.org/">tomcat.apache.org/</a>.</p>
<p>Consideremos que estamos usando a versão 6.0.14 do TOMCAT, que está em  um diretório de instalação que iremos usar ele, pois o TOMCAT só  precisamos descompactar e não compilar, como os demais.</p>
<p>Usei como padrão o diretório /usr/local para instalação do TOMCAT, por  convenção, deixo o nome do diretório com a versão e crio um LINK para  ele com o nome &#8220;apache-tomcat&#8221;, o que me permite mudar de versão sem ter  que alterar demais arquivos de configurações do mesmo ou de terceiros.</p>
<p><strong># cd /usr/local<br />
# tar -xvf apache-tomcat-6.0.14.tar.gz<br />
#  ln -s apache-tomcat apache-tomcat-6.0.14/<br />
# vi /etc/profile</strong></p>
<p>Adicionar as seguintes linhas no final do arquivo:</p>
<div>
<p><span style="color: #004080;">#Tomcat</span></p>
<p>CATALINA_HOME=/usr/local/apache-tomcat<br />
TOMCAT_HOME=/usr/local/apache-tomcat<br />
export CATALINA_HOME TOMCAT_HOME CLASSPATH</p>
</div>
<p>Agora iremos instalar o JAVA, baixe a última versão do BIN JDK no site  da SUN e coloque do diretório que iremos instalar ele, no caso  /usr/local. Como ele será instalado com o &#8220;nome-versão&#8221;, também iremos  criar um LINK com o nome JAVA apontando para ele, o que também nos  permite trocar de versão sem maiores problemas.</p>
<p><strong># chmod +x jdk-1_5_0_12-linux-i586.bin<br />
# ./ jdk-1_5_0_12-linux-i586.bin </strong><br />
(seguir orientações da instalação &#8211; padrão, só YES e ENTER)</p>
<p><strong># ln -s java jdk1.5.0_12/<br />
# vi /etc/profile</strong></p>
<p>Adicionar as seguintes linhas no final do arquivo:</p>
<div>
<p><span style="color: #004080;">#Java</span></p>
<p>JAVA_HOME=&#8221;/usr/local/java&#8221;<br />
JRE_HOME=&#8221;/usr/local/java/jre&#8221;<br />
CLASSPATH=&#8221;$JAVA_HOME:$JAVA_HOME/lib:$JRE_HOME/lib:.&#8221;<br />
MANPATH=&#8221;$MANPATH:$JAVA_HOME/man&#8221;<br />
JAVA_DOC=&#8221;$JAVA_HOME/docs&#8221;<br />
PATH=&#8221;$PATH:$JAVA_HOME/bin:$JRE_HOME/bin&#8221;<br />
export JAVA_HOME JRE_HOME CLASSPATH MANPATH JAVA_DOC PATH</p>
</div>
<p><strong># /usr/local/apache-tomcat/bin/catalina.sh start</strong></p>
<p>Pronto, o TOMCAT foi instalado configurado e iniciado juntamente com o suporte ao JAVA.</p>
</div>
<div>
<h1>Tomcat conector &#8211; MOD_JK</h1>
<p>Consideremos que estamos usando a versão 1.2.25 do Tomcat-Conector, que  está em um diretório de instalação de nosso servidor, vamos descompactar  e instalar o mesmo:</p>
<p><strong># tar -xvf  tomcat-connectors-1.2.25-src.tar.gz<br />
# cd  tomcat-connectors-1.2.25-src<br />
# cd native/<br />
# ./configure  &#8211;with-apxs=/usr/local/apache2/bin/apxs<br />
# make<br />
# make install<br />
# vi /usr/local/apache2/conf/httpd.conf</strong></p>
<p>Acrescentar a linha abaixo:</p>
<div>LoadModule jk_module modules/mod_jk.so</div>
<p><strong># /usr/local/apache2/bin/apachectl restart</strong></p>
<p>Pronto, o MOD_JK foi instalado e configurado para que o APACHE o  carregue em sua inicialização. O MOD_JK será o responsável pela  comunicação entre o APACHE e o TOMCAT via o protocolo EJB3 do TOMCAT.</p>
<p>Pronto, agora iremos configurar um linha em nosso TOMCAT e dois arquivos  de configurações que iremos criar no CONF do APACHE e nossa integração  ficou pronta.</p>
</div>
<div>
<h1>Configuração no TOMCAT</h1>
<p>Iremos mudar apenas o arquivo <em>server.xml</em> dentro de  /usr/local/apache-tomcat/conf/. Iremos definir um NOME para o TOMCAT,  esse nome será buscado pelo MOD_JK e servirá para passadas de  parâmetros.</p>
<p><strong># vi /usr/local/apache-tomcat/conf/server.xml</strong></p>
<p>Procurar por:</p>
<p>&lt;!&#8211; You should set jvmRoute to support load-balancing via AJP ie :<br />
&lt;Engine name=&#8221;Standalone&#8221; defaultHost=&#8221;localhost&#8221; jvmRoute=&#8221;jvm1&#8243;&gt;<br />
&#8211;&gt;<br />
&lt;Engine name=&#8221;Catalina&#8221; defaultHost=&#8221;localhost&#8221;&gt;</p>
<p>Iremos adicionar a propriedade &#8220;jvmRoute=&#8221;tomcat1&#8243;&#8221; e ficará assim:</p>
<div>&lt;!&#8211; You should set jvmRoute to support load-balancing via AJP ie :<br />
&lt;Engine name=&#8221;Standalone&#8221; defaultHost=&#8221;localhost&#8221; jvmRoute=&#8221;jvm1&#8243;&gt;<br />
&#8211;&gt;<br />
&lt;Engine  <strong>jvmRoute=&#8221;tomcat1&#8243;</strong> name=&#8221;Catalina&#8221; defaultHost=&#8221;localhost&#8221;&gt;</div>
<p>Reiniciar o TOMCAT:</p>
<p><strong># /usr/local/apache-tomcat/bin/catalina.sh</strong></p>
</div>
<div>
<h1>Configuração no Apache</h1>
<p>Vamos criar dois arquivos, um para configurarmos a comunicação com o  TOMCAT e outro para configurações básicas do MOD_JK e definição de quais  serão os &#8220;CONTEX&#8221; do TOMCAT que serão executados pelo APACHE.</p>
<p>Arquivo <em>workers.properties</em>:</p>
<p><strong># vi workers.properties</strong></p>
<p>Adicionar o seguinte conteúdo ao arquivo criado:</p>
<div><span style="color: #004080;">#</span><br />
<span style="color: #004080;"># workers.properties</span><br />
<span style="color: #004080;">#</span></p>
<p><span style="color: #004080;"># In Unix, we use forward slashes:</span><br />
ps=/</p>
<p><span style="color: #004080;"># list the workers by name</span></p>
<p>worker.list=tomcat1(nome configurado no arquivo server.xml do TOMCAT)</p>
<p><span style="color: #004080;"># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span><br />
<span style="color: #004080;"># First tomcat server</span><br />
<span style="color: #004080;"># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span><br />
worker.tomcat1.type=ajp13<br />
worker.tomcat1.host=localhost(nome do servidor onde temos o tomcat)<br />
worker.tomcat1.port=8009<br />
worker.tomcat1.lbfactor=50<br />
worker.tomcat1.cachesize=10<br />
worker.tomcat1.cache_timeout=500<br />
worker.tomcat1.socket_keepalive=1<br />
worker.tomcat1.socket_timeout=300</p>
<p><span style="color: #004080;"># Specify the size of the open connection cache.</span><br />
<span style="color: #004080;">#worker.tomcat1.cachesize</span></p>
<p><span style="color: #004080;">#</span><br />
<span style="color: #004080;"># Specifies the load balance factor when used with</span><br />
<span style="color: #004080;"># a load balancing worker.</span><br />
<span style="color: #004080;"># Note:</span><br />
<span style="color: #004080;">#  &#8212;-&gt; lbfactor must be &gt; 0</span><br />
<span style="color: #004080;">#  &#8212;-&gt; Low lbfactor means less work done by the worker.</span><br />
worker.tomcat1.lbfactor=100 //Definindo que toda a carga será usada apenas para um TOMCAT, é o nosso caso.</p>
<p><span style="color: #004080;">#</span><br />
<span style="color: #004080;"># END workers.properties</span></p>
</div>
<p>É um arquivo bem simples onde definimos o &#8220;nome&#8221; do TOMCAT para  integração via MOD_JK, &#8220;worker.list=tomcat1&#8243; e demais parâmetros para  configuração de conexão, onde devemos alterar de acordo com nosso  ambiente.</p>
<p>Arquivo <em>tomcat.conf</em>:</p>
<p>Adicionar o seguinte conteúdo ao arquivo criado:</p>
<div>
<p>JkWorkersFile /usr/local/apache2/conf/workers.properties</p>
<p>JkLogFile /usr/local/apache2/logs/mod_jk.log</p>
<p>JkLogLevel info</p>
<p>JkLogStampFormat &#8220;[%a %b %d %H:%M:%S %Y] &#8221;</p>
<p>JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories</p>
<p>JkRequestLogFormat &#8220;%w %V %T&#8221;</p>
<p>JkMount /examples/servlet/* tomcat1<br />
JkMount /examples/* tomcat1<br />
JkMount /examples/jsp/* tomcat1<br />
JkMount /*.jsp tomcat1<br />
JkMount /aplicacao1/* tomcat1</p>
</div>
<p>O que destaco são apenas as linhas com &#8220;JKMount&#8221;, que é o diretório  (CONTEX ROOT) do TOMCAT, é o nome do DIR que você acessa sua aplicação.</p>
<p>Vamos adicionar nosso arquivo &#8220;tomcat.conf&#8221; no &#8220;httpd.conf&#8221; do Apache:</p>
<p><strong># vi /usr/local/apache2/conf/httpd.conf </strong></p>
<p>Adicionar a seguinte linha no arquivo:</p>
<div>Include conf/tomcat.conf</div>
<p>Vamos reiniciar o APACHE:</p>
<p><strong># /usr/local/apache2/bin/apachectl restart</strong></p>
<h1>Testando integração</h1>
<p>Agora ao invés de acessarmos o endereço do TOMCAT, Ex.:</p>
<p>http://localhost:8080/aplicacao1</p>
<p>Iremos acessar:</p>
<p>http://localhost/aplicacao1</p>
<p>Ele irá mostrar a aplicação que está no TOMCAT e aplicará suas melhorias.</p>
<p>Obs.: Para os diretórios que não estiverem no TOMCAT.CONF, ele irá procurar no DOCUMENT ROOT de nosso APACHE.</p>
</div>
<div><strong>Por:</strong> Bruno Lima Queiroz</div>
</div>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/' rel='bookmark' title='Permanent Link: Integração simples do Apache 2 com Tomcat 5'>Integração simples do Apache 2 com Tomcat 5</a> <small>Tutorial Basico de integração do Apache 2 com Tomcat. Instalando...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
<li><a href='http://blog.deserv.info/2010/01/22/tutorial-tomcat-instalacao-e-configuracao-basica/' rel='bookmark' title='Permanent Link: Tutorial Tomcat &#8211; Instalação e Configuração Básica'>Tutorial Tomcat &#8211; Instalação e Configuração Básica</a> <small>Nota: Na revisão 13 deste tutorial, o conteúdo foi bastante...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/12/integracao-apache-tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando o Slax</title>
		<link>http://blog.deserv.info/2010/08/04/instalando-o-slax/</link>
		<comments>http://blog.deserv.info/2010/08/04/instalando-o-slax/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 17:56:09 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Instalação]]></category>
		<category><![CDATA[Live-CD]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Slax]]></category>
		<category><![CDATA[Slax Live-CD]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=409</guid>
		<description><![CDATA[O Slax é um live-CD baseado no Slackware, uma boa forma de conhecer a distribuição sem precisar passar pela etapa inicial de configuração e configuração do sistema. O Slax roda diretamente a partir do CD-ROM e inclui um conjunto de scripts que automatizam a configuração do sistema, detectando o vídeo, som e outros periféricos. O [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/' rel='bookmark' title='Permanent Link: Instalando um servidor Jabber (Jive) para comunicação Instatânea'>Instalando um servidor Jabber (Jive) para comunicação Instatânea</a> <small>Neste tutorial eu irei ensinar como instalar um servidor de...</small></li>
<li><a href='http://blog.deserv.info/2010/01/02/instalando-e-configurando-o-interbase-server/' rel='bookmark' title='Permanent Link: Instalando e configurando o Interbase Server'>Instalando e configurando o Interbase Server</a> <small>Abaixo vai um tutorial simples e prático para instalação do...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<div>O Slax é um live-CD baseado no Slackware, uma  boa forma de conhecer a distribuição sem precisar passar pela etapa inicial de configuração e configuração do sistema. O Slax roda diretamente a partir do CD-ROM e inclui um conjunto de scripts que automatizam a configuração do sistema, detectando o vídeo, som e outros periféricos. <span id="more-409"></span></div>
<p>O sistema de autodetecção do Slax não é tão desenvolvido quanto o de  distribuições como o Ubuntu, Knoppix ou Mandriva, mas ajuda bastante.</p>
<p>Você pode baixar a última versão no: <a href="http://slax.linux-live.org/">http://slax.linux-live.org/</a>.</p>
<p>Além do &#8220;Slax Standard Edition&#8221;, que é a versão principal, que abordo aqui, estão disponíveis algumas versões específicas, como o KillBill (que vem com o wine pré-instalado) e o PopCorn (uma versão reduzida, que pode ser instalado num pendrive de 128 MB).</p>
<p>O Slax configura o vídeo durante o boot, mas não abre o modo gráfico automaticamente. Na tela de login, você deve se logar como root, senha toor e rodar o comando &#8220;startx&#8221; para abrir o KDE. Você pode também usar a opção &#8220;slax gui&#8221; na tela de boot, para que ele abra o KDE automaticamente, como no Kurumin.</p>
<p>Embora seja raro, existem casos em que o sistema trava na hora do boot por causa de problemas com a detecção de algum periférico. Nestes casos, você pode experimentar as opções &#8220;slax noagp&#8221;, &#8220;slax nopcmcia&#8221;, &#8220;slax nodma&#8221; ou &#8220;slax acpi=off&#8221;.</p>
<p>Ao abrir o modo gráfico, você verá uma versão personalizada do KDE, com um visual simpático e um menu limpo, com poucos programas instalados por padrão. Devido à simplicidade, o tempo de boot também é perceptivelmente mais baixo.</p>
<p style="text-align: center;"><a href="http://blog.deserv.info/wp-content/uploads/2010/08/img-938c2356.png"><img class="size-full wp-image-411 aligncenter" title="img-938c2356" src="http://blog.deserv.info/wp-content/uploads/2010/08/img-938c2356.png" alt="" width="640" height="482" /></a></p>
<p>Para configurar o som, use o comando &#8220;alsaconf&#8221;, e para configurar a rede, use o &#8220;netconfig&#8221; (o mesmo script usado no Slackware). Se você acessa via ADSL com autenticação (PPPoE), use o comando &#8220;adsl-setup&#8221; para configurar a conexão e depois o &#8220;adsl-start&#8221; para conectar. Estes dois comandos podem ser encontrados também no Mandriva, Fedora e em outras distribuições derivadas do Red Hat.</p>
<p>{mospagebreak}</p>
<p>O Slax não inclui suporte a nenhum softmodem, mas se por acaso você utilizar um hardmodem, pode conectar usando o Kppp, como em outras distribuições.</p>
<p>O suporte a placas wireless também não conta com todos os drivers disponíveis mas ele já vem com o Ndiswrapper pré-instalado, que permite configurar muitas placas usando os drivers do Windows. Você pode ver dicas de como configurar sua placa usando o Ndiswrapper no Guia Modems e placas wireless no Linux: <a href="http://www.guiadohardware.net/guias/05/">http://www.guiadohardware.net/guias/05/</a></p>
<p>Em resumo, você primeiro carrega o arquivo .inf do driver do Windows XP, com o comando &#8220;ndiswrapper -i&#8221;, como em:</p>
<p><em># ndiswrapper -i neti2220.inf</em></p>
<p>&#8230; e, em seguida, ativa o Ndiswrapper usando o comando:</p>
<p><em># modprobe ndiswrapper</em></p>
<p>Com a placa ativa, você pode configurar os parâmetros da rede wireless e monitorar a conexão através do Kwifimanager, que está dentro do menu internet.</p>
<p>O Slax não oferece nenhuma opção de alterar o particionamento durante a instalação. Você precisa criar as partições previamente, usando o cfdisk e formatá-las através do comando &#8220;mkreiserfs&#8221;, como em &#8220;mkreiserfs /dev/hda2&#8243;. Outra opção, é particionar usando um CD do Kurumin, ou o CD de instalação do Mandriva e voltar ao Slax para instalar. Mesmo ao particionar a partir do próprio Slax, usando o cfdisk, é sempre necessário reiniciar, para que o instalador detecte as alterações.</p>
<p>O instalador está disponível no &#8220;Iniciar &gt; System &gt; Slax Installer&#8221;. Ele é provavelmente o instalador mais simples de todas as distribuições que já vi. Você precisa apenas indicar a partição onde o sistema será instalado e no MBR de qual drive o lilo será gravado (caso tenha mais de um). Não existe a opção de instalar o lilo na partição, caso você esteja instalando-o em dual boot com o Windows ou outra distribuição. Ele sempre se gravará na MBR e você precisará configurar o &#8220;/etc/lilo.conf&#8221; para que ele lhe dê a opção de inicializar os outros sistemas instalados.</p>
<p>{mospagebreak}</p>
<p>Existem duas formas de instalação. A opção &#8220;Live&#8221; simplesmente copia o conteúdo do CD para a partição, ocupando apenas 200 MB. Esta opção é mais uma opção para poder dar boot sem usar o CD-ROM do que uma instalação propriamente dita, algo similar a usar a opção &#8220;tohd&#8221; no Kurumin. A opção &#8220;Real&#8221; ocupa quase o triplo de espaço, pois nela os arquivos são realmente descompactados, criando uma instalação real do sistema, onde você pode instalar novos programas e fazer qualquer tipo de alteração.</p>
<p style="text-align: center;"><a href="http://blog.deserv.info/wp-content/uploads/2010/08/img-5220c6e6.png"><img class="aligncenter size-full wp-image-412" title="img-5220c6e6" src="http://blog.deserv.info/wp-content/uploads/2010/08/img-5220c6e6.png" alt="" width="537" height="528" /></a></p>
<p>Mesmo depois de instalado, o Slax continua usando o root como usuário padrão. Enquanto você estiver brincando e explorando o sistema isto é até interessante, pois permite que você mexa onde quiser, sem ser perturbado por problemas com as permissões. Se alguma coisa der errado, basta reinstalar e começar de novo.</p>
<p>Mas, a partir do momento em que você resolver navegar na web ou fazer qualquer trabalho mais sério, o uso do root torna-se um grave problema de segurança por dois motivos: como root você tem permissão para fazer tudo, então acaba sendo muito fácil destruir o sistema e, ao mesmo tempo, abrindo todos os programas como root, fica muito mais fácil explorar brechas de seguranças nos programas para obter acesso à sua máquina remotamente. Esta segunda possibilidade não é tão grande assim, mas vale a pena evitar.</p>
<p>{mospagebreak}</p>
<p>Você pode criar um novo usuário usando o comando adduser, como em:</p>
<p><em># adduser tux</em></p>
<p>São feitas muitas perguntas, que permitem incluir informações diversas no cadastro do usuário (que seriam úteis numa grande rede), mas, no caso de um humilde desktop, as únicas que realmente interessam são o nome em si (login) e a senha.</p>
<p>Depois de instalado, o Slax nada mais é do que uma versão customizada do Slackware. O que você aprender a fazer no Slax pode ser feito também no Slackware e vice-versa.</p>
<p>Um dos grandes atrativos do Slax é ser um sistema bem simples e limpo, com poucos programas instalados por padrão. Isto é uma faca de dois gumes, pois também significa que ao usar o sistema por mais tempo, você acabará precisando investir mais tempo baixando e instalando programas adicionais.</p>
<p>O Slax é compatível com os pacotes da versão correspondente do Slackware. O Slax 5.06, por exemplo, usa os pacotes do Slackware 10.2. Normalmente, a última versão do Slax usa os pacotes da última versão do Slackware.</p>
<p>Você pode instalar programas adicionais a partir dos CDs de instalação (do Slackware) ou ir baixando individualmente os programas desejados a partir de um dos mirrors listados no <a href="http://www.slackware.com/getslack/">http://www.slackware.com/getslack/</a>.</p>
<p>Para instalar o suporte a português do Brasil no KDE, por exemplo, baixe o pacote kde-i18n-pt_BR, que está disponível na pasta &#8220;slackware/kdei/&#8221; do CD ou mirror. Os pacotes do Slackware usam a extensão &#8220;.tgz&#8221;. Junto com cada pacote, existe sempre um arquivo &#8220;.txt&#8221;, com uma descrição curta e um arquivo &#8220;.asc&#8221;, usado pelo instalador para verificar a integridade do pacote principal.</p>
<p>Para instalar o pacote baixado, use o comando &#8220;installpkg&#8221;, seguido pelo nome do pacote, como em:</p>
<p><em># installpkg kde-i18n-pt_BR-3.4.2-noarch-1.tgz</em></p>
<p>Use a tecla TAB para completar o nome do arquivo depois de digitar as primeiras letras. O installpkg é uma ferramenta simples de instalação, que funciona de uma forma similar ao &#8220;dpkg -i&#8221; do Debian. Ele permite instalar pacotes que você já baixou, mas não é capaz de baixar os pacotes por si só, como o apt-get. O installpkg também não checa dependências ao instalar os pacotes: mesmo que exista algum problema, você só saberá depois de tentar abri-lo.</p>
<p>Esta forma simplificada de instalar programas é a principal característica do Slackware. A vantagem é que você literalmente pode fazer o que quiser, sem que ele te perturbe com mensagens de erro e dependências desencontradas. A desvantagem é que ele não faz nada sozinho; a única maneira de descobrir que o pacote x precisa do pacote y para funcionar é pesquisando.</p>
<p>Depois de instalado o pacote, acesse o Painel de Controle do KDE, Regional  &amp; Accessibility &gt; Contry, Region &amp; Language e, dentro dela marque a opção Add Language &gt; Brazil Portuguese. Clique no &#8220;Apply&#8221; e reinicie o KDE para que os aplicativos passem a usar nossa língua.</p>
<p>{mospagebreak}</p>
<p>Para instalar o Gimp, baixe o pacote &#8220;gimp&#8221;, que está na pasta &#8220;slackware/xap&#8221;; para instalar o Firefox, baixe o pacote &#8220;mozilla-firefox&#8221; que está na mesma pasta; e assim por diante. O Slax já vem com o plugin do Flash pré-instalado; experimente instalar também o Java e Real Player, seguindo as instruções do capítulo 5 depois de instalar o Firefox.</p>
<p>Para instalar o OpenOffice 2.0, baixe o pacote para o Slackware, disponível no: <a href="http://www.openoffice.org.br/">http://www.openoffice.org.br/</a> e instale-o usando o comando:</p>
<p><em># installpkg openoffice.org.br-2.0-i586-4.tgz</em></p>
<p>Depois de instalado, você pode completar a instalação do corretor ortográfico e usar as otimizações que vimos no capítulo 5.</p>
<p>O Slackware utiliza uma estrutura de scripts diferente da das outras distribuições. No Debian e na maioria das outras distribuições, você usaria o comando &#8220;/etc/init.d/ssh start&#8221; para inicializar o servidor SSH e permitir que sua máquina possa ser acessada a partir de outros micros da rede local. No Slackware, isso funciona de forma similar, mas os scripts mudam de lugar, vão na pasta &#8220;/etc/rc.d/&#8221;.</p>
<p>Para instalar o servidor SSH no Slax, por exemplo, instale o pacote &#8220;openssh-4.2p1-i486-1.tgz&#8221; que está dentro da pasta &#8220;slackware/n/&#8221; do CD ou mirror de instalação do Slackware. Ao instalar o pacote, será criado o arquivo &#8220;/etc/rc.d/rc.sshd&#8221;, o script que permite inicializá-lo. Para usá-lo, você precisa primeiro transformá-lo num executável, usando o comando:</p>
<p><em># chmod +x /etc/rc.d/rc.sshd</em></p>
<p>E, em seguida, inicializar o servidor SSH, usando o comando:</p>
<p><em># /etc/rc.d/rc.sshd</em></p>
<p>O fato de ser uma distribuição minimalista, com tamanho reduzido e rápida de instalar, faz com que o Slax seja uma forma muito prática de se familiarizar com o Slackware, já que você pode testar a instalação de vários programas, testar várias configurações e reinstalar o sistema rapidamente sempre que alguma coisa der errada.</p>
<p>Fonte: GuiadoHardware.net</p>
<p>Autor: <strong>Carlos  E. Morimoto</strong></p>
<p><strong><br />
</strong></p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/' rel='bookmark' title='Permanent Link: Instalando um servidor Jabber (Jive) para comunicação Instatânea'>Instalando um servidor Jabber (Jive) para comunicação Instatânea</a> <small>Neste tutorial eu irei ensinar como instalar um servidor de...</small></li>
<li><a href='http://blog.deserv.info/2010/01/02/instalando-e-configurando-o-interbase-server/' rel='bookmark' title='Permanent Link: Instalando e configurando o Interbase Server'>Instalando e configurando o Interbase Server</a> <small>Abaixo vai um tutorial simples e prático para instalação do...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/04/instalando-o-slax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando um servidor Jabber (Jive) para comunicação Instatânea</title>
		<link>http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/</link>
		<comments>http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 13:50:36 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Softwares Adicionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Comunicação Instantânea]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JRE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=407</guid>
		<description><![CDATA[Neste tutorial eu irei ensinar como instalar um servidor de comunicação instatânea baseada no protocolo Jabber utilizando o mysql para autenticação, para ser usado dentro de empresas, grupos e etc.

A instalação é bem simples e se for bem seguida, você não terá problemas.

Então deixemos de conversa e vamos logo ao que interessa.


Related posts:<ol><li><a href='http://blog.deserv.info/2010/04/09/como-montar-um-servidor-ntp/' rel='bookmark' title='Permanent Link: Como Montar um Servidor NTP'>Como Montar um Servidor NTP</a> <small>O que é? A grosso modo podemos dizer que o...</small></li>
<li><a href='http://blog.deserv.info/2010/02/20/servidor-web-apache-dicas-e-tutoriais/' rel='bookmark' title='Permanent Link: Servidor web &#8211; Apache &#8211; dicas e tutoriais'>Servidor web &#8211; Apache &#8211; dicas e tutoriais</a> <small>Sobre este documento Versão simplificada do documento em formato texto,...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<h2>Introdução</h2>
<p>Neste tutorial eu irei ensinar como instalar um servidor de comunicação  instatânea baseada no protocolo Jabber utilizando o mysql para  autenticação, para ser usado dentro de empresas, grupos e etc.</p>
<p>A instalação é bem simples e se for bem seguida, você não terá  problemas.</p>
<p>Então deixemos de conversa e vamos logo ao que interessa.<span id="more-407"></span></p>
<p><a id="Sistema_Operacional_Utilizado" name="Sistema_Operacional_Utilizado"></a></p>
<h2>Sistema  Operacional Utilizado</h2>
<ul>
<li>Debian Linux Versão 3.1</li>
</ul>
<p><a id="Softwares_necess.C3.A1rios" name="Softwares_necess.C3.A1rios"></a></p>
<h2>Softwares necessários</h2>
<ul>
<li>Jive Messenger versão 2.1.5 ou superior.</li>
<li>Mysql 3.4 ou superior. Recomendado usar &gt;= 4.1</li>
<li>JRE 1.5 ou superior para linux. Pode ser adquirido no site da  sun.</li>
</ul>
<p><a id="Instala.C3.A7.C3.A3o_e_Configura.C3.A7.C3.A3o" name="Instala.C3.A7.C3.A3o_e_Configura.C3.A7.C3.A3o"></a></p>
<h2>Instalação e Configuração</h2>
<p><a id="Mysql" name="Mysql"></a></p>
<h3>Mysql</h3>
<p>Usando o apt-get ou através de mecanismos da sua distro faça o download e  instalação do mysql. (Não irei ensinar a configurar e instalar o mysql,  para isso existem vários tutoriais na net).</p>
<p><a id="Crie_um_database_chamado_jabber." name="Crie_um_database_chamado_jabber."></a></p>
<h4>Crie  um database chamado jabber.</h4>
<p>Crie uma conta de usuário no mysql ou use a conta do root. Recomendado  não usar o root. Esse usuário deverá ter permissões para se conectar de  qualquer lugar, ou seja, &#8220;%&#8221;.</p>
<p>O motivo: durante a configuração do jabber o mesmo ira acusar erros caso  o usuário que você especificar não estiver conforme eu descrevi.</p>
<p>Você pode tentar limitar o acesso desse usuário permitindo logon somente  local após a instalação. Comigo não funcionou.</p>
<p><a id="JRE_1.5" name="JRE_1.5"></a></p>
<h3>JRE  1.5</h3>
<p>No site da Sun<a title="http://www.sun.com" rel="nofollow" href="http://www.sun.com/">[1]</a>, baixe o  arquivo .BIN do JRE-1.5 no diretório /usr/local. Aqui utilizei a  jre-1_5_0_04-linux-i586.bin</p>
<p>Deixe o arquivo ser executavel.</p>
<pre># chmod +x jre-1_5_0_04-linux-i586.bin
</pre>
<p>Execute o arquivo digitando:</p>
<pre># ./jre-1_5_0_04-linux-i586.bin
</pre>
<p>Após concordar com os termos de licença, irá surgir uma pasta chamada  jre1.5.0_04 no diretório corrente.</p>
<p><a id="Servidor_Jabber" name="Servidor_Jabber"></a></p>
<h3>Servidor Jabber</h3>
<p>Nesta instalação vamos usar o Jive versão 2.1.5.</p>
<p>Faça o download do jive no site <a title="http://www.jivemessenger.com" rel="nofollow" href="http://www.jivemessenger.com/">http://www.jivemessenger.com</a></p>
<p>Descompacte-o arquivo no diretório /usr/local</p>
<pre># tar -zxvf jive_messenger_2_1_5.tar.gz
</pre>
<p>Feito isso é hora de criar uma variavel de ambiente utilizada pelo jive  para identificar a localização da máquina virtual java.</p>
<pre># export INSTALL4J_JAVA_HOME=/usr/local/jre1.5.0_04/
</pre>
<p>Chegada a hora de iniciarmos o servidor. Digite:</p>
<pre># /usr/local/jive_messenger/bin/messenger start
</pre>
<p>Se tudo estiver correto o servidor estará funcional.</p>
<p>Abra um browser qualquer e aponte para o ip do servidor na porta 9090</p>
<p>Se tudo der certo você estará na área administrativa começando a  configurar o servidor.</p>
<p>Preencha os campos que o sistema requer e vá avançando.</p>
<p>Após concluir a configuração, você deve alterar as permissões do usuário  mysql que o jive usa, limitando elas.</p>
<p>A configuração do Jive é muito fácil e lembra os wizards do windows.</p>
<p>Após completar a configuração do servidor, é chegada a hora de baixar o  client e testar. Recomendo o uso do Pandion e NeosMt (Meu preferido).</p>
<p>Instale o client do NeosMt<a title="http://www.neosmt.com/eng/index.php" rel="nofollow" href="http://www.neosmt.com/eng/index.php">[2]</a></p>
<p>Vá em criar nova conta. E onde ele pedir o servidor, você deverá colocar  ip ou nome do servidor em que foi feita a instalação.</p>
<p>Criado a conta agora é só logar com o usuário@servidor e senha.</p>
<p><a id="Conclus.C3.A3o" name="Conclus.C3.A3o"></a></p>
<h2>Conclusão</h2>
<p>Pronto temos um servidor Jabber de comunicação Instantânea.</p>
<p>Até mais e abraços.</p>
<p><a id="Autor" name="Autor"></a></p>
<h2>Autor</h2>
<ul>
<li><strong><a title="Usuário:Iceman" href="http://under-linux.org/wiki/Usu%C3%A1rio:Iceman">&#8217;1c3_m4n</a></strong> (iceman@underlinux.com.br)</li>
</ul>
<p>Fonte: http://under-linux.org</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/04/09/como-montar-um-servidor-ntp/' rel='bookmark' title='Permanent Link: Como Montar um Servidor NTP'>Como Montar um Servidor NTP</a> <small>O que é? A grosso modo podemos dizer que o...</small></li>
<li><a href='http://blog.deserv.info/2010/02/20/servidor-web-apache-dicas-e-tutoriais/' rel='bookmark' title='Permanent Link: Servidor web &#8211; Apache &#8211; dicas e tutoriais'>Servidor web &#8211; Apache &#8211; dicas e tutoriais</a> <small>Sobre este documento Versão simplificada do documento em formato texto,...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL – Nome de tabelas Case sensitive</title>
		<link>http://blog.deserv.info/2010/08/03/mysql-%e2%80%93-nome-de-tabelas-case-sensitive/</link>
		<comments>http://blog.deserv.info/2010/08/03/mysql-%e2%80%93-nome-de-tabelas-case-sensitive/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 22:39:57 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Case sensitive]]></category>
		<category><![CDATA[MySQL Case Sensitive]]></category>
		<category><![CDATA[SGBD]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=404</guid>
		<description><![CDATA[Durante essa semana, tive a oportunidade de implantar um sistema em um servidor MySQL “zeradinho”, até ai, nada de mais. Detalhe interessante, a configuração default de um servidor MySQL for Linux, é que o nome dos objetos seja case-sensitive, mais interessante ainda é que mesmo criando uma tabela com o “create table NomeDaTabela(…”, ele entende [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/14/backup-de-tabelas-de-bancos-mysql/' rel='bookmark' title='Permanent Link: Backup de Tabelas de Bancos MySQL'>Backup de Tabelas de Bancos MySQL</a> <small>Scripts Bash para gerar dumps de tabelas de bancos MySQL....</small></li>
<li><a href='http://blog.deserv.info/2010/01/11/tutorial-mysql-criando-usuarios-e-concedendo-privilegios/' rel='bookmark' title='Permanent Link: Tutorial MySQL: Criando usuários e concedendo privilégios'>Tutorial MySQL: Criando usuários e concedendo privilégios</a> <small>O MySQL possui um sistema de privilégios que é semelhante...</small></li>
<li><a href='http://blog.deserv.info/2009/12/23/gerando-log-das-queries-lentas-do-mysql/' rel='bookmark' title='Permanent Link: Gerando log das &#8220;queries&#8221; lentas do MySQL'>Gerando log das &#8220;queries&#8221; lentas do MySQL</a> <small>Primeiramente verifique se a variável que gera o log está...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Durante essa semana, tive a oportunidade de implantar  um sistema em um servidor MySQL “zeradinho”, até ai, nada de mais.</p>
<p>Detalhe interessante, a configuração default de um  servidor MySQL for Linux, é que o nome dos objetos seja case-sensitive,  mais interessante ainda é que mesmo criando uma tabela com o “create  table NomeDaTabela(…”, ele entende como se fosse “nomedatabela”  (minúsculo), isso acontece pois o MySQL tem uma configuração  “lower_case_table_names” que tem 3 formas de serem configurados: <span id="more-404"></span></p>
<p><strong>lower_case_table_names=0</strong><br />
- O  nome da tabelas é armazenado da forma que foi inserido, e o uso deve ser  exatamente igual a forma que foi criado.<br />
<em>Se estiver usando um  sistema Windows ou Mac,essa configuração é desprezada e utilizada <strong>lower_case_table_names=2</strong>.</em></p>
<p><strong>lower_case_table_names=1</strong><br />
-  Os nomes das tabelas são armazenados em minúsculo, e a forma de uso é a  mais flexível pois não é case sensitive.</p>
<p><strong>lower_case_table_names=2</strong><br />
- O nome da tabelas é armazenado da forma que foi inserido, mas  quando for usar deve ser utilizado o nome em minúscula.</p>
<p>Para configurar é simples, é só abrir o arquivo <em>my.cnf </em>que está na pasta da instalação do MySQL.</p>
<p>Fonte: http://www.tassiohenrique.com.br</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/14/backup-de-tabelas-de-bancos-mysql/' rel='bookmark' title='Permanent Link: Backup de Tabelas de Bancos MySQL'>Backup de Tabelas de Bancos MySQL</a> <small>Scripts Bash para gerar dumps de tabelas de bancos MySQL....</small></li>
<li><a href='http://blog.deserv.info/2010/01/11/tutorial-mysql-criando-usuarios-e-concedendo-privilegios/' rel='bookmark' title='Permanent Link: Tutorial MySQL: Criando usuários e concedendo privilégios'>Tutorial MySQL: Criando usuários e concedendo privilégios</a> <small>O MySQL possui um sistema de privilégios que é semelhante...</small></li>
<li><a href='http://blog.deserv.info/2009/12/23/gerando-log-das-queries-lentas-do-mysql/' rel='bookmark' title='Permanent Link: Gerando log das &#8220;queries&#8221; lentas do MySQL'>Gerando log das &#8220;queries&#8221; lentas do MySQL</a> <small>Primeiramente verifique se a variável que gera o log está...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/03/mysql-%e2%80%93-nome-de-tabelas-case-sensitive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alterando a senha do usuário padrão do PostgreSQL</title>
		<link>http://blog.deserv.info/2010/07/31/alterando-a-senha-do-usuario-padrao-do-postgresql/</link>
		<comments>http://blog.deserv.info/2010/07/31/alterando-a-senha-do-usuario-padrao-do-postgresql/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 00:46:20 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Resetando Senha de Root]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=402</guid>
		<description><![CDATA[Mais uma dica rápidinha para os que estão precisando realizar esta tarefa. Conecte ao servidor com o usuário root e depois se transforme no usuário “postgres” como no exemplo abaixo: root@pgsql1:~# su – postgres Agora que está com o usuário postgres, execute o seguinte comando: postgres@pgsql1:~$ psql template1 Logado no “cliente do postgres” digite o [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/01/17/alterando-a-senha-do-usuario-root-no-mysql/' rel='bookmark' title='Permanent Link: Alterando a senha do usuário root no MySQL'>Alterando a senha do usuário root no MySQL</a> <small>Algumas vezes já me deparei com a dificuldade de tentar...</small></li>
<li><a href='http://blog.deserv.info/2010/05/17/instalacao-do-postgresql-no-linux/' rel='bookmark' title='Permanent Link: Instalação do PostgreSQL no Linux'>Instalação do PostgreSQL no Linux</a> <small>Numa instalação no Linux, mesmo com a versão 8.3.6, podemos...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/' rel='bookmark' title='Permanent Link: Introdução ao PostgreSQL'>Introdução ao PostgreSQL</a> <small>Resumo da História do PostgreSQL É um poderoso SGBD com...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Mais uma dica rápidinha para os que estão precisando realizar esta tarefa.</p>
<p>Conecte ao servidor com o usuário root e depois se transforme no usuário “postgres” como no exemplo abaixo:</p>
<p>root@pgsql1:~# su – postgres</p>
<p>Agora que está com o usuário postgres, execute o seguinte comando:</p>
<p>postgres@pgsql1:~$ psql template1</p>
<p>Logado no “cliente do postgres” digite o seguinte comando:</p>
<p>template1=# ALTER USER postgres WITH PASSWORD ‘SUA_NOVA_SENHA’;</p>
<p>Agora digite “\q” para sair, desconecte do servidor e tente conectar  com a sua aplicação ou seu cliente PostgreSQL ao seu servidor com a nova  senha.</p>
<p>Fonte: http://dotlinux.net</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/01/17/alterando-a-senha-do-usuario-root-no-mysql/' rel='bookmark' title='Permanent Link: Alterando a senha do usuário root no MySQL'>Alterando a senha do usuário root no MySQL</a> <small>Algumas vezes já me deparei com a dificuldade de tentar...</small></li>
<li><a href='http://blog.deserv.info/2010/05/17/instalacao-do-postgresql-no-linux/' rel='bookmark' title='Permanent Link: Instalação do PostgreSQL no Linux'>Instalação do PostgreSQL no Linux</a> <small>Numa instalação no Linux, mesmo com a versão 8.3.6, podemos...</small></li>
<li><a href='http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/' rel='bookmark' title='Permanent Link: Introdução ao PostgreSQL'>Introdução ao PostgreSQL</a> <small>Resumo da História do PostgreSQL É um poderoso SGBD com...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/07/31/alterando-a-senha-do-usuario-padrao-do-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formatando um pc e instalando Windows XP(Manual Ilustrado)</title>
		<link>http://blog.deserv.info/2010/07/19/formatando-um-pc-e-instalando-windows-xpmanual-ilustrado/</link>
		<comments>http://blog.deserv.info/2010/07/19/formatando-um-pc-e-instalando-windows-xpmanual-ilustrado/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 17:51:54 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Formatando e Instalando Windows XP]]></category>
		<category><![CDATA[Instalando Windows XP]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=398</guid>
		<description><![CDATA[Veja passo a passo como formatar um computador e instalar o Windows XP atravéz do MS-DOS para deixa-lo novinho em folha. Primeiro passo ao formatar… Você deve ter em mente que este comando fará com que obtenha perca total dos arquivos aplicativos e tudo que esta dentro d um hd. Somente ficará no HD os arquivos [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p><a title="26072007formatandoumpc1.jpg" onclick="javascript:urchinTracker  ('/downloads/wp-content/uploads/2007/07/26072007formatandoumpc1.jpg');" href="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc1.jpg"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc1.thumbnail.jpg" alt="26072007formatandoumpc1.jpg" align="left" /></a> Veja passo a passo como formatar um computador e  instalar o Windows XP atravéz do MS-DOS para deixa-lo novinho em folha.</p>
<p>Primeiro passo ao formatar…<br />
Você deve ter em mente que este  comando fará com que obtenha perca  total dos arquivos aplicativos e tudo que esta dentro d um hd.  Somente ficará no HD os arquivos necessários da inicialização do mesmo.<br />
Salve  seus arquivos em cd’s ou até mesmo disquetes dependendo do arquivo e  tal. <span id="more-398"></span></p>
<p><span style="color: #ff0000;">Agora o proximo passo é ter certeza d que o CD d  Windows XP é com boot…pq se não for não faça a formatação.</span><br />
<span style="color: #ff0000;">IMPORTANTE:</span> Nunca perca nem estrage os CD’s quem  vem com os driver do seu pc. Pois sem eles principalmente o da  placa-mãe você terá muitos e muitos problemas. Então guarde os CD’s em  lugar arejado, fresco, evite lugares úmidos e quentes pois isso  prejudica os cd’s.</p>
<p>Tendo em mãos todos os drivers, o CD do windows bootable e sua CD-Key  estamos prontos para começar.</p>
<p>Primeiro passo.<br />
Coloque o CD bootable do windows e reinicie a  maquina.<br />
Assim quando ela ligar novamente fique apertando DEL varias  vezes até aparecer essa tela:<br />
<a title="26072007formatandoumpc1.jpg" rel="attachment wp-att-124" href="http://blog.deserv.info/2009/12/08/comandos-para-manipulacao-de-arquivos/10-revision-5/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc1.jpg" alt="26072007formatandoumpc1.jpg" width="362" height="261" /></a></p>
<p>Escolha a opção ADVANCED SETUP(no  meu caso nao era advanced setup, se o seu tambem nao for escolha mesmo  assim a segunda opção). Aparecerá a seguinte tela:<br />
<a title="26072007formatandoumpc3.jpg" rel="attachment wp-att-125" href="http://blog.deserv.info/?attachment_id=125"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc3.jpg" alt="26072007formatandoumpc3.jpg" width="366" height="257" /></a></p>
<p><span style="color: #ff0000;">1ST BOOT DEVICE</span> você colocará a opção CD-ROM(se essa opção nao estiver  disponivel continue tentando modificar..tente sair e entrar do advanced  setup e veja se mudou…). Feito isso saia do setup do windows mas nao  esqueça de salvar as modificações… (lembrando que esse tutorial é para  quem tem o CD do windows nao disquetes).<br />
Repita aquele processo de  apertar, só que ao inves de DEL vc aperta F8.<br />
Depois vc escolhe a opção CD-ROM para que o computador inicie com o CD d  instalação do Windows XP. Logo apos aparecerá a seguinte tela:<br />
<a title="26072007formatandoumpc4.jpg" rel="attachment wp-att-126" href="http://blog.deserv.info/2009/12/08/possible-t0rn-v8-or-variation-rootkit-installed/125-revision/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc4.jpg" alt="26072007formatandoumpc4.jpg" width="379" height="273" /></a></p>
<p>Aperte qualquer tecla, mas não demore muito tempo pq vc perde o que  salvou e o windows inicia sozinho.<br />
Depois de apertar qualquer tecla  aparecera a seguinte tela:<br />
<a title="26072007formatandoumpc5.jpg" rel="attachment wp-att-127" href="http://blog.deserv.info/2009/12/08/possible-t0rn-v8-or-variation-rootkit-installed/125-autosave/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc5.jpg" alt="26072007formatandoumpc5.jpg" width="369" height="293" /></a></p>
<p><span style="color: #ff0000;">Eu peço que vc não mude nenhuma configuração</span> pois as configurações contidas tem em 99% dos CD’s do Windows XP.<br />
Só  mexa se vc tem certeza do que esta fazendo ou de que vc tenha um  técnico experiente ao seu lado.<br />
Próxima tela é:<br />
<a title="26072007formatandoumpc6.jpg" rel="attachment wp-att-128" href="http://blog.deserv.info/voce-aqui/95-revision-2/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc6.jpg" alt="26072007formatandoumpc6.jpg" width="352" height="258" /></a></p>
<p><span style="color: #ff0000;">Apenas espere.<br />
</span>Próxima tela é:<br />
<a title="26072007formtatandoumpc7.jpg" rel="attachment wp-att-129" href="http://blog.deserv.info/?attachment_id=129"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formtatandoumpc7.jpg" alt="26072007formtatandoumpc7.jpg" width="345" height="304" /></a><br />
<span style="color: #ff0000;">ENTER </span>inicia-se  o processo de formatação.<br />
R  ela faz reparos para eventuais erros do sistema.<br />
F3 vc cancela tudo.<br />
Suponho que vc queira  formatar então vamos à proxima tela:<br />
<a title="26072007formatandoumpc8.jpg" rel="attachment wp-att-130" href="http://blog.deserv.info/2009/12/14/backup-de-tabelas-de-bancos-mysql/129-revision/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc8.jpg" alt="26072007formatandoumpc8.jpg" width="347" height="324" /></a></p>
<p>Nesta tela aparece onde será salvo o windows.<br />
ESC vc prossegue com a formatação.<br />
R vc repara o windows que ja esta  instalado no seu pc.<br />
Próxima tela é:<br />
<a title="26072007formatandoumpc9.jpg" rel="attachment wp-att-131" href="http://blog.deserv.info/2009/12/14/backup-de-tabelas-de-bancos-mysql/129-revision-2/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc9.jpg" alt="26072007formatandoumpc9.jpg" width="342" height="315" /></a><br />
<span style="color: #ff0000;">Aqui vc deve ter  cuidado e prestar atenção!<br />
</span>Se voce quiser fazer uma partição  no seu pc (o que é altamente recomendavel) voce aperta C.<br />
Um HD particionado tem menos  risco de virus e caso voce nao tenha CD’s para eventuais back-up’s voce  nao precisa formatar as duas partições.<br />
Se o seu pc ja estiver  particionado apenas exclua a partição onde se encontra o sistema  operacional, que provavelmente deve ser C:<br />
Para excluir apenas aperte D na partição selelcionada. Por que isso?  Excluindo a partição voce remove possiveis erros e defeitos que o HD  criou com o passar do tempo.<br />
Se o seu HD for particionado aperte D para excluir a partição  desejada (se o seu HD nao for particionado pule esta parte).<br />
Próxima  tela é:</p>
<p><a title="26072007formatandoumpc10.jpg" rel="attachment wp-att-132" href="http://blog.deserv.info/2009/12/14/backup-de-tabelas-de-bancos-mysql/129-autosave/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc10.jpg" alt="26072007formatandoumpc10.jpg" width="354" height="331" /></a><br />
Aperte ENTER para excluir a partição selecionada.<br />
Próxima tela  é:<br />
<a title="26072007formatandoumpc11.jpg" rel="attachment  wp-att-133" href="http://blog.deserv.info/2009/12/14/backup-de-tabelas-de-bancos-mysql/129-revision-3/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc11.jpg" alt="26072007formatandoumpc11.jpg" width="354" height="320" /></a></p>
<p>Precione L para continuar  com o processo de exclusão da partição.<br />
O windows XP o pergunta duas  vezes se vc deseja excluir mesmo a partição porque depois da exclusão tudo será perdido.<br />
Próxima  tela é:<br />
<a title="26072007formatandoumpc12.jpg" rel="attachment  wp-att-134" href="http://blog.deserv.info/2009/12/14/backup-de-tabelas-de-bancos-mysql/129-revision-4/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc12.jpg" alt="26072007formatandoumpc12.jpg" width="354" height="319" /></a></p>
<p>Aperte C para criar uma  nova partição, e aumente a quantidade de MB nela de acordo com sua necessidade.<br />
Apertando D vc exclui outra partição o que  nao vem ao caso.<br />
Caso vc queira somente uma partição no seu HD não faça nada somente va para  próxima tela.<br />
Próxima tela:<br />
<a title="26072007formatandoumpc13.jpg" rel="attachment wp-att-135" href="http://blog.deserv.info/?attachment_id=135"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc13.jpg" alt="26072007formatandoumpc13.jpg" width="363" height="323" /></a></p>
<p><span style="color: #ff0000;">Aqui que a formatação se inicia preste bastante  atenção!<br />
</span>É altamente recomendavel que vc use NTFS normal pois  é mais seguro, não use NTFS rápido (quick).<br />
Próxima tela é:<br />
<a title="26072007formatandoumpc14.jpg" rel="attachment wp-att-136" href="http://blog.deserv.info/2009/12/15/manual-online-do-ffmpeg-parte-1/135-revision/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc14.jpg" alt="26072007formatandoumpc14.jpg" width="364" height="320" /></a></p>
<p>Deixe carregar até o 100% e ela começara a carregar novamente,  deixe-a carregar até o final.<br />
<script type="text/javascript">// <![CDATA[
google_ad_client = "pub-5295352942372692";
google_ad_width = 468;
google_ad_height = 15;
google_ad_format = "468x15_0ads_al";
google_ad_channel = "";
google_color_border = "FFFFFF";
google_color_bg = "000000";
google_color_link = "FFFFFF";
google_color_text = "000000";
google_color_url = "008000";
// ]]&gt;</script></p>
<p>Parabens…<br />
O windows está formatado…O sistema de instalação  iniciara sozinho… Apenas acompanhe o windows e responda todas as  perguntas.<br />
Ps:NÃO REMOVA O CD DO  WINDOWS!<br />
Próxima tela é:<br />
<a title="26072007formatandoumpc15.jpg" rel="attachment wp-att-137" href="http://blog.deserv.info/2009/12/15/manual-online-do-ffmpeg-parte-1/135-revision-2/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc15.jpg" alt="26072007formatandoumpc15.jpg" width="374" height="327" /></a></p>
<p>Antes do sistema reiniciar automaticamente ele pede pra vc retirar os  disquetes (se algum estiver dentro da maquina)<br />
!CUIDADO É SÓ DISQUETE O CD TEM QUE CONTINUAR LÁ SE NÃO  VC PERDE TUDO QUE FEZ!<br />
Próxima tela é:<br />
<a title="26072007formatandoumpc16.jpg" rel="attachment wp-att-138" href="http://blog.deserv.info/2009/12/15/manual-online-do-ffmpeg-parte-1/135-revision-3/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc16.jpg" alt="26072007formatandoumpc16.jpg" width="373" height="321" /></a></p>
<p>A instalação do windows se inicia…<br />
Apenas acompanhe…<br />
Próxima  tela é:<br />
<a title="26072007formatandoumpc17.jpg" rel="attachment  wp-att-139" href="http://blog.deserv.info/2009/12/15/manual-online-do-ffmpeg-parte-1/135-revision-4/"><img src="http://www.meustutoriais.com.br/wp-content/uploads/2007/07/26072007formatandoumpc17.jpg" alt="26072007formatandoumpc17.jpg" width="367" height="317" /></a></p>
<p>O windows vai reiniciar o sistema, e vc tera que colocar cd key, etc,  etc…<br />
AINDA NAO RETIRE O CD…SÓ  TIRE QUANDO TUDO ESTIVER PRONTO E VC ESTIVER NA AREA DE TRABALHO DO  WINDOWS.</p>
<p>Pronto sua formatação esta pronta.</p>
<p>Fonte: http://helldanger1.blogs.sapo.pt/</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/' rel='bookmark' title='Permanent Link: Instalando e Integrandro Apache2 com Tomcat5'>Instalando e Integrandro Apache2 com Tomcat5</a> <small>Introdução Nesse artigo vamos demonstrar a integração do servidor web...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/07/19/formatando-um-pc-e-instalando-windows-xpmanual-ilustrado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Canivete Suíço do Shell (Bash)</title>
		<link>http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash/</link>
		<comments>http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 21:14:08 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Aurélio]]></category>
		<category><![CDATA[Canivete Suíço]]></category>
		<category><![CDATA[Canivete Suíço do Shell]]></category>
		<category><![CDATA[Shell Scripts]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=394</guid>
		<description><![CDATA[Este Canivete Suíço do Shell é um apêndice do meu livro Shell Script Profissional. O livro é enorme, são quase 500 páginas de puro shell, explicado de maneira clara e didática. Você vai dominar o assunto, além de aprender a escrever programas de verdade em vez de meros scripts toscos. Sou escritor e ganho a [...]


No related posts.

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<table border="1">
<tbody>
<tr>
<td><a href="http://www.shellscript.com.br/"><img src="http://aurelio.net/img/icon128/livroshell.png" border="0" alt="" align="middle" /></a></td>
<td>Este Canivete Suíço do Shell é um apêndice do meu livro <a href="http://www.shellscript.com.br/">Shell Script Profissional</a>. O  livro é enorme, são quase 500 páginas de puro shell, explicado de  maneira clara e didática. Você vai dominar o assunto, além de aprender a  escrever programas de verdade em vez de meros scripts toscos. Sou  escritor e ganho a vida com meus livros, então comprando o livro você  também me ajuda a manter esse site no ar e assim eu continuo escrevendo  para você ler. Combinado? <img src='http://blog.deserv.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <span id="more-394"></span></td>
</tr>
</tbody>
</table>
<div>
<ol>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#operadores">Operadores</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#redir">Redirecionamento</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#variaveis">Variáveis  especiais</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#expansao">Expansão  de variáveis</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#blocos">Blocos  e agrupamentos</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ifwhilefor">if,  for, select, while, until, case</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#test">Opções  do comando test ou [</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#prompt">Escapes  especiais para usar no prompt (PS1)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#echo">Escapes  reconhecidos pelo comando echo</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#date">Formatadores  do comando date</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#printf">Formatadores  do comando printf</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ls">Letras  identificadoras de arquivos no comando ls -l</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#glob">Curingas  para nomes de arquivo (glob)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#case">Curingas  para os itens do comando case</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#sinais">Sinais  para usar com trap/kill/killall</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#exitcode">Códigos  de retorno de comandos</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#cores">Códigos  de cores (ANSI)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#metacaracteres">Os  metacaracteres das expressões regulares</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#metadif">Metacaracteres  que são diferentes nos aplicativos</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ascii">Caracteres  ASCII imprimíveis (ISO-8859-1) - texto</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#asciiimg">Caracteres  ASCII imprimíveis (ISO-8859-1) - imagem</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#codigos">Códigos  prontos para copiar e colar</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#emacs">Atalhos  da linha de comando (set -o emacs)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ferramentas">A caixa de  ferramentas do shelleiro</a></li>
</ol>
</div>
<div>
<ul>
<li>Quer imprimir o canivete? <a href="http://aurelio.net/shell/canivete-pdf.html">Baixe o PDF</a> (agora  é gratuito).</li>
<li>Veja também: <a href="http://aurelio.net/shell/miniman">miniman</a>,  o irmãozinho do canivete suíço.</li>
<li>¿Habla español? Este documento <a href="http://aurelio.net/shell/canivete-es.html">fue traducido a su  idioma</a>.</li>
</ul>
</div>
<p><a name="operadores"></a></p>
<h2>1. Operadores</h2>
<table border="1" align="center">
<tbody>
<tr>
<th colspan="2">Operadores Aritméticos</th>
</tr>
<tr>
<td align="center"><code>+</code></td>
<td>Adição</td>
</tr>
<tr>
<td align="center"><code>-</code></td>
<td>Subtração</td>
</tr>
<tr>
<td align="center"><code>*</code></td>
<td>Multiplicação</td>
</tr>
<tr>
<td align="center"><code>/</code></td>
<td>Divisão</td>
</tr>
<tr>
<td align="center"><code>%</code></td>
<td>Módulo</td>
</tr>
<tr>
<td align="center"><code>**</code></td>
<td>Exponenciação</td>
</tr>
<tr>
<th colspan="2">Operadores de Atribuição</th>
</tr>
<tr>
<td align="center"><code>=</code></td>
<td>Atribui valor a uma variável</td>
</tr>
<tr>
<td align="center"><code>+=</code></td>
<td>Incrementa a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>-=</code></td>
<td>Decrementa a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>*=</code></td>
<td>Multiplica a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>/=</code></td>
<td>Divide a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>%=</code></td>
<td>Resto da divisão por uma constante</td>
</tr>
<tr>
<td align="center"><code>++</code></td>
<td>Incrementa em 1 o valor da variável</td>
</tr>
<tr>
<td align="center"><code>--</code></td>
<td>Decrementa em 1 o valor da variável</td>
</tr>
<tr>
<th colspan="2">Operadores Relacionais</th>
</tr>
<tr>
<td align="center"><code>==</code></td>
<td>Igual</td>
</tr>
<tr>
<td align="center"><code>!=</code></td>
<td>Diferente</td>
</tr>
<tr>
<td align="center"><code>&gt;</code></td>
<td>Maior</td>
</tr>
<tr>
<td align="center"><code>&gt;=</code></td>
<td>Maior ou Igual</td>
</tr>
<tr>
<td align="center"><code>&lt;</code></td>
<td>Menor</td>
</tr>
<tr>
<td align="center"><code>&lt;=</code></td>
<td>Menor ou Igual</td>
</tr>
<tr>
<th colspan="2">Operadores Lógicos</th>
</tr>
<tr>
<td align="center"><code>&amp;&amp;</code></td>
<td>E lógico (AND)</td>
</tr>
<tr>
<td align="center"><code>||</code></td>
<td>OU lógico (OR)</td>
</tr>
<tr>
<th colspan="2">Operadores de BIT</th>
</tr>
<tr>
<td align="center"><code>&lt;&lt;</code></td>
<td>Deslocamento à esquerda</td>
</tr>
<tr>
<td align="center"><code>&gt;&gt;</code></td>
<td>Deslocamento à direita</td>
</tr>
<tr>
<td align="center"><code>&amp;</code></td>
<td>E de bit (AND)</td>
</tr>
<tr>
<td align="center"><code>|</code></td>
<td>OU de bit (OR)</td>
</tr>
<tr>
<td align="center"><code>^</code></td>
<td>OU exclusivo de bit (XOR)</td>
</tr>
<tr>
<td align="center"><code>~</code></td>
<td>Negação de bit</td>
</tr>
<tr>
<td align="center"><code>!</code></td>
<td>NÃO de bit (NOT)</td>
</tr>
<tr>
<th colspan="2">Operadores de BIT (atribuição)</th>
</tr>
<tr>
<td align="center"><code>&lt;&lt;=</code></td>
<td>Deslocamento à esquerda</td>
</tr>
<tr>
<td align="center"><code>&gt;&gt;=</code></td>
<td>Deslocamento à direita</td>
</tr>
<tr>
<td align="center"><code>&amp;=</code></td>
<td>E de bit</td>
</tr>
<tr>
<td align="center"><code>|=</code></td>
<td>OU de bit</td>
</tr>
<tr>
<td align="center"><code>^=</code></td>
<td>OU exclusivo de bit</td>
</tr>
</tbody>
</table>
<p><a name="redir"></a></p>
<h2>2. Redirecionamento</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Operador</th>
<th>Ação</th>
</tr>
<tr>
<td align="center"><code>&lt;</code></td>
<td>Redireciona a entrada padrão (STDIN)</td>
</tr>
<tr>
<td align="center"><code>&gt;</code></td>
<td>Redireciona a saída padrão (STDOUT)</td>
</tr>
<tr>
<td align="center"><code>2&gt;</code></td>
<td>Redireciona a saída de erro (STDERR)</td>
</tr>
<tr>
<td align="center"><code>&gt;&gt;</code></td>
<td>Redireciona a saída padrão, anexando</td>
</tr>
<tr>
<td align="center"><code>2&gt;&gt;</code></td>
<td>Redireciona a saída de erro, anexando</td>
</tr>
<tr>
<td align="center"><code>|</code></td>
<td>Conecta a saída padrão com a entrada padrão de outro comando</td>
</tr>
<tr>
<td align="center"><code>2&gt;&amp;1</code></td>
<td>Conecta a saída de erro na saída padrão</td>
</tr>
<tr>
<td align="center"><code>&gt;&amp;2</code></td>
<td>Conecta a saída padrão na saída de erro</td>
</tr>
<tr>
<td align="center"><code>&gt;&amp;-</code></td>
<td>Fecha a saída padrão</td>
</tr>
<tr>
<td align="center"><code>2&gt;&amp;-</code></td>
<td>Fecha a saída de erro</td>
</tr>
<tr>
<td align="center"><code>3&lt;&gt;arq</code></td>
<td>Conecta o descritor de arquivos 3 ao arquivo 'arq'</td>
</tr>
<tr>
<td align="center"><code>&lt;&lt;FIM</code></td>
<td>Alimenta a entrada padrão (Here Document)</td>
</tr>
<tr>
<td align="center"><code>&lt;&lt;-FIM</code></td>
<td>Alimenta a entrada padrão, cortando TABs</td>
</tr>
<tr>
<td align="center"><code>&lt;(cmd)</code></td>
<td>A saída do comando 'cmd' é um arquivo: diff &lt;(cmd1) &lt;(cmd2)</td>
</tr>
<tr>
<td align="center"><code>&gt;(cmd)</code></td>
<td>A entrada do comando 'cmd' é um arquivo: tar cf &gt;(bzip2 -c  &gt;file.tbz) $dir</td>
</tr>
</tbody>
</table>
<p><a name="variaveis"></a></p>
<h2>3. Variáveis especiais</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Variável</th>
<th>Parâmetros Posicionais</th>
</tr>
<tr>
<td align="center"><code>$0</code></td>
<td>Parâmetro número 0 (nome do comando ou função)</td>
</tr>
<tr>
<td align="center"><code>$1</code></td>
<td>Parâmetro número 1 (da linha de comando ou função)</td>
</tr>
<tr>
<td align="center"><code>...</code></td>
<td>Parâmetro número N ...</td>
</tr>
<tr>
<td align="center"><code>$9</code></td>
<td>Parâmetro número 9 (da linha de comando ou função)</td>
</tr>
<tr>
<td align="center"><code>${10}</code></td>
<td>Parâmetro número 10 (da linha de comando ou função)</td>
</tr>
<tr>
<td align="center"><code>...</code></td>
<td>Parâmetro número NN ...</td>
</tr>
<tr>
<td align="center"><code>$#</code></td>
<td>Número total de parâmetros da linha de comando ou função</td>
</tr>
<tr>
<td align="center"><code>$*</code></td>
<td>Todos os parâmetros, como uma string única</td>
</tr>
<tr>
<td align="center"><code>$@</code></td>
<td>Todos os parâmetros, como várias strings protegidas</td>
</tr>
<tr>
<th>Variável</th>
<th>Miscelânia</th>
</tr>
<tr>
<td align="center"><code>$$</code></td>
<td>Número PID do processo atual (do próprio script)</td>
</tr>
<tr>
<td align="center"><code>$!</code></td>
<td>Número PID do último job em segundo plano</td>
</tr>
<tr>
<td align="center"><code>$_</code></td>
<td>Último argumento do último comando executado</td>
</tr>
<tr>
<td align="center"><code>$?</code></td>
<td>Código de retorno do último comando executado</td>
</tr>
</tbody>
</table>
<p><a name="expansao"></a></p>
<h2>4. Expansão de variáveis</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Sintaxe</th>
<th>Expansão Condicional</th>
</tr>
<tr>
<td><code>${var:-texto}</code></td>
<td>Se var não está definida, retorna 'texto'</td>
</tr>
<tr>
<td><code>${var:=texto}</code></td>
<td>Se var não está definida, defina-a com 'texto'</td>
</tr>
<tr>
<td><code>${var:?texto}</code></td>
<td>Se var não está definida, retorna o erro 'texto'</td>
</tr>
<tr>
<td><code>${var:+texto}</code></td>
<td>Se var está definida, retorna 'texto', senão retorna o vazio</td>
</tr>
<tr>
<th>Sintaxe</th>
<th>Expansão de Strings</th>
</tr>
<tr>
<td><code>${var}</code></td>
<td>É o mesmo que $var, porém não ambíguo</td>
</tr>
<tr>
<td><code>${#var}</code></td>
<td>Retorna o tamanho da string</td>
</tr>
<tr>
<td><code>${!var}</code></td>
<td>Executa o conteúdo de $var (igual 'eval \$$var')</td>
</tr>
<tr>
<td><code>${!texto*}</code></td>
<td>Retorna os nomes de variáveis começadas por 'texto'</td>
</tr>
<tr>
<td><code>${var:N}</code></td>
<td>Retorna o texto a partir da posição 'N'</td>
</tr>
<tr>
<td><code>${var:N:tam}</code></td>
<td>Retorna 'tam' caracteres a partir da posição 'N'</td>
</tr>
<tr>
<td><code>${var#texto}</code></td>
<td>Corta 'texto' do início da string</td>
</tr>
<tr>
<td><code>${var##texto}</code></td>
<td>Corta 'texto' do início da string (* guloso)</td>
</tr>
<tr>
<td><code>${var%texto}</code></td>
<td>Corta 'texto' do final da string</td>
</tr>
<tr>
<td><code>${var%%texto}</code></td>
<td>Corta 'texto' do final da string (* guloso)</td>
</tr>
<tr>
<td><code>${var/texto/novo}</code></td>
<td>Substitui 'texto' por 'novo', uma vez</td>
</tr>
<tr>
<td><code>${var//texto/novo}</code></td>
<td>Substitui 'texto' por 'novo', sempre</td>
</tr>
<tr>
<td><code>${var/#texto/novo}</code></td>
<td>Se a string começar com 'texto', substitui 'texto' por 'novo'</td>
</tr>
<tr>
<td><code>${var/%texto/novo}</code></td>
<td>Se a string terminar com 'texto', substitui 'texto' por 'novo'</td>
</tr>
</tbody>
</table>
<p><a name="blocos"></a></p>
<h2>5. Blocos e agrupamentos</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Sintaxe</th>
<th>Descrição</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center"><code>"..."</code></td>
<td>Protege uma string, mas reconhece $, \ e ` como especiais</td>
<td align="center">"abc"</td>
</tr>
<tr>
<td align="center"><code>'...'</code></td>
<td>Protege uma string completamente (nenhum caractere é especial)</td>
<td align="center">'abc'</td>
</tr>
<tr>
<td align="center"><code>$'...'</code></td>
<td>Protege uma string completamente, mas interpreta \n, \t, \a, etc</td>
<td align="center">$'abc\n'</td>
</tr>
<tr>
<td align="center"><code>`...`</code></td>
<td>Executa comandos numa subshell, retornando o resultado</td>
<td align="center">`ls`</td>
</tr>
<tr>
<td align="center"><code>{...}</code></td>
<td>Agrupa comandos em um bloco</td>
<td align="center">{ ls ; }</td>
</tr>
<tr>
<td align="center"><code>(...)</code></td>
<td>Executa comandos numa subshell</td>
<td align="center">( ls )</td>
</tr>
<tr>
<td align="center"><code>$(...)</code></td>
<td>Executa comandos numa subshell, retornando o resultado</td>
<td align="center">$( ls )</td>
</tr>
<tr>
<td align="center"><code>((...))</code></td>
<td>Testa uma operação aritmética, retornando 0 ou 1</td>
<td align="center">((5 &gt; 3))</td>
</tr>
<tr>
<td align="center"><code>$((...))</code></td>
<td>Retorna o resultado de uma operação aritmética</td>
<td align="center">$((5+3))</td>
</tr>
<tr>
<td align="center"><code>[...]</code></td>
<td>Testa uma expressão, retornando 0 ou 1 (alias do comando 'test')</td>
<td align="center">[ 5 -gt 3 ]</td>
</tr>
<tr>
<td align="center"><code>[[...]]</code></td>
<td>Testa uma expressão, retornando 0 ou 1 (podendo usar &amp;&amp; e  ||)</td>
<td align="center">[[ 5 &gt; 3 ]]</td>
</tr>
</tbody>
</table>
<p><a name="ifwhilefor"></a></p>
<h2>6. if, for, select, while, until, case</h2>
<table>
<tbody>
<tr>
<th>if</th>
<th>for / select</th>
<th>while / until</th>
<th>case</th>
</tr>
<tr>
<td>
<pre>if COMANDO
then
   ...
elif COMANDO
then
   ...
else
   ...
fi
</pre>
</td>
<td>
<pre>for VAR in LISTA
do
    ...
done

ou:

for ((exp1;exp2;exp3))
</pre>
</td>
<td>
<pre>while COMANDO
do
    ...
done
</pre>
</td>
<td>
<pre>case $VAR in
    txt1) ... ;;
    txt2) ... ;;
    txtN) ... ;;
    *)    ... ;;
esac
</pre>
</td>
</tr>
</tbody>
</table>
<p><a name="test"></a></p>
<h2>7. Opções do comando test ou [</h2>
<table border="1" align="center">
<tbody>
<tr>
<th colspan="2">Comparação Numérica</th>
</tr>
<tr>
<td align="center"><code>-lt</code></td>
<td>É menor que   (LessThan)</td>
</tr>
<tr>
<td align="center"><code>-gt</code></td>
<td>É maior que   (GreaterThan)</td>
</tr>
<tr>
<td align="center"><code>-le</code></td>
<td>É menor igual (LessEqual)</td>
</tr>
<tr>
<td align="center"><code>-ge</code></td>
<td>É maior igual (GreaterEqual)</td>
</tr>
<tr>
<td align="center"><code>-eq</code></td>
<td>É igual       (EQual)</td>
</tr>
<tr>
<td align="center"><code>-ne</code></td>
<td>É diferente   (NotEqual)</td>
</tr>
<tr>
<th colspan="2">Comparação de Strings</th>
</tr>
<tr>
<td align="center"><code>=</code></td>
<td>É igual</td>
</tr>
<tr>
<td align="center"><code>!=</code></td>
<td>É diferente</td>
</tr>
<tr>
<td align="center"><code>-n</code></td>
<td>É não nula</td>
</tr>
<tr>
<td align="center"><code>-z</code></td>
<td>É nula</td>
</tr>
<tr>
<th colspan="2">Operadores Lógicos</th>
</tr>
<tr>
<td align="center"><code>!</code></td>
<td>NÃO lógico (NOT)</td>
</tr>
<tr>
<td align="center"><code>-a</code></td>
<td>E lógico (AND)</td>
</tr>
<tr>
<td align="center"><code>-o</code></td>
<td>OU lógico (OR)</td>
</tr>
<tr>
<th colspan="2">Testes em arquivos</th>
</tr>
<tr>
<td align="center"><code>-b</code></td>
<td>É um dispositivo de bloco</td>
</tr>
<tr>
<td align="center"><code>-c</code></td>
<td>É um dispositivo de caractere</td>
</tr>
<tr>
<td align="center"><code>-d</code></td>
<td>É um diretório</td>
</tr>
<tr>
<td align="center"><code>-e</code></td>
<td>O arquivo existe</td>
</tr>
<tr>
<td align="center"><code>-f</code></td>
<td>É um arquivo normal</td>
</tr>
<tr>
<td align="center"><code>-g</code></td>
<td>O bit SGID está ativado</td>
</tr>
<tr>
<td align="center"><code>-G</code></td>
<td>O grupo do arquivo é o do usuário atual</td>
</tr>
<tr>
<td align="center"><code>-k</code></td>
<td>O sticky-bit está ativado</td>
</tr>
<tr>
<td align="center"><code>-L</code></td>
<td>O arquivo é um link simbólico</td>
</tr>
<tr>
<td align="center"><code>-O</code></td>
<td>O dono do arquivo é o usuário atual</td>
</tr>
<tr>
<td align="center"><code>-p</code></td>
<td>O arquivo é um named pipe</td>
</tr>
<tr>
<td align="center"><code>-r</code></td>
<td>O arquivo tem permissão de leitura</td>
</tr>
<tr>
<td align="center"><code>-s</code></td>
<td>O tamanho do arquivo é maior que zero</td>
</tr>
<tr>
<td align="center"><code>-S</code></td>
<td>O arquivo é um socket</td>
</tr>
<tr>
<td align="center"><code>-t</code></td>
<td>O descritor de arquivos N é um terminal</td>
</tr>
<tr>
<td align="center"><code>-u</code></td>
<td>O bit SUID está ativado</td>
</tr>
<tr>
<td align="center"><code>-w</code></td>
<td>O arquivo tem permissão de escrita</td>
</tr>
<tr>
<td align="center"><code>-x</code></td>
<td>O arquivo tem permissão de execução</td>
</tr>
<tr>
<td align="center"><code>-nt</code></td>
<td>O arquivo é mais recente (NewerThan)</td>
</tr>
<tr>
<td align="center"><code>-ot</code></td>
<td>O arquivo é mais antigo (OlderThan)</td>
</tr>
<tr>
<td align="center"><code>-ef</code></td>
<td>O arquivo é o mesmo (EqualFile)</td>
</tr>
</tbody>
</table>
<p><a name="prompt"></a></p>
<h2>8. Escapes especiais para usar no prompt (PS1)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Escape</th>
<th>Lembrete</th>
<th>Expande para...</th>
</tr>
<tr>
<td align="center">\a</td>
<td><em>Alerta</em></td>
<td>Alerta (bipe)</td>
</tr>
<tr>
<td align="center">\d</td>
<td><em>Data</em></td>
<td>Data no formato "Dia-da-semana Mês Dia" (Sat Jan 15)</td>
</tr>
<tr>
<td align="center">\e</td>
<td><em>Escape</em></td>
<td>Caractere Esc</td>
</tr>
<tr>
<td align="center">\h</td>
<td><em>Hostname</em></td>
<td>Nome da máquina sem o domínio (dhcp11)</td>
</tr>
<tr>
<td align="center">\H</td>
<td><em>Hostname</em></td>
<td>Nome completo da máquina (dhcp11.empresa)</td>
</tr>
<tr>
<td align="center">\j</td>
<td><em>Jobs</em></td>
<td>Número de jobs ativos</td>
</tr>
<tr>
<td align="center">\l</td>
<td><em>Tty</em></td>
<td>Nome do terminal corrente (ttyp1)</td>
</tr>
<tr>
<td align="center">\n</td>
<td><em>Newline</em></td>
<td>Linha nova</td>
</tr>
<tr>
<td align="center">\r</td>
<td><em>Return</em></td>
<td>Retorno de carro</td>
</tr>
<tr>
<td align="center">\s</td>
<td><em>Shell</em></td>
<td>Nome do shell (basename $0)</td>
</tr>
<tr>
<td align="center">\t</td>
<td><em>Time</em></td>
<td>Horário no formato 24 horas HH:MM:SS</td>
</tr>
<tr>
<td align="center">\T</td>
<td><em>Time</em></td>
<td>Horário no formato 12 horas HH:MM:SS</td>
</tr>
<tr>
<td align="center">\@</td>
<td><em>At</em></td>
<td>Horário no formato 12 horas HH:MM am/pm</td>
</tr>
<tr>
<td align="center">\A</td>
<td><em>At</em></td>
<td>Horário no formato 24 horas HH:MM</td>
</tr>
<tr>
<td align="center">\u</td>
<td><em>Usuário</em></td>
<td>Login do usuário corrente</td>
</tr>
<tr>
<td align="center">\v</td>
<td><em>Versão</em></td>
<td>Versão do Bash (2.00)</td>
</tr>
<tr>
<td align="center">\V</td>
<td><em>Versão</em></td>
<td>Versão+subversão do Bash (2.00.0)</td>
</tr>
<tr>
<td align="center">\w</td>
<td><em>Working Dir</em></td>
<td>Diretório corrente, caminho completo ($PWD)</td>
</tr>
<tr>
<td align="center">\W</td>
<td><em>Working Dir</em></td>
<td>Diretório corrente, somente o último (basename $PWD)</td>
</tr>
<tr>
<td align="center">\!</td>
<td><em>Histórico</em></td>
<td>Número do comando corrente no histórico</td>
</tr>
<tr>
<td align="center">\#</td>
<td><em>Número</em></td>
<td>Número do comando corrente</td>
</tr>
<tr>
<td align="center">\$</td>
<td><em>ID</em></td>
<td>Mostra "#" se for root, "$" se for usuário normal</td>
</tr>
<tr>
<td align="center">\nnn</td>
<td><em>Octal</em></td>
<td>Caractere cujo octal é nnn</td>
</tr>
<tr>
<td align="center">\\</td>
<td><em>Backslash</em></td>
<td>Barra invertida \ literal</td>
</tr>
<tr>
<td align="center">\[</td>
<td><em>Escapes</em></td>
<td>Inicia uma seqüência de escapes (tipo códigos de cores)</td>
</tr>
<tr>
<td align="center">\]</td>
<td><em>Escapes</em></td>
<td>Termina uma seqüência de escapes</td>
</tr>
</tbody>
</table>
<p><a name="echo"></a></p>
<h2>9. Escapes reconhecidos pelo comando echo</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Escape</th>
<th>Lembrete</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center">\a</td>
<td><em>Alerta</em></td>
<td>Alerta (bipe)</td>
</tr>
<tr>
<td align="center">\b</td>
<td><em>Backspace</em></td>
<td>Caractere Backspace</td>
</tr>
<tr>
<td align="center">\c</td>
<td><em>EOS</em></td>
<td>Termina a string</td>
</tr>
<tr>
<td align="center">\e</td>
<td><em>Escape</em></td>
<td>Caractere Esc</td>
</tr>
<tr>
<td align="center">\f</td>
<td><em>Form feed</em></td>
<td>Alimentação</td>
</tr>
<tr>
<td align="center">\n</td>
<td><em>Newline</em></td>
<td>Linha nova</td>
</tr>
<tr>
<td align="center">\r</td>
<td><em>Return</em></td>
<td>Retorno de carro</td>
</tr>
<tr>
<td align="center">\t</td>
<td><em>Tab</em></td>
<td>Tabulação horizontal</td>
</tr>
<tr>
<td align="center">\v</td>
<td><em>Vtab</em></td>
<td>Tabulação vertical</td>
</tr>
<tr>
<td align="center">\\</td>
<td><em>Backslash</em></td>
<td>Barra invertida \ literal</td>
</tr>
<tr>
<td align="center">\nnn</td>
<td><em>Octal</em></td>
<td>Caractere cujo octal é nnn</td>
</tr>
<tr>
<td align="center">\xnn</td>
<td><em>Hexa</em></td>
<td>Caractere cujo hexadecimal é nn</td>
</tr>
</tbody>
</table>
<p><a name="date"></a></p>
<h2>10. Formatadores do comando date</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Formato</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center"><code>%a</code></td>
<td>Nome do dia da semana abreviado (Dom..Sáb)</td>
</tr>
<tr>
<td align="center"><code>%A</code></td>
<td>Nome do dia da semana (Domingo..Sábado)</td>
</tr>
<tr>
<td align="center"><code>%b</code></td>
<td>Nome do mês abreviado (Jan..Dez)</td>
</tr>
<tr>
<td align="center"><code>%B</code></td>
<td>Nome do mês (Janeiro..Dezembro)</td>
</tr>
<tr>
<td align="center"><code>%c</code></td>
<td>Data completa (Sat Nov 04 12:02:33 EST 1989)</td>
</tr>
<tr>
<td align="center"><code>%y</code></td>
<td>Ano (dois dígitos)</td>
</tr>
<tr>
<td align="center"><code>%Y</code></td>
<td>Ano (quatro dígitos)</td>
</tr>
<tr>
<td align="center"><code>%m</code></td>
<td>Mês (01..12)</td>
</tr>
<tr>
<td align="center"><code>%d</code></td>
<td>Dia (01..31)</td>
</tr>
<tr>
<td align="center"><code>%j</code></td>
<td>Dia do ano (001..366)</td>
</tr>
<tr>
<td align="center"><code>%H</code></td>
<td>Horas (00..23)</td>
</tr>
<tr>
<td align="center"><code>%M</code></td>
<td>Minutos (00..59)</td>
</tr>
<tr>
<td align="center"><code>%S</code></td>
<td>Segundos (00..60)</td>
</tr>
<tr>
<td align="center"><code>%s</code></td>
<td>Segundos desde 1º de Janeiro de 1970</td>
</tr>
<tr>
<td align="center"><code>%%</code></td>
<td>Um % literal</td>
</tr>
<tr>
<td align="center"><code>%t</code></td>
<td>Um TAB</td>
</tr>
<tr>
<td align="center"><code>%n</code></td>
<td>Uma quebra de linha</td>
</tr>
</tbody>
</table>
<p><a name="printf"></a></p>
<h2>11. Formatadores do comando printf</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Formato</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center"><code>%d</code></td>
<td>Número decimal</td>
</tr>
<tr>
<td align="center"><code>%o</code></td>
<td>Número octal</td>
</tr>
<tr>
<td align="center"><code>%x</code></td>
<td>Número hexadecimal (a-f)</td>
</tr>
<tr>
<td align="center"><code>%X</code></td>
<td>Número hexadecimal (A-F)</td>
</tr>
<tr>
<td align="center"><code>%f</code></td>
<td>Número com ponto flutuante</td>
</tr>
<tr>
<td align="center"><code>%e</code></td>
<td>Número em notação científica (e+1)</td>
</tr>
<tr>
<td align="center"><code>%E</code></td>
<td>Número em notação científica (E+1)</td>
</tr>
<tr>
<td align="center"><code>%s</code></td>
<td>String</td>
</tr>
</tbody>
</table>
<p><a name="ls"></a></p>
<h2>12. Letras identificadoras de arquivos no comando ls -l</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Letra</th>
<th>Lembrete</th>
<th>Tipos de Arquivo (primeiro caractere)</th>
</tr>
<tr>
<td align="center">-</td>
<td align="center">-</td>
<td>Arquivo normal</td>
</tr>
<tr>
<td align="center">d</td>
<td align="center">Directory</td>
<td>Diretório</td>
</tr>
<tr>
<td align="center">l</td>
<td align="center">Link</td>
<td>Link simbólico</td>
</tr>
<tr>
<td align="center">b</td>
<td align="center">Block</td>
<td>Dispositivo de blocos (HD)</td>
</tr>
<tr>
<td align="center">c</td>
<td align="center">Char</td>
<td>Dispositivo de caracteres (modem serial)</td>
</tr>
<tr>
<td align="center">s</td>
<td align="center">Socket</td>
<td>Socket mapeado em arquivo (comunicação de processos)</td>
</tr>
<tr>
<td align="center">p</td>
<td align="center">Pipe</td>
<td>FIFO ou Named Pipe (comunicação de processos)</td>
</tr>
<tr>
<th>Letra</th>
<th>Lembrete</th>
<th>Permissões do Arquivo (próximos nove caracteres)</th>
</tr>
<tr>
<td align="center">-</td>
<td align="center">-</td>
<td>Permissão desativada</td>
</tr>
<tr>
<td align="center">r</td>
<td align="center">Read</td>
<td>Acesso de leitura</td>
</tr>
<tr>
<td align="center">w</td>
<td align="center">Write</td>
<td>Acesso de escrita</td>
</tr>
<tr>
<td align="center">x</td>
<td align="center">eXecute</td>
<td>Acesso de execução (ou acesso ao diretório)</td>
</tr>
<tr>
<td align="center">X</td>
<td align="center">eXecute</td>
<td>Acesso ao diretório somente</td>
</tr>
<tr>
<td align="center">s</td>
<td align="center">Set ID</td>
<td>Usuário/grupo para execução (SUID, SGID) - permissão 'x' ativada</td>
</tr>
<tr>
<td align="center">S</td>
<td align="center">Set ID</td>
<td>Usuário/grupo para execução (SUID, SGID) - permissão 'x' desativada</td>
</tr>
<tr>
<td align="center">t</td>
<td align="center">sTicky</td>
<td>Usuários só apagam seus próprios arquivos - permissão 'x' ativada</td>
</tr>
<tr>
<td align="center">T</td>
<td align="center">sTicky</td>
<td>Usuários só apagam seus próprios arquivos - permissão 'x' desativada</td>
</tr>
</tbody>
</table>
<p><a name="glob"></a></p>
<h2>13. Curingas para nomes de arquivo (glob)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Curinga</th>
<th>Casa com...</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center"><code>*</code></td>
<td>Qualquer coisa</td>
<td><code>*.txt</code></td>
</tr>
<tr>
<td align="center"><code>?</code></td>
<td>Um caractere qualquer</td>
<td><code>arquivo-??.zip</code></td>
</tr>
<tr>
<td align="center"><code>[...]</code></td>
<td>Qualquer um dos caracteres listados</td>
<td><code>[Aa]rquivo.txt</code></td>
</tr>
<tr>
<td align="center"><code>[^...]</code></td>
<td>Qualquer um caractere, exceto os listados</td>
<td><code>[^A-Z]*.txt</code></td>
</tr>
<tr>
<td align="center"><code>{...}</code></td>
<td>Qualquer um dos textos separados por vírgula</td>
<td><code>arquivo.{txt,html}</code></td>
</tr>
</tbody>
</table>
<p><a name="case"></a></p>
<h2>14. Curingas para os itens do comando case</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Curinga</th>
<th>Casa com...</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center"><code>*</code></td>
<td>Qualquer coisa</td>
<td align="right"><code>*.txt) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>?</code></td>
<td>Um caractere qualquer</td>
<td align="right"><code>arquivo-??.zip) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>[...]</code></td>
<td>Qualquer um dos caracteres listados</td>
<td align="right"><code>[0-9]) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>[^...]</code></td>
<td>Qualquer um caractere, exceto os listados</td>
<td align="right"><code>[^0-9]) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>...|...</code></td>
<td>Qualquer um dos textos separados por |</td>
<td align="right"><code>txt|html) echo ;;</code></td>
</tr>
</tbody>
</table>
<p><a name="sinais"></a></p>
<h2>15. Sinais para usar com trap/kill/killall</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>#</th>
<th>Linux</th>
<th>Cygwin</th>
<th>SystemV</th>
<th>AIX</th>
<th>HP-UX</th>
<th>Solaris</th>
<th>BSD/Mac</th>
</tr>
<tr>
<td align="right">1</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
</tr>
<tr>
<td align="right">2</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
</tr>
<tr>
<td align="right">3</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
</tr>
<tr>
<td align="right">4</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
</tr>
<tr>
<td align="right">5</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
</tr>
<tr>
<td align="right">6</td>
<td>ABRT</td>
<td>ABRT</td>
<td>IOT</td>
<td>LOST</td>
<td>ABRT</td>
<td>ABRT</td>
<td>ABRT</td>
</tr>
<tr>
<td align="right">7</td>
<td>BUS</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
</tr>
<tr>
<td align="right">8</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
</tr>
<tr>
<td align="right">9</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
</tr>
<tr>
<td>10</td>
<td>USR1</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
</tr>
<tr>
<td>11</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
</tr>
<tr>
<td>12</td>
<td>USR2</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
</tr>
<tr>
<th>#</th>
<th>Linux</th>
<th>Cygwin</th>
<th>SystemV</th>
<th>AIX</th>
<th>HP-UX</th>
<th>Solaris</th>
<th>BSD/Mac</th>
</tr>
<tr>
<td>13</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
</tr>
<tr>
<td>14</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
</tr>
<tr>
<td>15</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
</tr>
<tr>
<td>16</td>
<td>-</td>
<td>URG</td>
<td>USR1</td>
<td>URG</td>
<td>USR1</td>
<td>USR1</td>
<td>URG</td>
</tr>
<tr>
<td>17</td>
<td>CHLD</td>
<td>STOP</td>
<td>USR2</td>
<td>STOP</td>
<td>USR2</td>
<td>USR2</td>
<td>STOP</td>
</tr>
<tr>
<td>18</td>
<td>CONT</td>
<td>TSTP</td>
<td>CHLD</td>
<td>TSTP</td>
<td>CHLD</td>
<td>CHLD</td>
<td>TSTP</td>
</tr>
<tr>
<td>19</td>
<td>STOP</td>
<td>CONT</td>
<td>PWR</td>
<td>CONT</td>
<td>PWR</td>
<td>PWR</td>
<td>CONT</td>
</tr>
<tr>
<td>20</td>
<td>TSTP</td>
<td>CHLD</td>
<td>WINCH</td>
<td>CHLD</td>
<td>VTALRM</td>
<td>WINCH</td>
<td>CHLD</td>
</tr>
<tr>
<td>21</td>
<td>TTIN</td>
<td>TTIN</td>
<td>URG</td>
<td>TTIN</td>
<td>PROF</td>
<td>URG</td>
<td>TTIN</td>
</tr>
<tr>
<td>22</td>
<td>TTOU</td>
<td>TTOU</td>
<td>IO</td>
<td>TTOU</td>
<td>IO</td>
<td>IO</td>
<td>TTOU</td>
</tr>
<tr>
<td>23</td>
<td>URG</td>
<td>IO</td>
<td>STOP</td>
<td>IO</td>
<td>WINCH</td>
<td>STOP</td>
<td>IO</td>
</tr>
<tr>
<td>24</td>
<td>XCPU</td>
<td>XCPU</td>
<td>TSTP</td>
<td>XCPU</td>
<td>STOP</td>
<td>TSTP</td>
<td>XCPU</td>
</tr>
<tr>
<th>#</th>
<th>Linux</th>
<th>Cygwin</th>
<th>SystemV</th>
<th>AIX</th>
<th>HP-UX</th>
<th>Solaris</th>
<th>BSD/Mac</th>
</tr>
<tr>
<td>25</td>
<td>XFSZ</td>
<td>XFSZ</td>
<td>CONT</td>
<td>XFSZ</td>
<td>TSTP</td>
<td>CONT</td>
<td>XFSZ</td>
</tr>
<tr>
<td>26</td>
<td>VTALRM</td>
<td>VTALRM</td>
<td>TTIN</td>
<td>-</td>
<td>CONT</td>
<td>TTIN</td>
<td>VTALRM</td>
</tr>
<tr>
<td>27</td>
<td>PROF</td>
<td>PROF</td>
<td>TTOU</td>
<td>MSG</td>
<td>TTIN</td>
<td>TTOU</td>
<td>PROF</td>
</tr>
<tr>
<td>28</td>
<td>WINCH</td>
<td>WINCH</td>
<td>VTALRM</td>
<td>WINCH</td>
<td>TTOU</td>
<td>VTALRM</td>
<td>WINCH</td>
</tr>
<tr>
<td>29</td>
<td>IO</td>
<td>LOST</td>
<td>PROF</td>
<td>PWR</td>
<td>URG</td>
<td>PROF</td>
<td>INFO</td>
</tr>
<tr>
<td>30</td>
<td>PWR</td>
<td>USR1</td>
<td>XCPU</td>
<td>USR1</td>
<td>LOST</td>
<td>XCPU</td>
<td>USR1</td>
</tr>
<tr>
<td>31</td>
<td>SYS</td>
<td>USR2</td>
<td>XFSZ</td>
<td>USR2</td>
<td>-</td>
<td>XFSZ</td>
<td>USR2</td>
</tr>
<tr>
<td>32</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>PROF</td>
<td>-</td>
<td>WAITING</td>
<td>-</td>
</tr>
<tr>
<td>33</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>DANGER</td>
<td>-</td>
<td>LWP</td>
<td>-</td>
</tr>
<tr>
<td>34</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>VTALRM</td>
<td>-</td>
<td>FREEZE</td>
<td>-</td>
</tr>
<tr>
<td>35</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>MIGRATE</td>
<td>-</td>
<td>THAW</td>
<td>-</td>
</tr>
<tr>
<td>36</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>PRE</td>
<td>-</td>
<td>CANCEL</td>
<td>-</td>
</tr>
<tr>
<td>37</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>LOST</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>Como obter a listagem: trap -l, kill -l ou killall -l<br />
Veja também: <a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?signal+7">man  7 signal</a></p>
<p><a name="exitcode"></a></p>
<h2>16. Códigos de retorno de comandos</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Código</th>
<th>Significado</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center">0</td>
<td>Nenhum erro, execução terminou OK</td>
<td>echo</td>
</tr>
<tr>
<td align="center">1</td>
<td>A maioria dos erros comuns na execução</td>
<td>echo $((1/0))</td>
</tr>
<tr>
<td align="center">2</td>
<td>Erro de uso em algum 'builtin' do Shell</td>
<td>-</td>
</tr>
<tr>
<td align="center">126</td>
<td>Comando não executável (sem permissão)</td>
<td>touch a ; ./a</td>
</tr>
<tr>
<td align="center">127</td>
<td>Comando não encontrado ("command not found")</td>
<td>echooo</td>
</tr>
<tr>
<td align="center">128</td>
<td>O parâmetro para o 'exit' não é um decimal</td>
<td>exit 1.0</td>
</tr>
<tr>
<td align="center">128+n</td>
<td>128 + código do sinal que o matou</td>
<td>kill -9 $PPID #exit 137</td>
</tr>
<tr>
<td align="center">130</td>
<td>O programa interrompido com o Ctrl+C (128 + 2)</td>
<td>-</td>
</tr>
<tr>
<td align="center">255</td>
<td>Parâmetro para o 'exit' não está entre 0 e 255</td>
<td>exit -1</td>
</tr>
</tbody>
</table>
<p><a name="cores"></a></p>
<h2>17. Códigos de cores (ANSI)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Cor</th>
<th>Letra</th>
<th>Fundo</th>
</tr>
<tr>
<td>Preto</td>
<td align="center">30</td>
<td align="center">40</td>
</tr>
<tr>
<td>Vermelho</td>
<td align="center">31</td>
<td align="center">41</td>
</tr>
<tr>
<td>Verde</td>
<td align="center">32</td>
<td align="center">42</td>
</tr>
<tr>
<td>Amarelo</td>
<td align="center">33</td>
<td align="center">43</td>
</tr>
<tr>
<td>Azul</td>
<td align="center">34</td>
<td align="center">44</td>
</tr>
<tr>
<td>Rosa</td>
<td align="center">35</td>
<td align="center">45</td>
</tr>
<tr>
<td>Ciano</td>
<td align="center">36</td>
<td align="center">46</td>
</tr>
<tr>
<td>Branco</td>
<td align="center">37</td>
<td align="center">47</td>
</tr>
<tr>
<th colspan="2">Atributo</th>
<th>Valor</th>
</tr>
<tr>
<td colspan="2">Reset</td>
<td align="center">0</td>
</tr>
<tr>
<td colspan="2">Negrito</td>
<td align="center">1</td>
</tr>
<tr>
<td colspan="2">Sublinhado</td>
<td align="center">4</td>
</tr>
<tr>
<td colspan="2">Piscando</td>
<td align="center">5</td>
</tr>
<tr>
<td colspan="2">Reverso</td>
<td align="center">7</td>
</tr>
<tr>
<th colspan="3">Exemplos: ESC [ &lt;N&gt;;&lt;N&gt; m</th>
</tr>
<tr>
<td colspan="2">Texto normal (desliga cores)</td>
<td align="center"><code>ESC[m</code></td>
</tr>
<tr>
<td colspan="2">Negrito</td>
<td align="center"><code>ESC[1m</code></td>
</tr>
<tr>
<td colspan="2">Amarelo</td>
<td align="center"><code>ESC[33;1m</code></td>
</tr>
<tr>
<td colspan="2">Fundo azul, letra cinza</td>
<td align="center"><code>ESC[44;37m</code></td>
</tr>
<tr>
<td colspan="2">Vermelho piscando</td>
<td align="center"><code>ESC[31;5m</code></td>
</tr>
<tr>
<th colspan="3">Na linha de comando</th>
</tr>
<tr>
<td colspan="3"><code>echo -e '\e[33;1m amarelo \e[m'</code></td>
</tr>
<tr>
<td colspan="3"><code>echo -e '\033[33;1m amarelo \033[m'</code></td>
</tr>
</tbody>
</table>
<p><img src="http://aurelio.net/shell/zzcores.gif" border="0" alt="" align="middle" /></p>
<p><a name="metacaracteres"></a></p>
<h2>18. Os metacaracteres das expressões regulares</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Meta</th>
<th>Nome</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center">.</td>
<td>Ponto</td>
<td>Curinga de um caractere</td>
</tr>
<tr>
<td align="center">[]</td>
<td>Lista</td>
<td>Casa qualquer um dos caracteres listados</td>
</tr>
<tr>
<td align="center">[^]</td>
<td>Lista negada</td>
<td>Casa qualquer caractere, exceto os listados</td>
</tr>
<tr>
<td align="center">?</td>
<td>Opcional</td>
<td>A entidade anterior pode aparecer ou não (opcional)</td>
</tr>
<tr>
<td align="center">*</td>
<td>Asterisco</td>
<td>A entidade anterior pode aparecer em qualquer quantidade</td>
</tr>
<tr>
<td align="center">+</td>
<td>Mais</td>
<td>A entidade anterior deve aparecer no mínimo uma vez</td>
</tr>
<tr>
<td align="center">{,}</td>
<td>Chaves</td>
<td>A entidade anterior deve aparecer na quantidade indicada</td>
</tr>
<tr>
<td align="center">^</td>
<td>Circunflexo</td>
<td>Casa o começo da linha</td>
</tr>
<tr>
<td align="center">$</td>
<td>Cifrão</td>
<td>Casa o fim da linha</td>
</tr>
<tr>
<td align="center">\b</td>
<td>Borda</td>
<td>Limita uma palavra (letras, números e sublinhado)</td>
</tr>
<tr>
<td align="center">\</td>
<td>Escape</td>
<td>Escapa um meta, tirando seu poder</td>
</tr>
<tr>
<td align="center">|</td>
<td>Ou</td>
<td>Indica alternativas (usar com o grupo)</td>
</tr>
<tr>
<td align="center">()</td>
<td>Grupo</td>
<td>Agrupa partes da expressão, é quantificável e multinível</td>
</tr>
<tr>
<td align="center">\1</td>
<td>Retrovisor</td>
<td>Recupera o conteúdo do grupo 1</td>
</tr>
<tr>
<td align="center">\2</td>
<td>Retrovisor</td>
<td>Recupera o conteúdo do grupo 2 (segue até o \9)</td>
</tr>
<tr>
<td align="center">.*</td>
<td>Curinga</td>
<td>Casa qualquer coisa, é o tudo e o nada</td>
</tr>
<tr>
<td align="center">??</td>
<td>Opcional NG</td>
<td>Idem ao opcional comum, mas casa o mínimo possível</td>
</tr>
<tr>
<td align="center">*?</td>
<td>Asterisco NG</td>
<td>Idem ao asterisco comum, mas casa o mínimo possível</td>
</tr>
<tr>
<td align="center">+?</td>
<td>Mais NG</td>
<td>Idem ao mais comum, mas casa o mínimo possível</td>
</tr>
<tr>
<td align="center">{}?</td>
<td>Chaves NG</td>
<td>Idem às chaves comuns, mas casa o mínimo possível</td>
</tr>
</tbody>
</table>
<p><a name="metadif"></a></p>
<h2>19. Metacaracteres que são diferentes nos aplicativos</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Programa</th>
<th>Opc</th>
<th>Mais</th>
<th>Chaves</th>
<th>Borda</th>
<th>Ou</th>
<th>Grupo</th>
</tr>
<tr>
<td>awk</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>ed</td>
<td align="center">\?</td>
<td align="center">\+</td>
<td align="center">\{,\}</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>egrep</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>emacs</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>expect</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>find</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>gawk</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\&lt;\&gt;</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>grep</td>
<td align="center">\?</td>
<td align="center">\+</td>
<td align="center">\{,\}</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>mawk</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>perl</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>php</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>python</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>sed</td>
<td align="center">\?</td>
<td align="center">\+</td>
<td align="center">\{,\}</td>
<td align="center">\&lt;\&gt;</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>vim</td>
<td align="center">\=</td>
<td align="center">\+</td>
<td align="center">\{,}</td>
<td align="center">\&lt;\&gt;</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
</tbody>
</table>
<p><a name="ascii"></a></p>
<h2>20. Caracteres ASCII imprimíveis (ISO-8859-1) - texto</h2>
<pre>$ <a href="http://funcoeszz.net/">zzascii</a>
32        64  @     96  `    162  ¢    194  Â    226  â
33  !     65  A     97  a    163  £    195  Ã    227  ã
34  "     66  B     98  b    164  ¤    196  Ä    228  ä
35  #     67  C     99  c    165  ¥    197  Å    229  å
36  $     68  D    100  d    166  ¦    198  Æ    230  æ
37  %     69  E    101  e    167  §    199  Ç    231  ç
38  &amp;     70  F    102  f    168  ¨    200  È    232  è
39  '     71  G    103  g    169  ©    201  É    233  é
40  (     72  H    104  h    170  ª    202  Ê    234  ê
41  )     73  I    105  i    171  «    203  Ë    235  ë
42  *     74  J    106  j    172  ¬    204  Ì    236  ì
43  +     75  K    107  k    173       205  Í    237  í
44  ,     76  L    108  l    174  ®    206  Î    238  î
45  -     77  M    109  m    175  ¯    207  Ï    239  ï
46  .     78  N    110  n    176  °    208  Ð    240  ð
47  /     79  O    111  o    177  ±    209  Ñ    241  ñ
48  0     80  P    112  p    178  ²    210  Ò    242  ò
49  1     81  Q    113  q    179  ³    211  Ó    243  ó
50  2     82  R    114  r    180  ´    212  Ô    244  ô
51  3     83  S    115  s    181  µ    213  Õ    245  õ
52  4     84  T    116  t    182  ¶    214  Ö    246  ö
53  5     85  U    117  u    183  ·    215  ×    247  ÷
54  6     86  V    118  v    184  ¸    216  Ø    248  ø
55  7     87  W    119  w    185  ¹    217  Ù    249  ù
56  8     88  X    120  x    186  º    218  Ú    250  ú
57  9     89  Y    121  y    187  »    219  Û    251  û
58  :     90  Z    122  z    188  ¼    220  Ü    252  ü
59  ;     91  [    123  {    189  ½    221  Ý    253  ý
60  &lt;     92  \    124  |    190  ¾    222  Þ    254  þ
61  =     93  ]    125  }    191  ¿    223  ß    255  ÿ
62  &gt;     94  ^    126  ~    192  À    224  à
63  ?     95  _    161  ¡    193  Á    225  á
</pre>
<p><a name="asciiimg"></a></p>
<h2>21. Caracteres ASCII imprimíveis (ISO-8859-1) - imagem</h2>
<p><img src="http://aurelio.net/shell/ascii.gif" border="0" alt="" align="middle" /> <a name="codigos"></a></p>
<h2>22. Códigos prontos para copiar e colar</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Condicionais com o IF</th>
</tr>
<tr>
<td><code>if [ -f "$arquivo" ]; then echo 'Arquivo encontrado'; fi</code></td>
</tr>
<tr>
<td><code>if [ ! -d "$dir" ]; then echo 'Diretório não encontrado'; fi</code></td>
</tr>
<tr>
<td><code>if [ $i -gt 5 ]; then echo 'Maior que 5'; else echo 'Menor que  5'; fi</code></td>
</tr>
<tr>
<td><code>if [ $i -ge 5 -a $i -le 10 ]; then echo 'Entre 5 e 10,  incluindo'; fi</code></td>
</tr>
<tr>
<td><code>if [ $i -eq 5 ]; then echo '=5'; elif [ $i -gt 5 ]; then echo  '&gt;5'; else echo '&lt;5'; fi</code></td>
</tr>
<tr>
<td><code>if [ "$USER" = 'root' ]; then echo 'Oi root'; fi</code></td>
</tr>
<tr>
<td><code>if grep -qs 'root' /etc/passwd; then echo 'Usuário  encontrado'; fi</code></td>
</tr>
<tr>
<th>Condicionais com o E (&amp;&amp;) e OU (||)</th>
</tr>
<tr>
<td><code>[ -f "$arquivo" ] &amp;&amp; echo 'Arquivo encontrado'</code></td>
</tr>
<tr>
<td><code>[ -d "$dir" ] || echo 'Diretório não encontrado'</code></td>
</tr>
<tr>
<td><code>grep -qs 'root' /etc/passwd &amp;&amp; echo 'Usuário  encontrado'</code></td>
</tr>
<tr>
<td><code>cd "$dir" &amp;&amp; rm "$arquivo" &amp;&amp; touch "$arquivo"  &amp;&amp; echo 'feito!'</code></td>
</tr>
<tr>
<td><code>[ "$1" ] &amp;&amp; param=$1 || param='valor padrão'</code></td>
</tr>
<tr>
<td><code>[ "$1" ] &amp;&amp; param=${1:-valor padrão}</code></td>
</tr>
<tr>
<td><code>[ "$1" ] || { echo "Uso: $0 parâmetro" ; exit 1 ; }</code></td>
</tr>
<tr>
<th>Adicionar 1 à variável $i</th>
</tr>
<tr>
<td><code>i=$(expr $i + 1)</code></td>
</tr>
<tr>
<td><code>i=$((i+1))</code></td>
</tr>
<tr>
<td><code>let i=i+1</code></td>
</tr>
<tr>
<td><code>let i+=1</code></td>
</tr>
<tr>
<td><code>let i++</code></td>
</tr>
<tr>
<th>Loop de 1 à 10</th>
</tr>
<tr>
<td><code>for i in 1 2 3 4 5 6 7 8 9 10; do echo $i; done</code></td>
</tr>
<tr>
<td><code>for i in $(seq 10); do echo $i; done</code></td>
</tr>
<tr>
<td><code>for ((i=1;i&lt;=10;i++)); do echo $i; done</code></td>
</tr>
<tr>
<td><code>i=1 ; while [ $i -le 10 ]; do echo $i ; i=$((i+1)) ; done</code></td>
</tr>
<tr>
<td><code>i=1 ; until [ $i -gt 10 ]; do echo $i ; i=$((i+1)) ; done</code></td>
</tr>
<tr>
<th>Loop nas linhas de um arquivo ou saída de comando</th>
</tr>
<tr>
<td><code>cat /etc/passwd | while read LINHA; do echo "$LINHA"; done</code></td>
</tr>
<tr>
<td><code>grep 'root' /etc/passwd | while read LINHA; do echo "$LINHA";  done</code></td>
</tr>
<tr>
<td><code>while read LINHA; do echo "$LINHA"; done &lt; /etc/passwd</code></td>
</tr>
<tr>
<td><code>while read LINHA; do echo "$LINHA"; done &lt; &lt;(grep 'root'  /etc/passwd)</code></td>
</tr>
<tr>
<th>Curingas nos itens do comando case</th>
</tr>
<tr>
<td><code>case "$dir" in /home/*) echo 'dir dentro do /home';; esac</code></td>
</tr>
<tr>
<td><code>case "$user" in root|joao|maria) echo "Oi $user";; *) echo  "Não te conheço";; esac</code></td>
</tr>
<tr>
<td><code>case "$var" in ?) echo '1 letra';; ??) echo '2 letras';; ??*)  echo 'mais de 2';; esac</code></td>
</tr>
<tr>
<td><code>case "$i" in [0-9]) echo '1 dígito';; [0-9][0-9]) echo '2  dígitos';; esac</code></td>
</tr>
<tr>
<th>Caixas do Dialog</th>
</tr>
<tr>
<td><code>dialog --calendar 'abc' 0 0 31 12 1999</code></td>
</tr>
<tr>
<td><code>dialog --checklist 'abc' 0 0 0 item1 'desc1' on item2 'desc2'  off</code></td>
</tr>
<tr>
<td><code>dialog --fselect /tmp 0 0</code></td>
</tr>
<tr>
<td><code>(echo 50; sleep 2; echo 100) | dialog --gauge 'abc' 8 40 0</code></td>
</tr>
<tr>
<td><code>dialog --infobox 'abc' 0 0</code></td>
</tr>
<tr>
<td><code>dialog --inputbox 'abc' 0 0</code></td>
</tr>
<tr>
<td><code>dialog --passwordbox 'abc' 0 0</code></td>
</tr>
<tr>
<td><code>dialog --menu 'abc' 0 0 0 item1 'desc1' item2 'desc2'</code></td>
</tr>
<tr>
<td><code>dialog --msgbox 'abc' 8 40</code></td>
</tr>
<tr>
<td><code>dialog --radiolist 'abc' 0 0 0 item1 'desc1' on item2 'desc2'  off</code></td>
</tr>
<tr>
<td><code>dialog --tailbox /tmp/arquivo.txt 0 0</code></td>
</tr>
<tr>
<td><code>dialog --textbox /tmp/arquivo.txt 0 0</code></td>
</tr>
<tr>
<td><code>dialog --timebox 'abc' 0 0 23 59 00</code></td>
</tr>
<tr>
<td><code>dialog --yesno 'abc' 0 0</code></td>
</tr>
<tr>
<td><strong>Dica1:</strong> <code>dialog ... &amp;&amp; echo 'Apertou OK/Yes' ||  echo 'Apertou Cancel/No'</code></td>
</tr>
<tr>
<td><strong>Dica2:</strong> <code>resposta=$(dialog --stdout --TIPODACAIXA 'abc'  ...)</code></td>
</tr>
</tbody>
</table>
<p><a name="emacs"></a></p>
<h2>23. Atalhos da linha de comando (set -o emacs)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Atalho</th>
<th>Descrição</th>
<th>Tecla Similar</th>
</tr>
<tr>
<td>Ctrl+A</td>
<td>Move o cursor para o início da linha</td>
<td align="center">Home</td>
</tr>
<tr>
<td>Ctrl+B</td>
<td>Move o cursor uma posição à esquerda</td>
<td align="center">←</td>
</tr>
<tr>
<td>Ctrl+C</td>
<td>Envia sinal EOF() para o sistema</td>
<td></td>
</tr>
<tr>
<td>Ctrl+D</td>
<td>Apaga um caractere à direita</td>
<td align="center">Delete</td>
</tr>
<tr>
<td>Ctrl+E</td>
<td>Move o cursor para o fim da linha</td>
<td align="center">End</td>
</tr>
<tr>
<td>Ctrl+F</td>
<td>Move o cursor uma posição à direita</td>
<td align="center">→</td>
</tr>
<tr>
<td>Ctrl+H</td>
<td>Apaga um caractere à esquerda</td>
<td align="center">Backspace</td>
</tr>
<tr>
<td>Ctrl+I</td>
<td>Completa arquivos e comandos</td>
<td align="center">Tab</td>
</tr>
<tr>
<td>Ctrl+J</td>
<td>Quebra a linha</td>
<td align="center">Enter</td>
</tr>
<tr>
<td>Ctrl+K</td>
<td>Recorta do cursor até o fim da linha</td>
<td></td>
</tr>
<tr>
<td>Ctrl+L</td>
<td>Limpa a tela (igual ao comando clear)</td>
<td></td>
</tr>
<tr>
<td>Ctrl+N</td>
<td>Próximo comando</td>
<td></td>
</tr>
<tr>
<td>Ctrl+P</td>
<td>Comando anterior</td>
<td></td>
</tr>
<tr>
<td>Ctrl+Q</td>
<td>Destrava a shell (veja Ctrl+S)</td>
<td></td>
</tr>
<tr>
<td>Ctrl+R</td>
<td>Procura no histórico de comandos</td>
<td></td>
</tr>
<tr>
<td>Ctrl+S</td>
<td>Trava a shell (veja Ctrl+Q)</td>
<td></td>
</tr>
<tr>
<td>Ctrl+T</td>
<td>Troca dois caracteres de lugar</td>
<td></td>
</tr>
<tr>
<td>Ctrl+U</td>
<td>Recorta a linha inteira</td>
<td></td>
</tr>
<tr>
<td>Ctrl+V</td>
<td>Insere caractere literal</td>
<td></td>
</tr>
<tr>
<td>Ctrl+W</td>
<td>Recorta a palavra à esquerda</td>
<td></td>
</tr>
<tr>
<td>Ctrl+X</td>
<td>Move o cursor para o início/fim da linha (2x)</td>
<td align="center">Home/End</td>
</tr>
<tr>
<td>Ctrl+Y</td>
<td>Cola o trecho recortado</td>
<td></td>
</tr>
</tbody>
</table>
<p><a name="ferramentas"></a></p>
<h2>24. A caixa de ferramentas do shelleiro</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Comando</th>
<th>Função</th>
<th>Opções úteis</th>
</tr>
<tr>
<td align="center"><strong>cat</strong></td>
<td><em>Mostra arquivo</em></td>
<td>-n, -s</td>
</tr>
<tr>
<td align="center"><strong>cut</strong></td>
<td><em>Extrai campo</em></td>
<td>-d -f, -c</td>
</tr>
<tr>
<td align="center"><strong>date</strong></td>
<td><em>Mostra data</em></td>
<td>-d, +'...'</td>
</tr>
<tr>
<td align="center"><strong>diff</strong></td>
<td><em>Compara arquivos</em></td>
<td>-u, -Nr, -i, -w</td>
</tr>
<tr>
<td align="center"><strong>echo</strong></td>
<td><em>Mostra texto</em></td>
<td>-e, -n</td>
</tr>
<tr>
<td align="center"><strong>find</strong></td>
<td><em>Encontra arquivos</em></td>
<td>-name, -iname, -type f, -exec, -or</td>
</tr>
<tr>
<td align="center"><strong>fmt</strong></td>
<td><em>Formata parágrafo</em></td>
<td>-w, -u</td>
</tr>
<tr>
<td align="center"><strong>grep</strong></td>
<td><em>Encontra texto</em></td>
<td>-i, -v, -r, -qs, -n, -l, -w -x, -A -B -C</td>
</tr>
<tr>
<td align="center"><strong>head</strong></td>
<td><em>Mostra Início</em></td>
<td>-n, -c</td>
</tr>
<tr>
<td align="center"><strong>od</strong></td>
<td><em>Mostra Caracteres</em></td>
<td>-a, -c, -o, -x</td>
</tr>
<tr>
<td align="center"><strong>paste</strong></td>
<td><em>Paraleliza arquivos</em></td>
<td>-d, -s</td>
</tr>
<tr>
<td align="center"><strong>printf</strong></td>
<td><em>Mostra texto</em></td>
<td><em>nenhuma</em></td>
</tr>
<tr>
<td align="center"><strong>rev</strong></td>
<td><em>Inverte texto</em></td>
<td><em>nenhuma</em></td>
</tr>
<tr>
<td align="center"><strong>sed</strong></td>
<td><em>Edita texto</em></td>
<td>-n, -f, s/isso/aquilo/, p, d, q, N</td>
</tr>
<tr>
<td align="center"><strong>seq</strong></td>
<td><em>Conta Números</em></td>
<td>-s, -f</td>
</tr>
<tr>
<td align="center"><strong>sort</strong></td>
<td><em>Ordena texto</em></td>
<td>-n, -f, -r, -k -t, -o</td>
</tr>
<tr>
<td align="center"><strong>tac</strong></td>
<td><em>Inverte arquivo</em></td>
<td><em>nenhuma</em></td>
</tr>
<tr>
<td align="center"><strong>tail</strong></td>
<td><em>Mostra Final</em></td>
<td>-n, -c, -f</td>
</tr>
<tr>
<td align="center"><strong>tee</strong></td>
<td><em>Arquiva fluxo</em></td>
<td>-a</td>
</tr>
<tr>
<td align="center"><strong>tr</strong></td>
<td><em>Transforma texto</em></td>
<td>-d, -s, A-Z a-z</td>
</tr>
<tr>
<td align="center"><strong>uniq</strong></td>
<td><em>Remove duplicatas</em></td>
<td>-i, -d, -u</td>
</tr>
<tr>
<td align="center"><strong>wc</strong></td>
<td><em>Conta Letras</em></td>
<td>-c, -w, -l, -L</td>
</tr>
<tr>
<td align="center"><strong>xargs</strong></td>
<td><em>Gerencia argumentos</em></td>
<td>-n, -i</td>
</tr>
</tbody>
</table>
<p>Fonte: http://aurelio.net/shell</p>



<p>No related posts.</p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aumentando o tamanho de partições LVM</title>
		<link>http://blog.deserv.info/2010/05/30/aumentando-o-tamanho-de-particoes-lvm/</link>
		<comments>http://blog.deserv.info/2010/05/30/aumentando-o-tamanho-de-particoes-lvm/#comments</comments>
		<pubDate>Sun, 30 May 2010 17:18:08 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Gerenciamento de Arquivos]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Aumentando o tamanho de partições LVM]]></category>
		<category><![CDATA[Aumentando partições LVM]]></category>
		<category><![CDATA[LVM]]></category>
		<category><![CDATA[Partições LVM]]></category>
		<category><![CDATA[Sistemas de Arquivos]]></category>
		<category><![CDATA[Trabalhando com LVM]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=391</guid>
		<description><![CDATA[Para aumentar o tamanho de uma partição é preciso primeiro ver seu tamanho e a disponibilidade de espaço no volume group. Para verificar quais são os volumes lógicos utiliza-se o comando: lvdisplay O espaço disponivel pode ser visto com o comando: vgdisplay No exemplo abaixo aumenta-se o volume lógico lv em 2 GB: lvextend -L [...]


No related posts.

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Para aumentar o tamanho de uma partição é preciso primeiro ver seu tamanho e a disponibilidade de espaço no volume group. <span id="more-391"></span></p>
<p>Para verificar quais são os volumes lógicos utiliza-se o comando:</p>
<pre>lvdisplay
</pre>
<p>O espaço disponivel pode ser visto com o comando:</p>
<pre>vgdisplay
</pre>
<p>No exemplo abaixo aumenta-se o volume lógico lv em 2 GB:</p>
<pre>lvextend -L +2G /dev/vg/lv
</pre>
<p>Pronto a partição já foi aumentada. O único problema é que o sistema de arquivos ainda não sabe disso. Execute o próximo passo de acordo com o seu sistema de arquivos:</p>
<ul>
<li>Sistemas de arquivos XFS (pode ser executado com o sistema on-line, ou seja, com a partição montada):</li>
</ul>
<pre>xfs_growfs /home
</pre>
<ul>
<li>Sistemas de arquivos ReiserFS (pode ser executado com o sistema on-line, ou seja, com a partição montada). Neste caso deve-se especificar o <strong>nome do dispositivo</strong>:</li>
</ul>
<pre>resize_reiserfs -f /dev/rootvg/home
</pre>
<ul>
<li>Sistemas de arquivos EXT3:</li>
</ul>
<pre style="text-align: left;">umount /home
resize2fs /dev/rootvg/home
mount /dev/rootvg/home /home
<pre style="text-align: right;">Fonte: http://wiki.sj.cefetsc.edu.br/</pre>
</pre>



<p>No related posts.</p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/30/aumentando-o-tamanho-de-particoes-lvm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurando Apache para Performance Maxima</title>
		<link>http://blog.deserv.info/2010/05/25/configurando-apache-para-performance-maxima/</link>
		<comments>http://blog.deserv.info/2010/05/25/configurando-apache-para-performance-maxima/#comments</comments>
		<pubDate>Tue, 25 May 2010 03:44:09 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Configurando]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NetCraft]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Perfomance]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=389</guid>
		<description><![CDATA[Introdução Apache é a implementação open source de um servidor HTTP. Ele é o webserver mais popular na Internet. Uma pesquisa realizada em 2005 pela NetCraft mostra que cerca de 70% dos sites na Internet rodam sobre o Apache. Opções de Configuração em tempo de Compilação Carrege apenas os módulos necessários O servidor Apache é [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/15/reverse-proxy-performance-%e2%80%93-varnish-vs-squid-part-1/' rel='bookmark' title='Permanent Link: Reverse Proxy Performance – Varnish vs. Squid (Part 1)'>Reverse Proxy Performance – Varnish vs. Squid (Part 1)</a> <small>Typical web applications require dozens of SQL queries to generate...</small></li>
<li><a href='http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/' rel='bookmark' title='Permanent Link: Integração simples do Apache 2 com Tomcat 5'>Integração simples do Apache 2 com Tomcat 5</a> <small>Tutorial Basico de integração do Apache 2 com Tomcat. Instalando...</small></li>
<li><a href='http://blog.deserv.info/2010/02/20/servidor-web-apache-dicas-e-tutoriais/' rel='bookmark' title='Permanent Link: Servidor web &#8211; Apache &#8211; dicas e tutoriais'>Servidor web &#8211; Apache &#8211; dicas e tutoriais</a> <small>Sobre este documento Versão simplificada do documento em formato texto,...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<h2>Introdução</h2>
<p>Apache é a implementação open source de um servidor HTTP. Ele é o webserver mais popular na Internet. Uma pesquisa realizada em 2005 pela NetCraft mostra que cerca de 70% dos sites na Internet rodam sobre o Apache.</p>
<p><span id="more-389"></span><a id="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_tempo_de_Compila.C3.A7.C3.A3o" name="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_tempo_de_Compila.C3.A7.C3.A3o"></a></p>
<h2>Opções de Configuração em tempo de Compilação</h2>
<p><a id="Carrege_apenas_os_m.C3.B3dulos_necess.C3.A1rios" name="Carrege_apenas_os_m.C3.B3dulos_necess.C3.A1rios"></a></p>
<h3>Carrege apenas os módulos necessários</h3>
<p>O servidor Apache é um programa modular onde o administrador pode escolher entre as funcinalidade que deseja incluir no servidor selecionando um pacote de módukis. Os módulos podem ser compilados estaticamente no binário httpd ou dinamicamente como DSOs(Dynamic Shared Objects). Módulos DSO podem ser compilados quando o servidor for compilado ou poem ser compilados utilizando o apxs para adicioná-los mais tarde. O modulo mod_so deve ser compilado estaticamente no Apache para que o suporte a DSO seja ativo.</p>
<p>Execute o apache apenas com os módulos necessários. Isto reduz o consumo de memória aumenta a performance do servidor. Compilar os módulos estaticamente irá reduzir o consumo de RAM que é utilizado para suportar módulos compilados dinamicamente, mas será necessário recompilar o apache toda vez que um módulo for adicionado ou removido. È aqui que o DSO se torna útil. Uma vez que o modulo mod_so seja compilado estaticamente, qualquer outro módulo pode ser inserido ou removido utilizando o comando LoadModule no arquivo httpd.conf &#8211; , mas você terá que compilar os módulos utilizando apxs se ele não foi compilado quando o servidor foi feito.</p>
<p><a id="Escolha_o_MPM_apropriado" name="Escolha_o_MPM_apropriado"></a></p>
<h3>Escolha o MPM apropriado</h3>
<p>O apache vem com uma selação de Módulos Multi-Processadores (MPMs) que são responsáveis por abrir as portas de rede na máquina, aceitando requisições, e despachando processos para cuidar das requisições. Apenas um MPM pode ser carregado por vez.</p>
<p>Escolher o MPM depende de vários fatores, por exemplo se o SO suporta threads, quanta memória está disponível, escalabilidade versus estabilidade, modulos externos,etc .. Sistemas Linux podem escolher entr utilizar um MPM com suporte (worker) a threads ou um prefork sem threads:</p>
<p>O MPM Worker utiliza múltiplos processos. Ele é multi-threaded com cada processo e cada thread cuidando de uma única conexão. Esté é mais rápido e mais escalável e a memória consumida e relativamente baixa. Funciona bem com múltiplos processadores. Porém, o worker é menos tolerante a módulos defeituosos, e threads defeituosas podem afetar todas as outras threads de um processo.</p>
<p>O MPM Prefork utiliza múltiplos processos filhos, cada filho cuidad de apenas uma conexão por vez. Prefork é muito bem gerenciada por processadores simples ou múlitplos, a velocidade é comparável ao worker e é mais tolerante a falhas em modulos e processos que terminam inesperadamente. Mas o consumo de memória é alto, mais tráfego leva a mais consumo de memória.</p>
<p><a id="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_Tempo_de_Execu.C3.A7.C3.A3o" name="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_Tempo_de_Execu.C3.A7.C3.A3o"></a></p>
<h2>Opções de Configuração em Tempo de Execução</h2>
<p><a id="DNS_lookup" name="DNS_lookup"></a></p>
<h3>DNS lookup</h3>
<p>A diretiva HostnameLookips habilita a consulta de DNS, então os hostnames podem ser logados ao invés de endereços IP. Isto adiciona latência em cada requisição desde que a consulta do DNS tem que ser completada antes que a requisição seja terminada. Esta opção é desabilitada por padrão no Apache 1.3 e superiores. Deixe isto inativo e utilize programas pós-processamento como o logresolve para determinar os IPs dos logs. Logresolve vem com Apache.</p>
<p>Quando utilizar as diretivas Allow from ou Deny from, utilize endereços IP ao invés de nomes de domínios. Caso contrário uma consulta dupla ao DNS será executada para ter certeza de que o domínio ou host não está sendo spoofado.</p>
<p><a id="AllowOverride" name="AllowOverride"></a></p>
<h3>AllowOverride</h3>
<p>Se o AllowOverride está setado para &#8216;None&#8217;, então o Apache irá tentar abrir o arquivo .htaccess (especificada pela diretiva AccessFileName) em cada diretório que for acessado. Por exemplo:</p>
<pre>DocumentRoot /var/www/html
&lt;Directory /&gt;
AllowOverride all
&lt;/Directory&gt;

Se uma requisição for feita para acessar /index.html, o Apache irá tentar abrir /.htaccess, /var/.htaccess, /var/www/.htaccess, and /var/www/html/.htaccess. Estas tentativas aumentam a latência. Se o arquivo .htaccess for necessário para um diretório, habilite apenas para este diretório.
<a id="FollowSymLinks_e_SymLinksIfOwnerMatch" name="FollowSymLinks_e_SymLinksIfOwnerMatch"></a>
<h3> FollowSymLinks e SymLinksIfOwnerMatch</h3>

Se a opção FollowSymLinks estiver setada, então o servidor permitirá que links simbólicos possam ser seguidos neste diretório. Se a opção SymLinksIfOwnerMatch estiver setada, então o servidor permitirá acessar o link apenas se o destino dele bater com o dono do link.

Se a opção SymLinksIfOwnerMatch estiver setada, então o Apache terá que realizar consultas adicionais ao sistema para verificar se os donos coincidem. Chamadas adicionais também são necessárias quando a opção FollowSymLinks NÃO está setada. Por exemplo:
<pre>DocumentRoot /vaw/www/html
&lt;Directory /&gt;
Options SymLinksIfOwnerMatch
&lt;/Directory&gt;
Para uma requisição feita para /index.html, o Apache irá executar lstat() em /var, /var/www, /var/www/html, and /var/www/html/index.html. Estas requisições adicionais também irão aumentar a lantência. Os resultados do lstat não são cacheados, então as consultas irão ocorrer em cada requisição.

Para uma máxima performance, sete FollowSymLinks em cada lugar e nunca sete SymLinksIfOwnerMatch. Ou então, se SymLinksIfOwnerMatch for necessário para um diretório, sete ele para apenas este diretório.
<a id="Content_Negotiation" name="Content_Negotiation"></a>
<h3> Content Negotiation</h3>

Evite utilizar content negotiation para respostas mais rápidas. Se content negotiation é necessário para o site, utilize arquivos type-map ao invés da diretiva Options MultiViews. Com MultiViews, Apache precisa scanear o diretório em busca de arquivos, o que adiciona latência.
<a id="MaxClients" name="MaxClients"></a>
<h3> MaxClients</h3>

O MaxClients seta o número máximo de clientes simultâneos que pode ser suportada por cada servidor. Nenhum processo além do que está definido será aberto. Ele não deve conter um número muito baixo já que as requisições serão colacadas em fila, o que eventualmente irá dar time-out e os recursos do servidor continuarão não utilizados. Setar este valor muito alto irá causar o início de swap e o tempo de resposta irá cair drasticamente. O valor apropriado para MaxClientes pode ser calculado por: MaxClientes = Total RAM / Tamanho Máximo de Processos . O tamanho dos processos para arquivos estáticos é de mais ou menos 2-3MB. Para dinâmicos como PHP, deve ser por volta de 15MB. A coluna RSS de:
<pre># ps -ylC httpd --sort:rss
Mostra a memória física non-swapped utilizada pelos processos do Apache em kilo Bytes.

Se existem mais usuários concorrentes do que MaxClients, as requisições serão colocadas em fila até o número baseado na diretiva ListenBacklog. Aumente o ServerLimit para setar o MaxClients acima de 256.
<a id="MinSpareServers.2C_MaxSpareServers.2C_e_StartServers" name="MinSpareServers.2C_MaxSpareServers.2C_e_StartServers"></a>
<h3> MinSpareServers, MaxSpareServers, e StartServers</h3>

MaxSpareServers e MinSpareServers determina quantos processos filhos devem ser mantidos rodando. Se MinSpareServers for muito baixo e muitas requisições forem iniciadas, então o Apache terá que abrir processos adicionais para atender as requisições. Criar processos filhos é relativamente caro. Se o servidor estiver ocupado criando processos, ele não estará disponível para servir as requisições imediatamente. MaxSpareServers não deve ser muito alto, ele pode causar problemas de recursos desde que cada processo consome os recursos da máquina.

Sete MinSpareServers e MaxSpareServers para um valor com que o Apache não precise frequentemente abrir mais de 4 processos por segundo. (O Apache pode abrir o máximo de 32 processos por segundo). Quando mais de 4 processos por segundo forem abertos, uma mensagem será logada no ErrorLog.

A diretiva StartServers define o número de processos criados na inicialização do Apache. O Apache irá continuar abrir os processos até que alcance o número de MinSpareServers. Não afeta muito a performance já que o servidor não é reiniciado frequentemente. Se existem muitas requisições e o Apache é reiniciado frequentemente, sete este valor para um número alto.
<a id="MaxRequestsPerChild" name="MaxRequestsPerChild"></a>
<h3> MaxRequestsPerChild</h3>

A diretiva MaxRequestsPerChild definie o número de requisições que um processo do servidor irá gerenciar. Depois as requisições MaxRequestsPerChild irão morrer. É definido para 0 por padrão, o que significa que o processo não irá expirar nunca. É apropriado setar este valor para alguns milhares. Isto pode ajudar a previnir vazamento de memória desde que o processo morre depois de servir um número de requisições. Não sete este valor muito baixo, já que criar novos processos causa overhead.
<a id="KeepAlive_and_KeepAliveTimeout" name="KeepAlive_and_KeepAliveTimeout"></a>
<h3> KeepAlive and KeepAliveTimeout</h3>

A diretiva KeepAilve permite que múltiplas requisições possam ser enviadas pela mesma conexão TCP. Isto é útil para páginas com muitas imagens. Se o KeepAlive estiver Off, então para cada imagem, uma nova conexão TCP precisa ser aberta.

KeepAliveTimeout determinada quanto tempo deve esperar até a próxima requisição. Sete para um valor baixo, por volta de 2 a 5 segundos. Se for setado para um valor muito alto, os processos ficam amarrados esperando pelo cliente quando eles poderiam ser utilizados para servir novos clientes.
<a id="Compress.C3.A3o_HTTP_.26_Caching" name="Compress.C3.A3o_HTTP_.26_Caching"></a>
<h2> Compressão HTTP &amp; Caching</h2>

O servidor utiliza os métodos gzip ou deflate para as respostas payload antes que ele seja enviado para os clientes. Então o cliente descompacta o payload. Não existe necessidade de instalar softwares adicionais no lado do cliente desde que a maioria dos navegadores suporta isto. Utilizar compressão irá economizar banda e irá aumentar o tempo de resposta, estudos mostram que em média o ganho da compressão é de 75%. A compressão pode ser habilitada utilizando módulo mod_deflate. O Payload é compactado apenas se o navegador requisitar a compactação, ou então o conteúdo descompactado será enviado. Um navegador capaz de utilizar o conteúdo compactado envia o seguinte cabeçalho na requisição: "Accept-Encoding: gzip,deflate". Então o servidor irá enviar o payload compactado e o cabeçalho da reposta é "Content-Encoding: gzip"

O exemplo a seguir utiliza o telnet para verificar os cabeçalhos de requisição e de resposta:
<pre>bash-3.00$ telnet www.webperformance.org 80
Trying 24.60.234.27...
Connected to www.webperformance.org (24.60.234.27).
Escape character is '^]'.
HEAD / HTTP/1.1
Host: www.webperformance.org
Accept-Encoding: gzip,deflate

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 02:29:22 GMT
Server: Apache/2.0
X-Powered-By: PHP/5.1.1
Cache-Control: max-age=0
Expires: Sat, 31 Dec 2005 02:29:22 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html; charset=ISO-8859-1 

O module mod_cache pode ser utilizado no lado do servidor, está em produção estável na versão 2.2 do Apache.
<h2> Servidor separado para conteúdo estático e dinâmico</h2>

Processos do apache para conteúdo dinâmico consome cerca de 3-20MB de RAM. E cresce para acomodar o conteúdo e nunca diminui até que o processo termine. Digamos que um processo cresca até os 20MB para servir um conteúdo dinâmico. Depois de completar a requisição, ele está libre para servir outra requisição. Se vier uma requisição para uma imagem, então esses 20MB de processos está servindo um conteúdo estático que poderia ser executado por um processo de 1MB. A memória é utilizada ineficientemente.

Utilize uma pequena compilação do Apache (com o mínimo de módulos compilados estaticamente) como sendo o servidor front-end para servir conteúdos estáticos. As requisições para conteúdos dinâmicos serão encaminhadas para um apache robusto (compilado com todos os módulos necessários). Utilizar um servidor front-end leve tem a vantagem de que os conteúdos estáticos são enviados rapidamente sem o consumo alto de memória e apenas o conteúdo dinâmico é passado para o servidor robusto.

Encaminhamento de requisições pode ser implementado utilizando os módulos mod_proxy e mod_rewrite. Suponha que exista um servidor apache leve rodando na porta 80 e o robusto na porta 8088. Então a configuração a seguir pode ser utilizada no apache leve para encaminhar todas as requisições de conteúdo dinâmico para o servidor robusto.
<pre>ProxyPassReverse / http://%{HTTP_HOST}:8088/
RewriteEngine on
RewriteCond   %{REQUEST_URI} !.*\.(gif|png|jpg)$
RewriteRule ^/(.*) http://%{HTTP_HOST}:8088/$1 [P]
Todas as requisições, exceto as imagens serão encaminhadas para o apache robusto. As respostas são recebidas pelo servidor front-end que as encaminha para o cliente. Todas as respostas aparentam vir de um único servidor. <a id="Conclus.C3.A3o" name="Conclus.C3.A3o"></a>
<h2> Conclusão</h2>

Configurar o Apache para obter o máximo de performance pode ser traiçoeiro, não existem regras rápidas. Entenda as necessidades do servidor web e experimente com várias opções. Utiliza ferramentas como ab e httperf para medir a performance do servidor. Servidores leves como tux, thttpd também podem ser utilizados como servidores front-end. Se um servidor de banco de dados é utilizado, tenha certeza de que ele está otimizado para que ele não crie nenhum gargalo. No caso do MySQL, mtop pode ser utilizado para monitorar querys lentas. Performance de scripts PHP pode ser melhorada utilizando produtos de cache como o Turck MMCache. Ele elimina o overhead da compilação realizando cache dos scripts em seu estado compilado. <a id="Bibliografia" name="Bibliografia"></a>
<h2> Bibliografia</h2>

<a title="http://news.netcraft.com/archives/web_server_survey.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_news_netcraft_com_archives_web_server_survey_html', 1]);" rel="nofollow" href="http://news.netcraft.com/archives/web_server_survey.html">http://news.netcraft.com/archives/web_server_survey.html</a>
<a title="http://httpd.apache.org/docs/2.2/dso.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_httpd_apache_org_docs_2_2_dso_html', 1]);" rel="nofollow" href="http://httpd.apache.org/docs/2.2/dso.html">http://httpd.apache.org/docs/2.2/dso.html</a>
<a title="http://httpd.apache.org/docs/2.2/mpm.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_httpd_apache_org_docs_2_2_mpm_html', 1]);" rel="nofollow" href="http://httpd.apache.org/docs/2.2/mpm.html">http://httpd.apache.org/docs/2.2/mpm.html</a>
<a title="http://modperlbook.org/html/ch11_01.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_modperlbook_org_html_ch11_01_html', 1]);" rel="nofollow" href="http://modperlbook.org/html/ch11_01.html">http://modperlbook.org/html/ch11_01.html</a>
<a title="http://www.speedupyoursite.com/18/18-2t.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_speedupyoursite_com_18_18_2t_html', 1]);" rel="nofollow" href="http://www.speedupyoursite.com/18/18-2t.html">http://www.speedupyoursite.com/18/18-2t.html</a>
<a title="http://www.xs4all.nl/~thomas/apachecon/PerformanceTuning.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_xs4all_nl_thomas_apachecon_PerformanceTuning_html', 1]);" rel="nofollow" href="http://www.xs4all.nl/%7Ethomas/apachecon/PerformanceTuning.html">http://www.xs4all.nl/~thomas/apachecon/PerformanceTuning.html</a>
<a title="http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_onlamp_com_pub_a_onlamp_2004_02_05_lamp_tuning_html', 1]);" rel="nofollow" href="http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html">http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html</a>
<a title="http://httpd.apache.org/docs/2.2/misc/perf-tuning.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_httpd_apache_org_docs_2_2_misc_perf_tuning_html', 1]);" rel="nofollow" href="http://httpd.apache.org/docs/2.2/misc/perf-tuning.html">http://httpd.apache.org/docs/2.2/misc/perf-tuning.html</a>
Linux Server Hacks by Rob Flickenger <a id="Fonte" name="Fonte"></a>
<h2> Fonte</h2>
<ul>
<li><a title="http://www.howtoforge.net/configuring_apache_for_maximum_performance" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_howtoforge_net_configuring_apache_for_maximum_performance', 1]);" rel="nofollow" href="http://www.howtoforge.net/configuring_apache_for_maximum_performance">http://www.howtoforge.net/configuring_apache_for_maximum_performance</a></li>
<li>http://under-linux.org/wiki/</li>
</ul>
</pre>
</pre>
</pre>
</pre>
</pre>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/15/reverse-proxy-performance-%e2%80%93-varnish-vs-squid-part-1/' rel='bookmark' title='Permanent Link: Reverse Proxy Performance – Varnish vs. Squid (Part 1)'>Reverse Proxy Performance – Varnish vs. Squid (Part 1)</a> <small>Typical web applications require dozens of SQL queries to generate...</small></li>
<li><a href='http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/' rel='bookmark' title='Permanent Link: Integração simples do Apache 2 com Tomcat 5'>Integração simples do Apache 2 com Tomcat 5</a> <small>Tutorial Basico de integração do Apache 2 com Tomcat. Instalando...</small></li>
<li><a href='http://blog.deserv.info/2010/02/20/servidor-web-apache-dicas-e-tutoriais/' rel='bookmark' title='Permanent Link: Servidor web &#8211; Apache &#8211; dicas e tutoriais'>Servidor web &#8211; Apache &#8211; dicas e tutoriais</a> <small>Sobre este documento Versão simplificada do documento em formato texto,...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/25/configurando-apache-para-performance-maxima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IntroPython</title>
		<link>http://blog.deserv.info/2010/05/21/intropython/</link>
		<comments>http://blog.deserv.info/2010/05/21/intropython/#comments</comments>
		<pubDate>Fri, 21 May 2010 17:43:08 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Linguagem de Programação]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=387</guid>
		<description><![CDATA[Guia de Introdução à Linguagem Python
Apresentação

Bem-vindo(a) ao nosso guia de introdução à linguagem Python. Este guia exige que se tenha noção de linguagens de programação e para isso é necessário saber o que são algoritmos e estruturas de dados. Quem já programou em uma outra linguagem, como Visual Basic, Delphi ou C poderá se sentir mais apto a programar em Python com esse guia.

Quem sabe você tem dúvidas conceituais sobre a linguagem. Se for este o seu caso, faça uma leitura na seção de Perguntas e Respostas freqüentes sobre Python.

Pronto para começar? Talvez não, porque é necessário ter certeza que o interpretador Python está instalado na sua máquina. Se você utiliza o Mac OS X, Linux ou outro sistema tipo o Unix então a resposta é provavelmente sim, pois esses sistemas constumam vir com o Python pré-instalado. Se você utiliza o Windows é quase certo que você não tem o interpretador. Para verificar, abra um terminal e digite o comando python -V, uma típica resposta será

Dharma:~ ruda$ python -V Python 2.5

indicando que eu tenho instalado a versão 2.5 da linguagem Python.




No related posts.

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Guia de Introdução à Linguagem Python<br />
Apresentação</p>
<p>Bem-vindo(a) ao nosso guia de introdução à linguagem Python. Este guia  exige que se tenha noção de linguagens de programação e para isso é  necessário saber o que são algoritmos e estruturas de dados. Quem já  programou em uma outra linguagem, como Visual Basic, Delphi ou C poderá  se sentir mais apto a programar em Python com esse guia.</p>
<p>Quem sabe você tem dúvidas conceituais sobre a linguagem. Se for este o  seu caso, faça uma leitura na seção de Perguntas e Respostas freqüentes  sobre Python.</p>
<p>Pronto para começar? Talvez não, porque é necessário ter certeza que o  interpretador Python está instalado na sua máquina. Se você utiliza o  Mac OS X, Linux ou outro sistema tipo o Unix então a resposta é  provavelmente sim, pois esses sistemas constumam vir com o Python  pré-instalado. Se você utiliza o Windows é quase certo que você não tem o  interpretador. Para verificar, abra um terminal e digite o comando  python -V, uma típica resposta será</p>
<p>Dharma:~ ruda$ python -V Python 2.5</p>
<p>indicando que eu tenho instalado a versão 2.5 da linguagem Python. <span id="more-387"></span></p>
<p>1. Guia de Introdução à Linguagem Python<br />
1. Apresentação<br />
2. Primeiras Idéias<br />
3. Modo interativo<br />
4. Tipos de dados, constantes, variáveis e expressões<br />
1. Tipos simples<br />
2. Tipos agrupados<br />
3. Tipos mutáveis e imutáveis<br />
4. Listas<br />
5. Estuturas de controle<br />
1. if<br />
2. else<br />
3. elif<br />
4. Modificador not<br />
5. Tabela de expressões válidas<br />
6. Modificador in<br />
6. Estruturas de iteração ou loop<br />
1. for<br />
2. while<br />
7. Funções<br />
8. Arquivos<br />
9. Tratamento de erros e exceções<br />
1. Raise<br />
10. Módulos<br />
1. Módulos distribuídos com o Python<br />
11. Packages<br />
12. Classes<br />
13. Herança<br />
14. Namespaces<br />
1. Nomes não qualificados<br />
2. Nomes qualificados<br />
15. List Comprehensions<br />
16. Generators<br />
1. Generator Expressions<br />
17. Um exemplo Completo<br />
18. Próximos passos</p>
<p>Guia de Introdução à Linguagem Python<br />
Apresentação</p>
<p>Bem-vindo(a) ao nosso guia de introdução à linguagem Python. Este guia exige que se tenha noção de linguagens de programação e para isso é necessário saber o que são algoritmos e estruturas de dados. Quem já programou em uma outra linguagem, como Visual Basic, Delphi ou C poderá se sentir mais apto a programar em Python com esse guia.</p>
<p>Quem sabe você tem dúvidas conceituais sobre a linguagem. Se for este o seu caso, faça uma leitura na seção de Perguntas e Respostas freqüentes sobre Python.</p>
<p>Pronto para começar? Talvez não, porque é necessário ter certeza que o interpretador Python está instalado na sua máquina. Se você utiliza o Mac OS X, Linux ou outro sistema tipo o Unix então a resposta é provavelmente sim, pois esses sistemas constumam vir com o Python pré-instalado. Se você utiliza o Windows é quase certo que você não tem o interpretador. Para verificar, abra um terminal e digite o comando python -V, uma típica resposta será</p>
<p>Dharma:~ ruda$ python -V Python 2.5</p>
<p>indicando que eu tenho instalado a versão 2.5 da linguagem Python.</p>
<p>Se você tem o Windows é um bom momento para baixar o instalador da linguagem Python, que pode ser obtido em http://www.python.org/ftp/python/2.5.2/python-2.5.2.msi<br />
Primeiras Idéias</p>
<p>Se você NUNCA programou antes, é necessário entender alguns conceitos básicos.</p>
<p>Por exemplo: você sabe o que é um &#8220;executável&#8221; certo? Experimente abrir um arquivo desses em algum editor de textos. A não ser que você tenha vivido anos na Matrix, não entenderá nada!</p>
<p>Isso acontece porque o programa está escrito, ali, em linguagem de máquina, ou seja, apesar de você não entender nada, o computador entende muito bem.</p>
<p>Mas não pense que alguém escreveu aquilo do jeito que está. Também não foi escrito ao estilo &#8220;morse&#8221; (10010010110)&#8230; inicialmente, o programador escreveu o que chamamos de &#8220;código-fonte&#8221; em alguma linguagem de programação, como C, C++, Pascal, e, depois de terminado, compilou o código, ou seja, traduziu de C, C++, Pascal para linguagem de máquina (também chamada de Assembly).</p>
<p>Essas linguagens que eu citei acima são as linguagens compiladas, pois antes de serem executadas, seus códigos-fonte devem ser devidamente compilados.</p>
<p>Python não é compilada, mas sim interpretada, assim como PHP, Perl e muitas outras, ou seja, não há o processo de compilação. O que acontece é que o código-fonte (ou script) é &#8220;traduzido&#8221; direto, através de um interpretador (imagine que ele é um intérprete mesmo, pois é assim que funciona!). Observação: Geralmente, quando uma linguagem é interpretada, existe um código intermediário (bytecode), com o qual o programador não precisa se preocupar. Seria muito lento interpretar diretamente o texto do código fonte. No caso do Python, o bytecode é salvo em arquivos .pyc e .pyo (bytecode otimizado)</p>
<p>Tal fato adiciona muita produtividade à linguagem, já que o processo de programar é somente escrever-rodar, ao contrário de escrever-compilar-rodar. Veja que o ciclo de um programa interpretado é bem mais eficiente, pois a fase de testes é MUITO simplificada:</p>
<p>Python: escrever-testar-corrigir-escrever-testar-distribuir</p>
<p>Linguagem C: escrever-compilar-testar-corrigir-compilar-testar-distribuir</p>
<p>Tecnicamente, qualquer linguagem pode ser compilada ou interpretada, mas as linguagens mais dinâmicas geralmente são interpretadas e as mais estáticas (estilo declare-antes-de-usar) são compiladas.</p>
<p>Se você já tem um interpretador instalado em seu sistema, experimente escrever o seguinte script:</p>
<p>1 print &#8220;Olá, mundo&#8221;</p>
<p>* Depois, num terminal, digite &#8220;python nome_do_script&#8221;, e veja como é simples!</p>
<p>Modo interativo</p>
<p>O Python também pode ser usado em modo interativo. Para isso, basta digitar python. E deve aparecer algo parecido com isso:</p>
<p>Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type &#8220;help&#8221;, &#8220;copyright&#8221;, &#8220;credits&#8221; or &#8220;license&#8221; for more information. &gt;&gt;&gt;</p>
<p>Em modo interativo, o Python executa o que voce digitar imediatamente (ou quase&#8230;), o que é muito bom para testes e para aprender.</p>
<p>O sinal &gt;&gt;&gt; é o prompt padrão Python. Significa que ele está de prontidão esperando um comando. Se o comando tiver algum resultado, este será mostrado na tela.</p>
<p>Para sair, aperte Control + D (nos UNIXes) ou Control + Z seguido de Enter (no Windows)</p>
<p>Tipos de dados, constantes, variáveis e expressões</p>
<p>Python é dinamicamente tipado, o que significa que se você usou uma variável para armazenar um inteiro, nada lhe impede de usá-la posteriormente para armazenar uma string (frase). Na verdade, variáveis em Python não são declaradas, o que lhe dá muita flexibilidade.</p>
<p>Quem determina o tipo de uma variável é o próprio interpretador. Se você escreve:</p>
<p>1 x = 2<br />
2 FRASE = &#8216;Isso é um exemplo simples e bobo&#8217;</p>
<p>* O interpetador já sabe que x é um inteiro e FRASE é uma string. Mas isso não lhe impede de, posteriormente, escrever</p>
<p>1 x = &#8216;agora tudo mudou&#8217;<br />
2 FRASE = 3.2</p>
<p>Como x já disse, tudo mudou, e isso é bem natural. Na verdade, raras são as vezes em que você precisa se preocupar com tipos. Geralmente você simplesmente atribui um valor a uma variável e pronto! Isso é bem simples. Mas não abuse desse recurso, senão seus programas vão virar uma confusão.</p>
<p>Então aqui vão alguns exemplos de tipos:</p>
<p>1 x = 2                           # Inteiro<br />
2<br />
3 p = 3.1415                      # Real, ou ponto flutuante<br />
4<br />
5 verdadeiro = True               # Boolean<br />
6<br />
7 estringue = &#8216;alguma frase&#8217;      # String<br />
8<br />
9 c = 3 + 2j                      # Complexo<br />
10<br />
11 lista = [3, 4, 5]               # Lista com elementos inteiros<br />
12<br />
13 lista2 = [2,'tres',4.0,[5,6]]   # Lista mista e aninhada<br />
14<br />
15 tupla = (1,2,3,&#8217;quatro&#8217;)        # Tupla. É como uma lista, mas não pode ser mudada<br />
16<br />
17 # tuplas de 0 ou 1 elementos têm sintaxes especiais:<br />
18 tupla0 = ()<br />
19 tupla1 = (&#8216;primeiro e único item&#8217;,) # repare na vírgula<br />
20<br />
21 # Em alguns casos (atribuições, returns), os parênteses são opcionais,<br />
22 # mas na maioria das vezes (tuplas dentro de listas, tuplas dentro de chamadas de funções)<br />
23 # os parênteses são necessários porque a vírgula faz parte de outra sintaxe<br />
24<br />
25 coord = 4.5, 9.1<br />
26 cor_branca = 255, 255, 255 # cor no formato RGB<br />
27 funcao((4.5, 9.1), &#8216;string&#8217;)<br />
28<br />
29 dic = {&#8216;site&#8217;:'Python Brasil&#8217;,'url&#8217;:'www.pythonbrasil.com.br&#8217;} # Isso é um dicionário</p>
<p>Tipos simples</p>
<p>* str (Strings, como &#8216;blabla&#8217;)<br />
* unicode (São strs em que os caracteres podem representar qualquer língua, u&#8217;blabla&#8217;)<br />
* bool (True ou False)<br />
* float (Números em ponto flutuante, como 4.5 ou 3.14e-10)<br />
* int (Números inteiros, como 99)<br />
* long (Números inteiros muito grandes, como 1234567890123456789123456789L)<br />
* complex (Números complexos, como 3.1j ou 7+3.14e-10j)<br />
* file (Arquivos)<br />
*</p>
<p>decimal (integrado ao Python 2.4 como módulo) (Números fracionários representados de forma decimal em vez de binária)</p>
<p>Tipos agrupados</p>
<p>* list (listas)<br />
* tuple (tuplas &#8211; listas imutáveis)<br />
* dict (dicionários)<br />
* set (novo tipo incluso no Python 2.4 &#8211; uma lista sem repetições)</p>
<p>Tipos mutáveis e imutáveis</p>
<p>Alguns tipos no Python permitem que elementos que fazem parte de sua estrutura sejam modificados, como as listas e dicionários. Estes tipos são chamados mutáveis.</p>
<p>Exemplo:</p>
<p>1 &gt;&gt;&gt; l = ['Nirvana', 'Rush', 'Bauhaus']<br />
2 &gt;&gt;&gt; l[1] = &#8216;Who&#8217;<br />
3 &gt;&gt;&gt; l<br />
4 ['Nirvana', 'Who', 'Bauhaus']<br />
5 &gt;&gt;&gt;</p>
<p>Outros tipos não permitem isso, como tuplas e strings. Estes são chamados imutáveis.</p>
<p>Exemplo:</p>
<p>1 &gt;&gt;&gt; s = &#8216;MYSQL&#8217;<br />
2 &gt;&gt;&gt; s[1] = &#8216;y&#8217;<br />
3 Traceback (most recent call last):<br />
4   File &#8220;&lt;stdin&gt;&#8221;, line 1, in<br />
5 TypeError: object does not support item assignment</p>
<p>Listas</p>
<p>O tipo lista do Python é bastante sofisticado e flexível. Como classe, a lista conta com métodos para ordenar (sort), inverter (reverse), contar ocorrências de um determinado elemento (count) e outros.</p>
<p>1 &gt;&gt;&gt; # Criando a lista de bandas<br />
2 &#8230;<br />
3 &gt;&gt;&gt; lista = ['Led Zeppelin', 'King Crimson', 'Yes', 'The Who', 'Pink Floyd']<br />
4 &gt;&gt;&gt;<br />
5 &gt;&gt;&gt; # Acessando um ítem da lista<br />
6 &#8230;<br />
7 &gt;&gt;&gt; lista[0]<br />
8 &#8216;Led Zeppelin&#8217;<br />
9 &gt;&gt;&gt;<br />
10 &gt;&gt;&gt; # Para elementos de listas dentro de listas ou caracteres de strings dentro de listas<br />
11 &#8230;<br />
12 &gt;&gt;&gt; lista[0][0]<br />
13 &#8216;L&#8217;<br />
14 &gt;&gt;&gt;<br />
15 &gt;&gt;&gt; # Retornando uma parte da lista (do terceiro até o quarto ítem)<br />
16 &#8230;<br />
17 &gt;&gt;&gt; lista[2:4]<br />
18 ['Yes', 'The Who']<br />
19 &gt;&gt;&gt;<br />
20 &gt;&gt;&gt; # Retornando uma parte da lista (do segundo até o fim)<br />
21 &#8230;<br />
22 &gt;&gt;&gt; lista[1:]<br />
23 ['King Crimson', 'Yes', 'The Who', 'Pink Floyd']<br />
24 &gt;&gt;&gt;<br />
25 &gt;&gt;&gt; # Retornando uma parte da lista (a partir do inicio até penúltimo)<br />
26 &#8230;<br />
27 &gt;&gt;&gt; lista[:-1]<br />
28 ['Led Zeppelin', 'King Crimson', 'Yes', 'The Who']<br />
29 &gt;&gt;&gt;<br />
30 &gt;&gt;&gt; # acessando a lista em passos<br />
31 &#8230;<br />
32 &gt;&gt;&gt; lista[::2]<br />
33 ['Led Zeppelin', 'Yes', 'Pink Floyd']<br />
34 &gt;&gt;&gt;<br />
35 &gt;&gt;&gt; # Passo negativo<br />
36 &#8230;<br />
37 &gt;&gt;&gt; lista[::-1]<br />
38 ['Pink Floyd', 'The Who', 'Yes', 'King Crimson', 'Led Zeppelin']<br />
39 &gt;&gt;&gt;<br />
40 &gt;&gt;&gt; # Convertendo para uma string<br />
41 &#8230;<br />
42 &gt;&gt;&gt; &#8216;, &#8216;.join(lista)<br />
43 &#8216;Led Zeppelin, King Crimson, Yes, The Who, Pink Floyd&#8217;<br />
44 &gt;&gt;&gt;<br />
45 &gt;&gt;&gt; # Contando ocorrências<br />
46 &#8230;<br />
47 &gt;&gt;&gt; lista.count(&#8216;Yes&#8217;)<br />
48 1<br />
49 &gt;&gt;&gt;</p>
<p>As estruturas condicionais disponíveis no Python são if, elif e else.</p>
<p>O if, o elif e o else servem para examinar expressões. À grosso modo, pode-se dizer que eles avaliam se determinada expressão retorna Verdadeiro (True) ou Falso (False).</p>
<p>Em Python os valores vazios: None, [] (* Lista vazia), &#8220;&#8221;, 0. São tidos como Falso (False). E os outros valores são verdadeiros (True).</p>
<p>Explicado isso, vamos às explicações:</p>
<p>if</p>
<p>Antes uma breve explicação do que vem a ser if. Como é sabido, if é traduzido em português para &#8220;se&#8221;. Nas linguagens de programação esse &#8220;se&#8221; (if) atua como um verificador de condições, algo como:</p>
<p>se ( essa condição for verdadeira ):</p>
<p>esse bloco de comandos<br />
será executado</p>
<p>Traduzindo em um exemplo bobo em Python, teriamos:</p>
<p>1 if (10 &gt; 5):<br />
2     print &#8220;10 é maior do que 5&#8243;</p>
<p>No caso, o bloco (composto apenas por um comando, no caso) seria sempre executado. Os parênteses na &#8220;condição&#8221; são opcionais.<br />
Vamos a outros exemplos.</p>
<p>Obs: Os exemplos são do modo interativo (shell) do Python.</p>
<p>1 # Exemplo IF 01<br />
2 &gt;&gt;&gt; meuNome = &#8220;Juares&#8221;<br />
3 &gt;&gt;&gt; seuNome = &#8220;Adolfo&#8221;<br />
4 &gt;&gt;&gt; if meuNome == seuNome:<br />
5 &#8230;     print &#8220;Nos temos os nomes iguais&#8221;<br />
6 &#8230;</p>
<p>Você notou que o print não ocorreu, já que as variáveis meuNome e seuNome são diferentes. Na linha 3 o if verifica essa igualdade, mas como o valor retornado da verificação é falso, ele não executa o comando print.</p>
<p>Agora observe esse outro exemplo:</p>
<p>1 # Exemplo IF 02<br />
2 &gt;&gt;&gt; meuNome = &#8220;Adolfo&#8221;<br />
3 &gt;&gt;&gt; seuNome = &#8220;Adolfo&#8221;<br />
4 &gt;&gt;&gt; if meuNome == seuNome:<br />
5 &#8230;     print &#8220;Temos os nomes iguais&#8221;<br />
6 &#8230;<br />
7 Temos os nomes iguais</p>
<p>Viu? Agora imprimiu, já que as variáveis são iguais. O if, novamente na linha 3, fez a verificação de igualdade (==) e obteve resultado Verdadeiro (True), logo executou o comando print.</p>
<p>else</p>
<p>Se o if refere-se ao &#8220;se&#8221;, quando traduzido, o else refere-se ao &#8220;senão&#8221;. Exemplificando:</p>
<p>se ( condição for verdadeira ):</p>
<p>execute esses comandos<br />
esse também</p>
<p>senão:</p>
<p>execute<br />
esses comandos</p>
<p>No caso o &#8220;se&#8221; é o if e o &#8220;senão&#8221; o else. Note que o else é executado se o if não for executado, ou seja, a condição do if não foi atendida. Caso o if tenha sido executado, o else não é executado.<br />
Vamos a um exemplo em código Python:</p>
<p>Obs: Estes códigos também são exemplos do shell do Python.</p>
<p>1 #Exemplo ELSE 01<br />
2 &gt;&gt;&gt; meuNome = &#8220;Ruivaldo&#8221;<br />
3 &gt;&gt;&gt; seuNome = &#8220;Adolfo&#8221;<br />
4 &gt;&gt;&gt; if meuNome == seuNome:<br />
5 &#8230;     print &#8220;Temos nomes iguais&#8221;<br />
6 &#8230; else:<br />
7 &#8230;     print &#8220;Nossos nomes sao diferentes&#8221;<br />
8 &#8230;<br />
9 Nossos nomes sao diferentes</p>
<p>Reiterando. O else não verifica nada. Ele é só uma delimitação de código a ser executado caso o if não ocorra.<br />
Mais um exemplo, só para fixar:</p>
<p>1 # Exemplo ELSE 02<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 10<br />
4 &gt;&gt;&gt; if x &gt; 5:<br />
5 &#8230;     print &#8220;X maior que Y&#8221;<br />
6 &#8230; else:<br />
7 &#8230;     print &#8220;Y maior ou igual a X&#8221;<br />
8 &#8230;<br />
9 Y maior ou igual a X</p>
<p>Nesse exemplo nós não sabemos quando o Y é igual ao X. Teríamos que usar o elif, que veremos agora.</p>
<p>elif</p>
<p>O elif é uma mistura de if com else. Calma, não se assuste. Ele é um else, logo só é executado se o if não ocorrer, só que além de else ele também é um if, então pro bloco elif ser executado além do primeiro if não ser executado, deve-se atender a uma determinada condição.</p>
<p>Em portugol seria algo como:</p>
<p>se ( condição ):</p>
<p>executa comando<br />
comando</p>
<p>se-if-não-foi-executado-e ( condição ):</p>
<p>executa comando<br />
comando</p>
<p>senão:</p>
<p>comando comando<br />
comando</p>
<p>Como já foi dito: o &#8220;se&#8221; é o if, o &#8220;se-if-não-foi-executado-e&#8221; é o elif e o &#8220;senão&#8221; é o else.</p>
<p>Vamos a um exemplo similar ao anterior:</p>
<p>1 #Exemplo ELIF 01<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 10<br />
4 &gt;&gt;&gt; if x &gt; y:<br />
5 &#8230;     print &#8220;X maior que Y&#8221;<br />
6 &#8230; elif x == y:<br />
7 &#8230;     print &#8220;X igual a Y&#8221;<br />
8 &#8230; else:<br />
9 &#8230;     print &#8220;Y maior que X&#8221;<br />
10 &#8230;<br />
11 Y maior que X</p>
<p>Note que agora se o x for igual ao y ele irá imprimir uma mensagem. Veja esse outro exemplo:</p>
<p>1 # Exemplo ELIF 02<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 5<br />
4 &gt;&gt;&gt; if x &gt; y:<br />
5 &#8230;     print &#8220;X &gt; Y&#8221;<br />
6 &#8230; elif x == y:<br />
7 &#8230;     print &#8220;X == Y&#8221;<br />
8 &#8230; else:<br />
9 &#8230;     print &#8220;X &lt; Y&#8221;<br />
10 &#8230;<br />
11 X == Y</p>
<p>Pronto. Estude os códigos, o conceito do elif é um pouco estranho mesmo, mas um pouco de estudo é o suficiente para dominá-lo.<br />
Modificador not</p>
<p>O modificador not é uma palavrinha que serve pra negar a expressão do if ou elif. Ao invés de esperar o valor verdadeiro da expressão ,o if vai esperar pelo valor falso. Estudemos-o por um exemplo:</p>
<p>1 # Exemplo not<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 6<br />
4 &gt;&gt;&gt; if not x == y:<br />
5 &#8230;     print &#8220;X eh diferente de Y&#8221;<br />
6 &#8230;<br />
7 X eh diferente de Y</p>
<p>Tabela de expressões válidas</p>
<p>Você pode usar os seguintes símbolos em suas expressões if, elif:</p>
<p>&gt;= (Maior Igual) &gt; (Maior) &lt;= (Menor Igual) &lt; (Menor) == (Igual) = (Diferente) &lt;&gt; (Diferente)</p>
<p>* E para finalizar essa seção do tutorial, o modificador in.</p>
<p>Modificador in</p>
<p>O in verifica se um elemento está dentro de outro. É como o símbolo de contido da matemática. Em portugol seria algo:</p>
<p>se elemento está-contido-em elemento-listável:</p>
<p>comando<br />
comando</p>
<p>Traduzindo. O &#8220;se&#8221; está para o if e o &#8220;está-contido-em&#8221; para o modificador in. Porém temos ali um &#8220;elemento-listável&#8221;. Meio estranho esse termo. Calma. Existem cinco tipos de elementos listáveis em Python: dicionários, listas, tuplas, strings (que são no fundo listas de caracteres) sets.</p>
<p>Isto é, no lugar de elemento-listável só pode haver uma variável dos tipos acima.</p>
<p>Vejamos esses exemplos:</p>
<p>1 &gt;&gt;&gt; if 1 in [1,2,3]: print &#8220;Esta&#8221;<br />
2 &#8230;<br />
3 Esta<br />
4 &gt;&gt;&gt; if &#8216;a&#8217; in &#8220;aloha&#8221;:<br />
5 &#8230;     print &#8220;Esta tambem&#8221;<br />
6 &#8230;<br />
7 Esta tambem<br />
8 &gt;&gt;&gt; if [2,3] in [1,2,3]:<br />
9 &#8230;     print &#8220;Esta&#8221;<br />
10 &#8230;<br />
11 &gt;&gt;&gt; if [2,3] in [[2,3],[2,4]]:<br />
12 &#8230;     print &#8220;Esta denovo&#8221;<br />
13 &#8230;<br />
14 Esta denovo</p>
<p>Conselho: Para fixar os conceitos copie e execute todos os exemplos no shell do Python, assim você aprenderá.<br />
Estruturas de iteração ou loop</p>
<p>for</p>
<p>Se você programa em C, vai perceber que o for em Python é diferente. Ele itera sobre listas. Por exemplo:</p>
<p>if not odeio_metallica:</p>
<p>metallica = ['James','Kirk','Lars','Trujillo']<br />
for membro in metallica:<br />
print membro</p>
<p>Ou seja, para cada elemento da lista, itere. Você terá acesso ao item corrente (print membro). Se quiser fazer iterações sobre progressões aritméticas, use a função range, que cria uma lista de inteiro em seqüência. Exemplo:</p>
<p>1 for i in range(50):<br />
2    print i</p>
<p>Isso vai imprimir na tela os números de 0 a 49.</p>
<p>while</p>
<p>O while é muito simples. Ver o exemplo já vai ajudar muito:</p>
<p>1 opc = 1<br />
2 while opc != 0:<br />
3    # código e mais código&#8230;<br />
4    opc = int(raw_input(&#8220;Digite 0 para sair \n &gt; &#8220;))</p>
<p>Veja, o laço vai continuar iterando até que o usuário digite 0 na hora que o programa perguntar. Simples. O while é literalmente um &#8220;enquanto ISSO faça AQUILO&#8221;.</p>
<p>Tando o for quanto o while podem ser interrompidos por break (o loop termina). O comando continue interrompe a iteração corrente e passa para a próxima.<br />
Funções</p>
<p>Simplificando, uma função é um bloco de código que tem nome (pelo qual ele pode ser chamado), recebe paramêtros (opcional) e gera um resultado (opcional)</p>
<p>Exemplo:</p>
<p>1 def media(lista = [0]):<br />
2     return float(sum(lista)) / len(lista)<br />
3<br />
4 print media([1,2,3,4,5])</p>
<p>media é o nome da função. lista é o paramêtro da função (no caso de vários paramêtros, seus nomes devem ser separados por vírgula). [0] é o valor padrão para lista (opcional)</p>
<p>return termina a execução da função, retornando o resultado (opcional) e o controle para a rotina que a chamou.<br />
Arquivos</p>
<p>Trabalhar com arquivos no Python é bem fácil. Como o Python é uma linguagem orientada a objetos, um arquivo é um objeto da classe file.</p>
<p>Um arquivo pode ser aberto para leitura (&#8216;r&#8217;, o padrão), escrita (&#8216;w&#8217;) ou inclusão (&#8216;a&#8217;) ou para ler e gravar no mesmo arquivo (&#8216;w+&#8217;). Se um arquivo já existir e for aberto apenas para escrita (&#8216;w&#8217;), ele será zerado.</p>
<p>1 # Um texto para teste&#8230;<br />
2<br />
3 texto = Beautiful is better than ugly.<br />
4 Explicit is better than implicit.<br />
5 Simple is better than complex.<br />
6 Complex is better than complicated.<br />
7 Flat is better than nested.<br />
8 Sparse is better than dense.<br />
9<br />
10 # Salvando em um arquivo chamado &#8220;zen.txt&#8221;<br />
11<br />
12 f = file(&#8216;zen.txt&#8217;, &#8216;w&#8217;)<br />
13 f.write(texto)<br />
14 f.close()<br />
15<br />
16 # Posso fazer em uma única linha:<br />
17<br />
18 file(&#8216;zen.txt&#8217;, &#8216;w&#8217;).write(texto)<br />
19<br />
20 # Para ler o arquivo:<br />
21<br />
22 arq = file(&#8216;zen.txt&#8217;)<br />
23<br />
24 # Trazendo o texto de volta:<br />
25<br />
26 texto = arq.read()<br />
27<br />
28 # Se preferir uma lista contendo as linhas do arquivo<br />
29<br />
30 linhas = arq.readlines()<br />
31<br />
32 # Se movendo para o inicio do arquivo<br />
33<br />
34 arq.seek(0)<br />
35<br />
36 # Imprimindo as linhas do arquivo:<br />
37<br />
38 for linha in arq: print linha,<br />
39<br />
40 # Fechando o arquivo<br />
41<br />
42 arq.close()</p>
<p>Tratamento de erros e exceções</p>
<p>* try / except<br />
* try / finally</p>
<p>As sentenças try / except e try / finally são mutuamente excludentes, não podem misturadas (embora possam ser usadas uma no interior da outra)</p>
<p>A sentença try / except especifica um ou mais manipuladores de exceção. Caso não ocorra erros, nenhum manipulador será executado. Ainda é possível definir um else opcional que será executado quando nenhum erro ocorrer. Exemplo:</p>
<p>1 try:<br />
2     # Vou tentar fazer isso:<br />
3     x = 1/0<br />
4 except ZeroDivisionError:<br />
5     # Se houver divisão por zero, farei isso:<br />
6     print &#8216;Divisão por zero&#8230;&#8217;<br />
7 else:<br />
8     # Senão&#8230;<br />
9     print &#8216;Não ocorreu nenhum erro!&#8217;</p>
<p>A sentença try / finally especifica um manipulador de limpeza, que será executado sempre. Quando não ocorre erros, finally é executado. Quando ocorre um erro, a exceção é salva, finally é executado, e logo após a exceção salva é executada novamente. Exemplo:</p>
<p>1 try:<br />
2     x = 1/0<br />
3 finally:<br />
4     print &#8216;Tentando dividir um 1 por 0&#8230; Ops!&#8217;</p>
<p>Nesse caso, o traceback aparecerá na tela, depois da mensagem.<br />
Raise</p>
<p>Com a sentença raise, você pode provocar uma exceção, que ser pode tratada pelo código que chamou aquela parte do programa. Exemplo:</p>
<p>1 try:<br />
2     z, y = 1, 0<br />
3     if y == 0:<br />
4         raise ZeroDivisionError<br />
5     else:<br />
6         print &#8216;%d divido por %d é %d&#8217; % (z, y, z/y)<br />
7 except ZeroDivisionError:<br />
8     print &#8216;Divisão por zero&#8230;&#8217;<br />
9 else:<br />
10     print &#8216;ocorreu algo inesperado!&#8217;</p>
<p>Dica: raise SystemExit termina o programa.<br />
Módulos</p>
<p>Um módulo em Python não é nada mais que um arquivo .py com definições de funções e classes. É isso mesmo. Apenas um arquivo.</p>
<p>Para facilitar o entedimento vamos exemplificar.</p>
<p>Escrevemos o código do seguinte módulo (logicamente, para fins didáticos apenas):</p>
<p>Esconder número das linhas</p>
<p>1 # Exemplo de módulo<br />
2 # Módulo matematica.py<br />
3<br />
4 def somar(a,b):<br />
5     &#8220;&#8221;"<br />
6     Funcao que soma dois numeros<br />
7     &#8220;&#8221;"<br />
8     return a+b<br />
9<br />
10 def subtrair(a,b):<br />
11     &#8220;&#8221;"<br />
12     Funcao que subtrai dois numeros<br />
13     &#8220;&#8221;"<br />
14     return a &#8211; b<br />
15<br />
16 def multiplicar(a,b):<br />
17     &#8220;&#8221;"<br />
18     Funcao que multiplica dois numeros<br />
19     &#8220;&#8221;"<br />
20     return a * b<br />
21<br />
22 def dividir(a,b):<br />
23     &#8220;&#8221;"<br />
24     Funcao que divide dois numeros<br />
25     &#8220;&#8221;"<br />
26     return a / b</p>
<p>Salvamos ele como &#8220;&#8221;matematica.py&#8221;".</p>
<p>Agora vamos escrever três exemplos de uso do módulo.</p>
<p>* Importando o módulo inteiro</p>
<p>Vamos ao código:</p>
<p>1 import matematica<br />
2<br />
3 print matematica.somar(1,2)<br />
4 print matematica.dividir(100,25)</p>
<p>Executando esse arquivo nós temos como resultado:</p>
<p>3 4</p>
<p>Note que ao importar o módulo inteiro é obrigatório usar o nome do módulo antes de suas funções, classes&#8230; Esse tipo de import evita problemas de namespace.</p>
<p>* Importando o que a gente quer do módulo</p>
<p>Esconder número das linhas</p>
<p>1 from matematica import somar, dividir<br />
2<br />
3 print somar(1,2)<br />
4 print dividir(100,25)</p>
<p>O resultado é o mesmo do exemplo anterior:</p>
<p>3 4</p>
<p>A única diferença é que nós só importamos duas funções do módulo e não precisamos por &#8220;matematica&#8221; para chamá-los, ou seja, as duas funções importadas foram colocadas dentro do namespace do arquivo que está usando o módulo. Esse tipo de import é bom para módulos muito grandes em que só se use uma fcoisa ou poucas coisas dele, há um certo aumento de desempenho nesse caso e economia de memória.</p>
<p>* Importando tudo do módulo (diferente de importar o módulo inteiro)</p>
<p>1 from matematica import *<br />
2<br />
3 print somar(1,2)<br />
4 print dividir(100,25)<br />
5 print subtrair(10,8)</p>
<p>O resultado será:</p>
<p>3 4 2</p>
<p>É como o primeiro tipo de import, ele pega tudo do módulo, todas funções, classes, enfim. A diferença é que usando o &#8220;&#8221;"from modulo import *&#8221;"&#8221; eliminamos a necessidade de ficar digitando &#8220;matematica&#8221; toda vez que quisermos chamar algo do módulo.<br />
Observações:</p>
<p>* Os arquivos de exemplo de uso do módulo devem estar na mesma pasta do módulo.<br />
* Ao fazer módulos procure não deixá-lo tão grande. É uma boa prática de programação.</p>
<p>Adendo: Um módulo Python é como se fosse um pedaço de programa que você, como programador, decidiu que ficaria melhor separado do todo. Essa decisão geralmente é tomada sobre estruturas que são usadas em diversos programas. Isso facilita nossa vida, pois já não precisamos &#8220;copiar e colar&#8221; as coisas de um lado para outro. Claro, módulos podem ser mais complexos em certos pontos de vista. Eu mesmo não vejo nada de muita complexidade. Pura praticidade!<br />
Módulos distribuídos com o Python</p>
<p>Com o Python, são distribuídos muitos módulos, para servem para diversos propósitos (antes escrever algo do zero, verifique se existe algo pronto nos módulos do Python)</p>
<p>Exemplos de módulos:</p>
<p>* os &#8211; suporte para recursos do sistema operacional (exemplos: mudar o diretório corrente e deletar arquivo)<br />
* sys &#8211; rotinas que controlam o ambiente de execução do Python (exemplos: consultar o PYTHONPATH (lista de diretórios aonde o Python procura módulos) e encerrar o programa)<br />
* copy &#8211; copia de objetos<br />
* subprocess &#8211; rotinas para executar processos (incluso no Python 2.4)</p>
<p>Packages</p>
<p>O Package é uma maneira estruturar o namespace dos módulos através da notação do ponto. Por exemplo, web.forms é uma referência ao módulo forms que faz parte do package web.</p>
<p>Com packages, os autores de módulos não precisam se preocupar com a colisão de nomes.<br />
Para criar um package:</p>
<p>* Crie um diretório (que terá o nome do package);<br />
*</p>
<p>Crie um arquivo (que pode estar vázio) chamado __init__.py dentro do diretório;<br />
* Coloque os módulos do package dentro do mesmo diretório.</p>
<p>Um módulo que faz parte de um package pode ser importado como import package.modulo ou from package import modulo.</p>
<p>Opcionalmente, o arquivo __init__.py pode inicializar uma lista chamada __all__, que contém quais módulos serão importados usando from package import *.<br />
Classes</p>
<p>Criar uma classe em Python é muito simples. Acompanhe o exemplo: Esconder número das linhas</p>
<p>1 class Pessoa:<br />
2   def __init__(self):<br />
3     self.nome = &#8220;&#8221;<br />
4     self.x = 0<br />
5     self.y = 0<br />
6   def andar(self, x, y):<br />
7     self.y = self.y + y<br />
8     self.x = self.x + x<br />
9<br />
10 eu = Pessoa()<br />
11 eu.nome = &#8220;Cléber&#8221;<br />
12 eu.andar(2, 0)</p>
<p>A classe criada chama-se Pessoa. É costume nomear classes DesteJeito em vez de deste_jeito. Assim, fica fácil de distinguir as classes dos objetos, das variáveis, das funções, etc. Essa convenção de nomenclatura é usada em Java, Ruby, Python e em outras linguagens (já que os programadores acabam levando esse costume de uma linguagem pra outra). Voltando à classe Pessoa.</p>
<p>Nela definimos duas funções (funções dentro classes geralmente são chamadas de métodos). A função andar, sob um ponto de vista muito abstrato, faz &#8220;a pessoa andar&#8221;, ou seja, altera os valores x e y de sua posição (faça de conta que também existe uma função pra desenhar a pessoa <img src='http://blog.deserv.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ). Perceba que eu não declarei nenhuma das variáveis. Classes servem mesmo é pra criar métodos (agrupar funções), e não tanto para criar estruturas de variáveis (apesar de classes em Python serem ótimos containers).</p>
<p>A função __init__() é especial: ela é chamada toda a vez que é criada uma nova instância da classe (obs.: instância de classe é o mesmo que objeto), por isso o nome init: ela inicializa o objeto, e é opcional. O argumento self é obrigatório, e deve ser o primeiro da função. Perceba que foi usado self na definição das variáveis. Isso quer dizer que estamos mexendo nas variáveis do objeto (Repare no detalhe: fora da classe usamos o nome do objeto criado, no caso eu. Dentro da classe, o código serve pra qualquer objeto criado a partir dessa classe, e o primeiro argumento, o self, representa o objeto sendo usado.).</p>
<p>Classes podem servir como os &#8220;struct&#8221; do C ou &#8220;record&#8221; do Pascal. dicts também podem servir como structs. dicts são mais usados pra simplesmente agrupar dados acessados por nome. Classes são mais usadas quando a estrutura é complexa, necessita de métodos de acesso e serão usadas várias instâncias da mesma estrutura. Pra simular uma struct, basta definir uma classe vazia, por exemplo:</p>
<p>1 class conteiner:<br />
2    pass<br />
3<br />
4 # E depois criar as variáveis dela &#8220;por fora&#8221;,<br />
5 conteiner.var = &#8220;fácil, não?&#8221;<br />
6 conteiner.num = 1</p>
<p>O pass serve para indicar que nada precisa ser feito (porém a síntaxe exige que exista uma sentença naquele lugar)</p>
<p>Classes podem ser muito bem utilizadas, mas algumas vezes são péssimas opções. Assim como tudo em programação, saiba usá-las com parcimônia.</p>
<p>Exemplos, pra terminar:</p>
<p>1 class Carro:<br />
2    def __init__(self, preco):<br />
3       self.marca = &#8220;Ford&#8221;<br />
4       self.modelo = &#8220;Maverick&#8221;<br />
5       self.ano = 74<br />
6       self.cor = [0,200,50]<br />
7       self.pos = [0,0]<br />
8    def andar(self, x, y):<br />
9       self.pos[0] = self.pos[0]+x<br />
10       self.pos[1] = self.pos[1]+y<br />
11<br />
12 carango = Carro(5000)   #passa o valor 5000 para __init__()<br />
13<br />
14 for i in range(300):<br />
15    carango.andar(1,0)  #o carro anda 300m</p>
<p>Herança</p>
<p>Herança é um recurso poderoso da programação orientada a objetos que permite reutilizar o código de classes já definidas. Com a herança, é possível extender, especializar ou até mesmo fundir classes.</p>
<p>O Python suporta herança múltipla, ou seja, é possível criar uma nova classe a partir de várias outras (esse recurso deve ser usado com cuidado, pois isso pode criar dificuldades na manutenção)</p>
<p>Exemplo:</p>
<p>1 # definindo uma classe &#8216;pai&#8217;<br />
2<br />
3 class CD:<br />
4   def __init__(self, titulo):<br />
5     self.titulo = titulo<br />
6<br />
7   def mudarTitulo(self, novoTitulo):<br />
8     self.titulo = novoTitulo<br />
9<br />
10 # definindo uma classe &#8216;filha&#8217;<br />
11 # O nome da class &#8216;mãe&#8217; (Na herança múltipla, os nomes das &#8216;mães&#8217;)<br />
12 # é passado para a classe filha<br />
13<br />
14 class CDAudio(CD):<br />
15<br />
16   def __init__(self, titulo, autor):<br />
17     CD.__init__(self, titulo)<br />
18     self.autor = autor<br />
19     self.faixas = []<br />
20<br />
21   def adicionarFaixa(self, numero, nome):<br />
22     self.faixas.append((numero, nome))<br />
23<br />
24   def removerFaixa(self, numero, nome):<br />
25     self.faixas.remove((numero, nome))<br />
26<br />
27 # Criando objeto<br />
28<br />
29 novoCD = CDAudio(&#8216;Physical Graphitte&#8217;, &#8216;Led Zeppelin&#8217;);<br />
30<br />
31 # Evocando métodos:<br />
32<br />
33 novoCD.adicionarFaixa(1,&#8217;Custard Pie&#8217;)<br />
34 novoCD.adicionarFaixa(2,&#8217;The Rover&#8217;)<br />
35<br />
36 # Listando a estrutura do objeto<br />
37<br />
38 print dir(novoCD)<br />
39<br />
40 # Acesando atributos<br />
41<br />
42 print &#8220;CD: %s, %s&#8221; % (novoCD.titulo, novoCD.autor)<br />
43 print novoCD.faixas</p>
<p>Namespaces</p>
<p>Um Namespace é um dicionário com os nomes válidos em um programa durante a sua execução. Sendo assim, quando fazemos i = 1, o nome i é colocado em um namespace. O nome pode ser localizado de duas formas:</p>
<p>* Nome não qualificado<br />
* Nome qualificado</p>
<p>Nomes não qualificados</p>
<p>Quando o nome da variável não foi qualificado (exemplo: i = 0, a busca é feita primeiro entre as variáveis locais (dica: para listar as variáveis locais: locals()), depois entre as variáveis globais (dica: para listar as variáveis globais: globals()) e por fim entre as variáveis pré-definidas do Python (builtins. Exemplos: True e False)<br />
Nomes qualificados</p>
<p>Quando o nome da variável foi qualificado (exemplo: livro.pagina, a busca é feita primeiro no objeto, depois na classe do objeto e segue a hierarquia de herança.<br />
List Comprehensions</p>
<p>List Comprehension é um nome pomposo para algo simples &#8211; uma construção que permite processar listas de uma forma bem próxima a matemática.</p>
<p>A sintaxe é [&lt;expressão&gt; for &lt;variável&gt; in &lt;lista&gt; if &lt;condição&gt;]</p>
<p>Aonde:</p>
<p>* &lt;lista&gt; é a lista original a ser processada;<br />
* &lt;variável&gt; ítem da lista a ser processada;<br />
* &lt;expressão&gt; expressão a ser aplicada em cada ítem;<br />
* &lt;condição&gt; condição que deve ser cumprida para que o ítem seja processado.</p>
<p>A parte for &lt;variável&gt; in &lt;lista&gt; pode se repetir N vezes.</p>
<p>A condição é opcional.</p>
<p>Exemplo:</p>
<p>Esconder número das linhas</p>
<p>1 &gt;&gt;&gt; # Multiplos de 4 entre 0 em 99:<br />
2 &#8230;<br />
3 &gt;&gt;&gt; [x for x in range(100) if x % 4 == 0]<br />
4 [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96]<br />
5 &gt;&gt;&gt;</p>
<p>Generators</p>
<p>Muitas vezes, em programação, é necessário processar listas de elementos. Porém, manter listas inteiras em memória, dependendo do tamanho, podem causar problemas de performance. Para isso, no Python, temos os Generators.</p>
<p>Na sintaxe, os generators são parecidos com as funções, porém existem algumas diferenças significativas:</p>
<p>* Um objeto do tipo generator retorna um elemento de cada vez quando evocado (através do método next<br />
* O return habitual é substituido por yield<br />
* Como os elementos são gerados apenas quando (e se) necessário, o resultado é menos consumo de recursos (isto é chamado Lazy Evaluation)</p>
<p>Exemplo:</p>
<p>1 &gt;&gt;&gt; def getchar(word):<br />
2 &#8230;     for c in word:<br />
3 &#8230;         yield c<br />
4 &#8230;<br />
5 &gt;&gt;&gt; pythonchars = getchar(&#8216;Python&#8217;)<br />
6 &gt;&gt;&gt; pythonchars<br />
7 &lt;generator object at 0x009D5EE0&gt;<br />
8 &gt;&gt;&gt; pythonchars.next()<br />
9 &#8216;P&#8217;<br />
10 &gt;&gt;&gt; pythonchars.next()<br />
11 &#8216;y&#8217;<br />
12 &gt;&gt;&gt; pythonchars.next()<br />
13 &#8216;t&#8217;<br />
14 &gt;&gt;&gt; pythonchars.next()<br />
15 &#8216;h&#8217;<br />
16 &gt;&gt;&gt; pythonchars.next()<br />
17 &#8216;o&#8217;<br />
18 &gt;&gt;&gt; pythonchars.next()<br />
19 &#8216;n&#8217;<br />
20 &gt;&gt;&gt;</p>
<p>Generator Expressions</p>
<p>Generator Expressions (também chamadas de Genexps) são o equivalente a List Comprehensions para se criar Generators.</p>
<p>A sintaxe é semelhante a da List Comprehension, porém, numa Generator Expression se usa () (parantesis) para delimitar a expressão, ao invez de [] (colchetes) como na List Comprehension.</p>
<p>Uma Generator Expression pode ser vista também como a versão Lazy Evaluated da List Comprehension, já que cada elemento é gerado apenas quando necessario, e não todos de uma vez.</p>
<p>Exemplo (baseado num post de Guido Van Rossum em seu blog):</p>
<p>1 &gt;&gt;&gt; # funções uteis para usar com genexps<br />
2 &gt;&gt;&gt; def any(S):<br />
3 &#8230;    for x in S:<br />
4 &#8230;         if x:<br />
5 &#8230;            return True<br />
6 &#8230;    return False<br />
7 &#8230;<br />
8 &gt;&gt;&gt; def all(S):<br />
9 &#8230;     for x in S:<br />
10 &#8230;         if not x:<br />
11 &#8230;            return False<br />
12 &#8230;     return True<br />
13 &#8230;<br />
14 &gt;&gt;&gt; S = [42, 42]<br />
15 &gt;&gt;&gt; # Usando Genexps<br />
16 &gt;&gt;&gt; any(x &gt; 42 for x in S)     # True se algum elemento de S for &gt; 42<br />
17 &gt;&gt;&gt; all(x != 0 for x in S)     # True se todos os elemtos de S forem diferentes de zero</p>
<p>Um exemplo Completo</p>
<p>Pretendo deixar um aplicativo de exemplo para sintetizar tudo. Uma idéia que me ocorreu agora é fazer um programinha gráfico (usando tk) de perguntas e repostas (quiz). Não sei se é confundir muito botar tk no meio, mas creio que se a pessoa entendeu o tutorial vai ser capaz de entender um pouco do código, mesmo porque com o quiz eu posso usar dicionários, listas, abrir/fechar arquivos (aka usar módulos), talvez usar classes e mostrar um exemplo prático que teoricamente rodaria em todas as plataformas.</p>
<p>(Sugestão: Coloca o programa sim! Assim o tutorial &#8220;cresce&#8221; junto com o leitor, em vez de ficar só no conhecimento básico &#8211; tem é que mergulhar fundo! Ao infinito e além!!)</p>
<p>(Muito bom! Este exemplo completo seria muito interessante. De repente não utilizar a biblioteca gráfica, para não complicar, tendo em vista que a sintaxe do Python é bem particular, não tendo muitas semelhanças com as linguagens de uso corriqueiro)</p>
<p>(Po! Eu acho legal colocar o exemplo de quiz&#8230; ia simplificar muito o aprendizdo, visto que editar codigo eh um otimo aprendizado&#8230;)</p>
<p>(Acho que toolkits gráficos atrapalham para quem está aprendendo (até porque tem toneladas deles). Seria legal ter um tutorial só de tk com o programa completo. Pessoalmente, preferia que fosse PyGTK&#8230;)</p>
<p>(Eu tenho um pouco de experiencia com PyGTK, mas poderiamos fazer um no console tambêm. ~YuriSchlesner)</p>
<p>(Se esta página e´sobre uma introdução em Python nada mais justo que usar algo fraquinho como Tkinter. Andrik Machado Batista)</p>
<p>(Se Tkinter é fraquinho, portanto não muito útil, então porque não algo mais prático? Interface Web, por exemplo)</p>
<p>(Outra coisa &#8211; não seria melhor separar a página em partes? Ela está ficando um pouco grande&#8230;)<br />
Próximos passos</p>
<p>Existem muitos caminhos para continuar aprendendo Python. Algumas possibilidades são:</p>
<p>* Esse próprio site (PythonBrasil)<br />
* A documentação oficial do Python, em inglês (Python 2.4.1 Documentation)</p>



<p>No related posts.</p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/21/intropython/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validação de dados em PHP</title>
		<link>http://blog.deserv.info/2010/05/20/validacao-de-dados-em-php/</link>
		<comments>http://blog.deserv.info/2010/05/20/validacao-de-dados-em-php/#comments</comments>
		<pubDate>Thu, 20 May 2010 17:38:20 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Linguagem de Programação]]></category>
		<category><![CDATA[Validação de Dados em PHP]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=382</guid>
		<description><![CDATA[Parte do trabalho de qualquer programador é validar os dados que são entrados em seus programas. No PHP, isso não é diferente. O meio mais convencional para se receber dados dos usuários é através de formulários, mas também pode-se receber dados de outras formas (XML, arquivos, conexões de rede, entre outras). A validação é importantíssima, [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/04/10/como-trabalhar-com-funcoes-em-php/' rel='bookmark' title='Permanent Link: Como Trabalhar com Funções em PHP'>Como Trabalhar com Funções em PHP</a> <small>Olá, nesse artigo vamos abordar o tema Funções definidas pelo...</small></li>
<li><a href='http://blog.deserv.info/2010/04/10/introducao-a-linguagem-php/' rel='bookmark' title='Permanent Link: Introdução a Linguagem PHP'>Introdução a Linguagem PHP</a> <small>O que é o PHP? PHP significa “Hypertext Preprocessor”, e...</small></li>
<li><a href='http://blog.deserv.info/2010/04/01/redirect-em-php/' rel='bookmark' title='Permanent Link: Redirect em PHP'>Redirect em PHP</a> <small>Para fazer com que o usuário ao acessar um determinado...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Parte do trabalho de qualquer programador é validar os dados que são  entrados em seus programas. No PHP, isso não é diferente. O meio mais  convencional para se receber dados dos usuários é através de  formulários, mas também pode-se receber dados de outras formas (XML,  arquivos, conexões de rede, entre outras).</p>
<p>A validação é importantíssima, pois sem ela, o programa pode  trabalhar com dados inválidos, e muitos problemas podem acontecer:</p>
<p><span id="more-382"></span></p>
<h2>Resultados inesperados</h2>
<p>Se o programa pede, por exemplo, um número entre 1 e 100, o usuário  entra com 200, e o programa não faz essa checagem, pode acabar  utilizando o número em alguma conta e terminando com um resultado  inválido. Segurança</p>
<p>Um dos problemas mais graves da falta de checagem, quando por  exemplo a entrada do usuário é utilizado diretamente em uma query SQL ou  como parâmetro de um comando. Os dados entrados pelo usuário podem  manipular a query ou o comando e conseguir acesso não autorizado ao  banco de dados ou ao servidor.</p>
<p><a id="Dados_inconsistentes" name="Dados_inconsistentes"></a></p>
<h2>Dados inconsistentes</h2>
<p>Se, por exemplo, em um campo onde deveria se entrar um CEP, o usuário  coloca números inválidos, letras, ou deixa em branco, o a empresa terá  problemas, por exemplo, para enviar uma mala direta postal para seus  clientes.</p>
<p>No caso de aplicações em PHP, com a saída via web, a validação  ainda deve ser feita, preferencialmente, duas vezes: uma do lado do  cliente (em Javascript) para se evitar que os dados inválidos sejam  enviados, e outra do lado do servidor (em PHP), para evitar que dados  inválidos tenham sido enviados por um navegador sem Javascript (ou com o  Javascript desligado), ou maliciosamente por alguem. A validação em  Javascript foge do escopo deste artigo, que irá tratar da validação dos  dados em PHP.</p>
<p><a id="A_classe_PEAR_Validate" name="A_classe_PEAR_Validate"></a></p>
<h2>A classe PEAR Validate</h2>
<p>Sempre que possível, devemos evitar reescrever código já disponível,  principalmente quando o código já disponível é de qualidade, como  acontece com a maioria das classes disponíveis no PEAR, que devem seguir  uma padronização de código bem rigorosa para serem aceitas.</p>
<p>Uma das classes disponíveis no PEAR é a Validate, que é uma  classe genérica para validação de dados. A classe pode validar os  seguintes tipos de dados:</p>
<pre>   * Números, podendo-se especificar valor mínimo e máximo, e número de casas decimais;
   * Emails, checando a sintaxe do email, se o domínio é válido, e se o email está no formato da <a title="http://tools.ietf.org/html/rfc822" href="http://tools.ietf.org/html/rfc822">RFC 822</a>;
   * Strings, com constantes pré-definidas para facilitar a validação de maiúsculas e minúsculas, tamanho da string, entre outras;
   * Datas, com checagem de data mínima e máxima, e se o formato é <a title="http://tools.ietf.org/html/rfc822" href="http://tools.ietf.org/html/rfc822">RFC 822</a>;
   * URLs, checando se o formato é válido (de acordo com a <a title="http://tools.ietf.org/html/rfc2396" href="http://tools.ietf.org/html/rfc2396">RFC 2396</a>).
</pre>
<p>A utilização é bastante simples. Uma vez instalada (é apenas um  arquivo, chamado Validate.php), basta chamar estaticamente seus métodos,  passando o dado a ser validado como primeiro parâmetro, e as opções de  validação (quando aplicáveis) como segundo parâmetro. Os métodos  retornam true ou false, indicando se a validação passou ou não.</p>
<p>Por exemplo, para validar um número em $num como sendo um número  de 0 a 100 com no máximo 2 casas decimais, a chamada seria a seguinte:</p>
<pre> &lt;?php
 $opt = Array('decimal' =&gt; '.',
              'dec_prec' =&gt; 2,
              'min' =&gt; 0,
              'max' =&gt; 100);
 if (Validate::number($num, $opt)) {
     // validação ok!
 }
 ?&gt;
</pre>
<p>Os outros métodos são semelhantes, e para se saber quais são as  opções que podem ser passadas, basta olhar os métodos disponíveis  diretamente na documentação da classe, ou então diretamente dentro do  arquivo da classe.</p>
<p><a id="A_classe_PEAR_Validate_ptBR" name="A_classe_PEAR_Validate_ptBR"></a></p>
<h2>A classe PEAR Validate_ptBR</h2>
<p>Assim como a classe Validate provê métodos úteis para a validação de  dados genéricos, temos também disponível a classe Validate_ptBR, que  disponibiliza métodos para validação de dados específicos do Brasil. A  classe valida os seguintes tipos de dados:</p>
<pre>   * CEP, com 8 dígitos;
   * CPF, checando se os dígitos verificadores correspondem ao restante do número;
   * CNPJ e PIS, também usando a checagem de dígitos verificadores;
   * Estados brasileiros (siglas);
   * Números telefônicos, com ou sem código de área;
   * Placas de carros, com 3 letras e 4 dígitos.
</pre>
<p>A utilização da classe é semelhante à classe Validate, bastando  chamadas estáticas aos seus métodos. Assim como na classe Validate, para  saber os métodos disponíveis e seus parâmetros, basta examinar a  documentação da classe.</p>
<p>Por: Flávio Silva</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/04/10/como-trabalhar-com-funcoes-em-php/' rel='bookmark' title='Permanent Link: Como Trabalhar com Funções em PHP'>Como Trabalhar com Funções em PHP</a> <small>Olá, nesse artigo vamos abordar o tema Funções definidas pelo...</small></li>
<li><a href='http://blog.deserv.info/2010/04/10/introducao-a-linguagem-php/' rel='bookmark' title='Permanent Link: Introdução a Linguagem PHP'>Introdução a Linguagem PHP</a> <small>O que é o PHP? PHP significa “Hypertext Preprocessor”, e...</small></li>
<li><a href='http://blog.deserv.info/2010/04/01/redirect-em-php/' rel='bookmark' title='Permanent Link: Redirect em PHP'>Redirect em PHP</a> <small>Para fazer com que o usuário ao acessar um determinado...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/20/validacao-de-dados-em-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalação do PostgreSQL no Linux</title>
		<link>http://blog.deserv.info/2010/05/17/instalacao-do-postgresql-no-linux/</link>
		<comments>http://blog.deserv.info/2010/05/17/instalacao-do-postgresql-no-linux/#comments</comments>
		<pubDate>Mon, 17 May 2010 13:44:18 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PSQL]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=380</guid>
		<description><![CDATA[Numa instalação no Linux, mesmo com a versão 8.3.6, podemos criar um cluster com suporte a LATIN1, veja detalhes logo abaixo. Através dos repositórios (Ubuntu) sudo apt-get install postgresql-8.3 Com isso teremos a versão 8.3 instalada em pouco tempo. O Ubuntu irá buscar o postgresql em seus servidores e o instalará e configurará para nós. [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/' rel='bookmark' title='Permanent Link: Introdução ao PostgreSQL'>Introdução ao PostgreSQL</a> <small>Resumo da História do PostgreSQL É um poderoso SGBD com...</small></li>
<li><a href='http://blog.deserv.info/2010/01/18/opendns-configurando-o-uso-dos-servidores-no-seu-computador-linux/' rel='bookmark' title='Permanent Link: OpenDNS: Configurando o uso dos servidores no seu computador: Linux'>OpenDNS: Configurando o uso dos servidores no seu computador: Linux</a> <small>O Linux possui vários utilitários gráficos para a configuração de...</small></li>
<li><a href='http://blog.deserv.info/2010/04/17/instalacao-do-clamav-com-dazukofs/' rel='bookmark' title='Permanent Link: Instalação do ClamAV com DazukoFS'>Instalação do ClamAV com DazukoFS</a> <small>Introdução // O ClamAV é um dos mais conhecidos antivírus...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Numa instalação no Linux, mesmo com a versão 8.3.6, podemos criar um cluster com suporte a LATIN1, veja detalhes logo abaixo.</p>
<p><strong>Através dos repositórios (Ubuntu)</strong></p>
<p><span id="more-380"></span>sudo apt-get install postgresql-8.3</p>
<p>Com isso teremos a versão 8.3 instalada em pouco tempo. O Ubuntu irá buscar o postgresql em seus servidores e o instalará e configurará para nós.</p>
<p><strong>Detalhes </strong></p>
<p>Diretório de dados &#8211; /var/lib/postgresql/8.3/main/base<br />
Diretório do pg_hba.conf e do postgresql.conf &#8211; /etc/postgresql/8.3/main autovacuum.conf &#8211; /etc/postgresql-common pg_dump, pg_dumpall, psql e outros binários &#8211; /usr/bin</p>
<p><strong>Acessando pelo prompt </strong></p>
<p><em><strong>Acessando a console psql</strong></em><br />
sudo -u postgres psql</p>
<p><em><strong>No primeiro acesso trocar a senha do usuário postgres:</strong></em></p>
<p>alter role postgres password &#8216;postgres&#8217;;</p>
<p>Para poder acessar com o PGAdmin.</p>
<p>Parece que por uma questão de segurança, o usuário postgres não tem acesso pela console, mas caso queira que o mesmo acesse então &#8230;</p>
<p><em><strong>Trocar a senha do super-usuário</strong></em></p>
<p>sudo passwd postgres</p>
<p><strong>Instalando através dos Fontes </strong></p>
<p>Este método de instalação dá um pouco mais de trabalho mas em contrapartida é o que oferece um maior controle e uma maior possibilidade de customização.</p>
<p><strong>Pré-requisitos para instalação do PostgreSQL num UNIX: </strong></p>
<p>make do GNU (gmake ou make)<br />
compilador C, (preferido GCC mais recente)<br />
gzip<br />
biblioteca readline (para psql)<br />
gettext (para NLS)<br />
kerberos, openssl e pam (opcionais, para autenticação)</p>
<p><strong>Veja como instalar esses requisitos no Ubuntu: </strong></p>
<p>sudo apt-get install build-essential libreadline5-dev zlib1g-dev gettext</p>
<p>Obs.: estes pacotes podem mudar de nome devido ao aparecimento de novas versões. E use make ao invés de gmake.</p>
<p>Download &#8211; <a href="http://www.postgresql.org/ftp/source/">http://www.postgresql.org/ftp/source/</a></p>
<p>Descompacte em /usr/local/src e instale no diretório default, que é /usr/local/pgsql.</p>
<p>sudo tar zxpvf postgresql-8.3.1.tar.gz -C /usr/local/src</p>
<p>cd /usr/local/src/postgresql-8.3.1</p>
<p>Caso já tenha o postgresql instalado no Ubuntu, pule as etapas de criação do grupo e do usuário na instalação abaixo, como também terá que alterar a porta no script postgresql.conf, logo após a criação do cluster com o comando initdb e, no caso, os comandos deverão passar também a porta, por exemplo:</p>
<p>bin/createdb -p 5433 bdteste</p>
<p>bin/psql -p 5433 bdteste.</p>
<p><strong>Configurar, Compilar e Instalar </strong></p>
<p>sudo ./configure<br />
sudo make<br />
sudo make install<br />
sudo groupadd postgres<br />
sudo useradd -g postgres -d /usr/local/pgsql postgres<br />
sudo mkdir /usr/local/pgsql/data<br />
sudo chown postgres:postgres /usr/local/pgsql/data<br />
sudo passwd postgres<br />
su – postgres<br />
bin/initdb -D /usr/local/pgsql/data<br />
bin/pg_ctl -D /usr/local/pgsql/data start<br />
bin/createdb teste<br />
bin/psql teste</p>
<p>Isso irá criar um cluster com encoding UTF-8 (default do Ubuntu)</p>
<p><strong>Caso prefira iso-8859-1, antes de executar o initdb, exporta a variável LANG:<br />
</strong>export LANG=pt_BR.iso-8859-1<br />
bin/initdb &#8211;encoding latin1 -D /usr/local/pgsql/data</p>
<p><strong>Copiar o script de inicialização &#8220;linux&#8221; para o /etc/init.d</strong><br />
sudo cp /usr/local/src/postgresql-8.3.0/contrib/start-script/linux /etc/init.d/postgresql-8.3.0</p>
<p><strong>Dar permissão de execução ao script</strong><br />
sudo chmod u+x /etc/init.d/postgresql-8.3.0</p>
<p><strong>Adicionar ao Path<br />
</strong>su &#8211; postgres<br />
gedit /etc/bash.bashrc (e adicione a linha abaixo):<br />
PATH=/usr/local/pgsql/bin:$PATH</p>
<p style="text-align: right;">Fonte: http://postgresql.ribafs.org/</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/' rel='bookmark' title='Permanent Link: Introdução ao PostgreSQL'>Introdução ao PostgreSQL</a> <small>Resumo da História do PostgreSQL É um poderoso SGBD com...</small></li>
<li><a href='http://blog.deserv.info/2010/01/18/opendns-configurando-o-uso-dos-servidores-no-seu-computador-linux/' rel='bookmark' title='Permanent Link: OpenDNS: Configurando o uso dos servidores no seu computador: Linux'>OpenDNS: Configurando o uso dos servidores no seu computador: Linux</a> <small>O Linux possui vários utilitários gráficos para a configuração de...</small></li>
<li><a href='http://blog.deserv.info/2010/04/17/instalacao-do-clamav-com-dazukofs/' rel='bookmark' title='Permanent Link: Instalação do ClamAV com DazukoFS'>Instalação do ClamAV com DazukoFS</a> <small>Introdução // O ClamAV é um dos mais conhecidos antivírus...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/17/instalacao-do-postgresql-no-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução ao PostgreSQL</title>
		<link>http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/</link>
		<comments>http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/#comments</comments>
		<pubDate>Mon, 17 May 2010 02:42:48 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[AIX]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[HP-UX]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[SGI IRIX]]></category>
		<category><![CDATA[Solaris]]></category>
		<category><![CDATA[Tru64]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=376</guid>
		<description><![CDATA[Resumo da História do PostgreSQL É um poderoso SGBD com mais de 15 anos de ativo desenvolvimento. O PostgreSQL atual é derivado do POSTGRES, escrito pela universidade de Berkeley na Califórnia EUA). O POSTGRES foi inicialmente patrocinado pela Agência de Projetos de Pesquisa Avançados de Defesa (DARPA), pelo Escritório de Pesquisa sobre Armas (ARO), pela [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/17/instalacao-do-postgresql-no-linux/' rel='bookmark' title='Permanent Link: Instalação do PostgreSQL no Linux'>Instalação do PostgreSQL no Linux</a> <small>Numa instalação no Linux, mesmo com a versão 8.3.6, podemos...</small></li>
<li><a href='http://blog.deserv.info/2009/12/07/introducao-ao-linux/' rel='bookmark' title='Permanent Link: Introdução ao Linux'>Introdução ao Linux</a> <small>O Linux é um sistema operacional, ou seja, a interface...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p><strong>Resumo da História do PostgreSQL<br />
</strong>É um poderoso SGBD com mais de 15 anos de ativo desenvolvimento.</p>
<p>O PostgreSQL atual é derivado do POSTGRES, escrito pela universidade de Berkeley na Califórnia EUA). O POSTGRES foi inicialmente patrocinado pela Agência de Projetos de Pesquisa Avançados de Defesa (DARPA), pelo Escritório de Pesquisa sobre Armas (ARO), pela Fundação acional de Ciências (NSF) e pelo ESF, Inc. <span id="more-376"></span></p>
<p>PostgreSQL é o trabalho coletivo de centenas de desenvolvedores, trabalhando sob vinte-um anos e desenvolvimento que começou na Universidade da Califórnia, Berkeley. Com seu suporte de onga data a funcionalidades de nível corporativo de bancos de dados transacionais e escalabilidade,<br />
o PostgreSQL está sendo utilizado por muitas das empresas e agências de governo mais exigentes.<br />
O PostgreSQL é distribuído sob a licensa BSD, que permite uso e distribuição sem ônus para plicações comerciais e não-comerciais.</p>
<p>POSTGRES &#8211; 1986<br />
POSTGRES 1 &#8211; 06/1989<br />
POSTGRES 2 &#8211; 06/1990<br />
POSTGRES 3 &#8211; 06/1991</p>
<p>O Informix (adquirido pela IBM) foi originado do código do POSTGRES<br />
Em 1994 Andrew Yu and Jolly Chen adiciona um interpretador de SQL substituindo o PostQUEL<br />
Ele muda de nome para Postgres95 e tve seu código completamente reescrito em ANSI C</p>
<p>Postgres95 &#8211; 01/05/1995<br />
PostgreSQL 1 – 05/09/1995</p>
<p>Em 1996 muda novamente de nome, agora para PostgreSQL<br />
PostgreSQL 6 &#8211; 29/01/1997 (do 1.09 passou para o 6)<br />
PostgreSQL 7 &#8211; 08/05/2000<br />
PostgreSQL 8 &#8211; 19/01/2005 (primeira versão for Windows)<br />
PostgreSQL 8.1 &#8211; 08/11/2005<br />
PostgreSQL 8.2 &#8211; 05/12/2006<br />
PostgreSQL 8.3 &#8211; 04/02/2008 (versão atual)</p>
<p>Uma nova versão sai aproximadamente a cada ano.</p>
<p>Fontes:<br />
<a href="http://www.postgresql.org/docs/8.3/interactive/release.html" target="_blank">http://www.postgresql.org/docs/8.3/interactive/release.html</a><br />
<a href="http://www.postgresql.org/docs/8.3/interactive/history.html" target="_blank">http://www.postgresql.org/docs/8.3/interactive/history.html</a></p>
<p><strong>Características Avançadas do PostgreSQL</strong><br />
- Exporta em XML<br />
- Busca Textual, com TSearch2<br />
- Novos tipos de dados: ENUM e matrizes de tipos compostos<br />
- Suporte a SNMP<br />
- Transações<br />
- Replicação<br />
- Banco de dados objeto-relacional<br />
- Suporte a transações (padrão ACID)<br />
- Lock por registro (row level locking)<br />
- Integridade referencial<br />
- Número ilimitado de linhas e índices em tabelas<br />
- Extensão para GIS (base de dados geo-referenciados)<br />
- Acesso via drivers ODBC e JDBC<br />
- Interface gráfica de gerenciamento<br />
- Uso otimizado de recursos do sistema operacional<br />
- Suporte aos padrões ANSI SQL 92 e 99<br />
- Joins: Implementa todos os tipos de join definidos pelo padrão SQL99: inner join, left, right, full uter join, natural join.<br />
- Triggers, views e stored procedures<br />
- Suporte ao armazenamento de BLOBs (binary large objects)<br />
- Sub-queries e queries definidas na cláusula FROM<br />
- Backup online<br />
- Sofisticado mecanismo de tuning<br />
- Suporte a conexões de banco de dados seguras (criptografia)<br />
- Modelo de segurança para o acesso aos objetos de banco de dados por usuários e grupos de suários</p>
<p>Suporte aos tipos de dados SQL92 e SQL99, incluindo INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL e TIMESTAMP. Também suporta armazenamento de binary large objects, incluindo imagens, sons ou vídeo. Tem interfaces de programação nativa para C/C++, PHP, Java, .Net, Perl, Python, Ruby, Tcl, ODBC,</p>
<p><strong>Fonte</strong>: site do Dextra Treinamentos<br />
Lista completa: <a href="http://www.postgresql.org/about/press/features83" target="_blank">http://www.postgresql.org/about/press/features83</a> e<br />
<a href="http://www.postgresql.org/docs/8.3/static/release-8-3.html" target="_blank">http://www.postgresql.org/docs/8.3/static/release-8-3.html</a></p>
<p><strong>Limites do PostgreSQL</strong></p>
<table border="0">
<thead>
<tr>
<th align="left"><strong>Limit</strong></th>
<th align="left"><strong>Value</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Maximum Database Size</td>
<td>Unlimited</td>
</tr>
<tr>
<td>Maximum Table Size</td>
<td>32 TB</td>
</tr>
<tr>
<td>Maximum Row Size</td>
<td>1.6 TB</td>
</tr>
<tr>
<td>Maximum Field Size</td>
<td>1 GB</td>
</tr>
<tr>
<td>Maximum Rows per Table</td>
<td>Unlimited</td>
</tr>
<tr>
<td>Maximum Columns per Table</td>
<td>250 &#8211; 1600 depending on column types</td>
</tr>
<tr>
<td>Maximum Indexes per Table</td>
<td>Unlimited</td>
</tr>
</tbody>
</table>
<p><strong>Licença</strong><br />
O PostgreSQL usa a licença <a href="http://www.postgresql.org/about/licence" target="_blank">BSD</a>, que apenas requer que o código fonte sob licensa mantenha o seu ireito de cópia e a informação da licensa. Essa licensa certificada pela OSI é amplamente vista omo flexível e amigável a empresas, já que ela nao restringe o uso do PostgreSQL com aplicações<br />
comerciais e proprietárias. Juntamente com suporte de várias empresas e propriedade pública do ódigo, a licensa BSD torna o PostgreSQL muito popular entre empresas que querem embutir o anco de dados nos seus próprios produtos sem temor de taxas, enclausuramento a uma empresa, ou udanças nos termos da licença.</p>
<p><strong>Sistemas Operacionais Suportados</strong><br />
Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64) e Windows.</p>
<p><strong>Quem oferece Suporte ao PostgreSQL no Brasil</strong><br />
- Carlos Smanioto (Bauru)<br />
- dbExperts (SP)<br />
- Dextra (Campinas)<br />
- Flexsolutions Consultores (Goiânia)<br />
- Locadata (Belo Horizonte)<br />
- Mosman Consultoria e Desenvolvimento (São Pedro &#8211; SP)<br />
- Studio Server Hospedagem de Sites (Santos)</p>
<p>Detalhes e Lista completa: <a href="http://www.postgresql.org/support/professional_support_southamerica" target="_blank">http://www.postgresql.org/support/professional_support_southamerica</a></p>
<p>Oferecem Suporte ao PostgreSQL (consultores individuais e empresas):<br />
Lista completa: <a href="http://www.postgresql.org/support/professional_support" target="_blank">http://www.postgresql.org/support/professional_support</a></p>
<p>Mais empresas e consutores que oferecem suporte ao PostgreSQL:<br />
<a href="http://www.opensourcexperts.com/Index/index_html/PostgreSQL/index.html" target="_blank">http://www.opensourcexperts.com/Index/index_html/PostgreSQL/index.html</a></p>
<p><strong>Algumas Empresas que Patrocinam o PostgreSQL<br />
</strong>- InterpriseDB<br />
- Fijitsu<br />
- RedHat<br />
- Skype<br />
- Sun</p>
<p>Lista completa &#8211; <a href="http://www.postgresql.org/about/sponsors" target="_blank">http://www.postgresql.org/about/sponsors</a><br />
<strong>Algumas Empresas que usam o PostgreSQL (internacionais)</strong><br />
- Apple<br />
- BASF<br />
- Cisco<br />
- OMS (Organização Mundial de Saúde)</p>
<p><strong>Algumas Empresas que usam o PostgreSQL (nacionais)</strong><br />
- FAB (Força Aérea Brasileira)<br />
- Prefeitura Municipal de Sobral<br />
- Vivo<br />
- DNOCS<br />
- DETRAN do Ceará</p>
<p><strong>Equipe de Desenvolvimento do PostgreSQL<br />
</strong><a href="http://www.postgresql.org/community/contributors/" target="_blank">http://www.postgresql.org/community/contributors/</a><br />
<strong>Comunidade Brasileira<br />
</strong><a href="http://www.postgresq.org.br/" target="_blank">http://www.postgresq.org.br </a></p>
<p style="text-align: right;">Fonte: http://postgresql.ribafs.org</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/17/instalacao-do-postgresql-no-linux/' rel='bookmark' title='Permanent Link: Instalação do PostgreSQL no Linux'>Instalação do PostgreSQL no Linux</a> <small>Numa instalação no Linux, mesmo com a versão 8.3.6, podemos...</small></li>
<li><a href='http://blog.deserv.info/2009/12/07/introducao-ao-linux/' rel='bookmark' title='Permanent Link: Introdução ao Linux'>Introdução ao Linux</a> <small>O Linux é um sistema operacional, ou seja, a interface...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando e Integrandro Apache2 com Tomcat5</title>
		<link>http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/</link>
		<comments>http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/#comments</comments>
		<pubDate>Mon, 17 May 2010 02:19:59 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Apache Tomcat]]></category>
		<category><![CDATA[Apache2]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Instalando]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Tomcat5]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=374</guid>
		<description><![CDATA[Introdução Nesse artigo vamos demonstrar a integração do servidor web Apache com o servidor JSP Tomcat. Demonstrarei como instalar,configurar e integrar as switches, essa artigo foi baseado na distro debian, Apache2 e Tomcat5. Preparando a instalação Antes de começarmos a insatalação devemos adionar ao nosso source.lits os seguintes repositórios: ### Tomcat5 #### deb http://www.gallet.info.free.fr/debian/ sarge [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/' rel='bookmark' title='Permanent Link: Integração simples do Apache 2 com Tomcat 5'>Integração simples do Apache 2 com Tomcat 5</a> <small>Tutorial Basico de integração do Apache 2 com Tomcat. Instalando...</small></li>
<li><a href='http://blog.deserv.info/2010/01/03/compilar-php-pdo-oci-com-instantclient/' rel='bookmark' title='Permanent Link: Compilar PHP + PDO OCI com instantclient'>Compilar PHP + PDO OCI com instantclient</a> <small>Segue abaixo uma forma rápida e prática para se ativar...</small></li>
<li><a href='http://blog.deserv.info/2010/01/22/tutorial-tomcat-instalacao-e-configuracao-basica/' rel='bookmark' title='Permanent Link: Tutorial Tomcat &#8211; Instalação e Configuração Básica'>Tutorial Tomcat &#8211; Instalação e Configuração Básica</a> <small>Nota: Na revisão 13 deste tutorial, o conteúdo foi bastante...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<h2>Introdução</h2>
<p>Nesse artigo vamos demonstrar a integração do servidor web Apache com o servidor JSP Tomcat. Demonstrarei como instalar,configurar e integrar as switches, essa artigo foi baseado na distro debian, Apache2 e Tomcat5.</p>
<p><a id="Preparando_a_instala.C3.A7.C3.A3o" name="Preparando_a_instala.C3.A7.C3.A3o"></a><span id="more-374"></span></p>
<h2>Preparando a instalação</h2>
<p>Antes de começarmos a insatalação devemos adionar ao nosso source.lits os seguintes repositórios:</p>
<pre>### Tomcat5 ####
deb http://www.gallet.info.free.fr/debian/ sarge contrib main non-free

### JDK ###
deb http://www.linex.org/sources/linex/debian sarge linex

### PHP5 ###
deb http://people.debian.org/~dexter all sarge

Salve saia e atualize o aptitude.
<pre># aptitude update

 Instalando os Pacotes
<pre>Apache: # aptitude install apache2
Tomcat : # aptitude install tomcat5 tomcat5-examples tomcat5-admin
Mod_JK2 :# aptitude install libapache2-mod-jk2
JDK: # aptitude install  j2sdk1.4
J2SE: aptitude install  j2se-common
PHP5: # aptitude install php

<a id="Configurando_J2SDK" name="Configurando_J2SDK"></a>
<h2>Configurando J2SDK</h2>

Vamos editar o arquivo /etc/profile adicionando nela as seguintes variáveis de ambiente:
<pre>CATALINA_HOME=/usr/lib/j2re
TOMCAT_HOME=/usr/lib/j2re
JAVA_HOME=/usr/lib/j2se/1.4
Após digitar salve e saia e faça com que o profile seja carregado:
<pre>#source /ect/profile
<a id="Configurando_usu.C3.A1rios_no_Tomcat" name="Configurando_usu.C3.A1rios_no_Tomcat"></a>
<h2>Configurando usuários no Tomcat</h2>

Para podermo acessar a área adminsitrativa do nosso servidor tomcat, devemos alterar o arquivo tomcat-users.xml que fica no diretório: /var/lib/tomcat5/conf
<pre>#vi /var/lib/tomcat5/conf/tomcat-users.xml
Vamos remover todo o seu conteúdo, adicionando as seguintes entradas:
<pre>&lt;?xml version='1.0' encoding='utf-8'?&gt;
&lt;tomcat-users&gt;
  &lt;role rolename="manager"/&gt;
  &lt;role rolename="admin"/&gt;
  &lt;user username="admin" password="1234" roles="admin,manager"/&gt;
&lt;/tomcat-users&gt;

Onde myadminpass deve ser subistituído por uma senha de sua preferencia.
<a id="Configurando_Tomcat" name="Configurando_Tomcat"></a>
<h2>Configurando Tomcat</h2>

Agora vamos copiar o arquivo workers2.properties, que se enconta na pasta /usr/share/doc/libapache2-mod-jk2/examples/, para a pasta /etc/tomcat5
<pre># cp /usr/share/doc/libapache2-mod-jk2/examples/workers2.properties /etc/workers2.properties

<a id="Fazendo_apache_e_o_Tomcat__responderem_na_mesma_porta" name="Fazendo_apache_e_o_Tomcat__responderem_na_mesma_porta"></a>
<h2>Fazendo apache e o Tomcat  responderem na mesma porta</h2>

Como sabemos , o apache funciona na porta 80, já o tomcat funciona na porta 8080.
Devemos então fazer que as requizições que cheguem na porta 80 sejam direcionadas para a porta 8080 de forma tranasparente, para isso temos duas possibilidades, a primeira criar um redirecionamento com iptables:
<pre>iptables -A FORWARD -s ip_ser_tomcat -p tcp --dport 80 -j REDIRECT 8080
iptables -A FORWARD d ip_ser_tomcat -p tcp --sport 80 -j REDIRECT 8080
Com isso o iptables vai redirecionar todas as conexões que chegarem na porta 80 para a 8080, só que eu testei uma outra forma que eu particularmente gostei mais, vamos criar um proxy reverso, ele vai fazer exatamente o mesmo que o iptables, redirecionar as conexões destinadas a porta 80 para a 8080. 

Primeitamente temos que habilitando o módulo proxy:
<pre>ln -s /etc/apache2/mod-available/proxy.load /etc/apache2/mod-enable
<a id="Habilitando_o_m.C3.B3dulo_rewrite" name="Habilitando_o_m.C3.B3dulo_rewrite"></a>
<h2>Habilitando o módulo rewrite</h2>
<pre>ln -s /etc/apache2/mod-available/proxy.load /etc/apache2/mod-enable

Adicione as seguinte linhas no apache2.conf (/etc/apache2/apache2.conf)                                                                    
<pre>  ProxyPass       /jsp-examples      http://localhost:8080/jsp-examples
  ProxyPassReverse /jsp-examples     http://localhost:8080/jsp-examples
Salve o arquivo e saia

Inicie o Tomcat e o Apache (nessa ordem, primeiro o tomcat e enseguida o apache)

Adicione a seguintes linhas ao arquivo server.xml (/etc/tomcat5/server.xml)
<pre> &lt;Connector port="8081" ...
              proxyName="www.mycompany.com"
              proxyPort="80"/&gt;

<a id="Testando" name="Testando"></a>
<h2> Testando</h2>
<ul>
<li><a title="http://localhost/jsp-examples" onclick="_gaq.push(['_trackEvent', '/outgoing/http_localhost_jsp_examples', 1]);" rel="nofollow" href="http://localhost/jsp-examples">http://localhost/jsp-examples</a></li>
</ul>

<a id="Agradecimentos" name="Agradecimentos"></a>
<h2> Agradecimentos</h2>
<ul>
<li><a title="http://www.apache.org" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_apache_org', 1]);" rel="nofollow" href="http://www.apache.org/">http://www.apache.org</a></li>
<li><a title="http://tomcat.apache.org/" onclick="_gaq.push(['_trackEvent', '/outgoing/http_tomcat_apache_org_', 1]);" rel="nofollow" href="http://tomcat.apache.org/">http://tomcat.apache.org/</a></li>
<li><a title="http://tomcat.apache.org/faq/" onclick="_gaq.push(['_trackEvent', '/outgoing/http_tomcat_apache_org_faq_', 1]);" rel="nofollow" href="http://tomcat.apache.org/faq/">http://tomcat.apache.org/faq/</a></li>
</ul>

<a id="Autor" name="Autor"></a>
<h2> Autor</h2>

<strong>Leandro Moreira</strong></pre>
</pre>
</pre>
</pre>
</pre>
</pre>
</pre>
</pre>
</pre>
</pre>
</pre>
</pre>
</pre>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/' rel='bookmark' title='Permanent Link: Integração simples do Apache 2 com Tomcat 5'>Integração simples do Apache 2 com Tomcat 5</a> <small>Tutorial Basico de integração do Apache 2 com Tomcat. Instalando...</small></li>
<li><a href='http://blog.deserv.info/2010/01/03/compilar-php-pdo-oci-com-instantclient/' rel='bookmark' title='Permanent Link: Compilar PHP + PDO OCI com instantclient'>Compilar PHP + PDO OCI com instantclient</a> <small>Segue abaixo uma forma rápida e prática para se ativar...</small></li>
<li><a href='http://blog.deserv.info/2010/01/22/tutorial-tomcat-instalacao-e-configuracao-basica/' rel='bookmark' title='Permanent Link: Tutorial Tomcat &#8211; Instalação e Configuração Básica'>Tutorial Tomcat &#8211; Instalação e Configuração Básica</a> <small>Nota: Na revisão 13 deste tutorial, o conteúdo foi bastante...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/16/instalando-e-integrandro-apache2-com-tomcat5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comandos Console</title>
		<link>http://blog.deserv.info/2010/05/16/comandos-console/</link>
		<comments>http://blog.deserv.info/2010/05/16/comandos-console/#comments</comments>
		<pubDate>Mon, 17 May 2010 01:55:34 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Atributos e Nomes de Arquivos]]></category>
		<category><![CDATA[Comandos Console]]></category>
		<category><![CDATA[Comunicação Serial e Paralela]]></category>
		<category><![CDATA[Configuração do TCP/IP]]></category>
		<category><![CDATA[Configurando o terminal]]></category>
		<category><![CDATA[Diretórios Principais do Sistema]]></category>
		<category><![CDATA[Disparo do Xwindows e das suas aplicações]]></category>
		<category><![CDATA[Intercambiando Disquetes com o MS-DOS]]></category>
		<category><![CDATA[Manipulando processos]]></category>
		<category><![CDATA[O Kernel]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Procedimentos de boot e o init]]></category>
		<category><![CDATA[Redirecionamento da Entrada e da Saída; Pipes]]></category>
		<category><![CDATA[Serviços TCP/IP]]></category>
		<category><![CDATA[Shell Scripts]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Uso de Expressões Regulares]]></category>
		<category><![CDATA[Uso de Metacaracteres]]></category>
		<category><![CDATA[Variáveis de Environment]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=371</guid>
		<description><![CDATA[Ligando e Desligando a Máquina Salvo orientação específica do hardware em uso, ligar uma máquina Unix não costuma envolver maiores detalhes do que o acionamento de um botão liga/desliga no console da máquina e uma eventual intervenção humana logo em seguida, solicitando o boot efetivo do sistema a partir de um menu de opções. O [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/20/estilizando-o-prompt-da-console-com-uso-de-cores/' rel='bookmark' title='Permanent Link: Estilizando o PROMPT da console (com uso de cores)'>Estilizando o PROMPT da console (com uso de cores)</a> <small>Para quem gosta de trabalhar com a console (modo texto)...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p><a name="onoff"> </a></p>
<h2><a name="onoff"> Ligando e Desligando a Máquina </a></h2>
<p><a name="onoff">Salvo orientação específica do hardware em uso, ligar uma máquina <strong>Unix</strong> não costuma envolver maiores detalhes do que o acionamento de um botão liga/desliga no console da máquina e uma eventual intervenção humana logo em seguida, solicitando o <em>boot</em> efetivo do sistema a partir de um menu de opções. </a></p>
<p><a name="onoff"> O <em>boot</em> costuma gerar uma razoável quantidade de mensagens que aparecem no console da máquina. Normalmente elas referem-se aos diferentes estágios do reconhecimento e inicialização do hardware. É interessante conhecê-las, não obstante, salvo contingências, podem ser ignoradas até que surja o prompt ou a janela de login. </a></p>
<p><a name="onoff"> <span id="more-371"></span> O desligamento é um processo mais delicado. O <strong>Unix</strong> utiliza parte da memória principal como <em>cache</em> de disco, a fim de acelerar as operações de leitura e gravação de arquivos. Antes de se desligar a máquina, é necessário assegurar que os discos estejam <em>sincronizados</em> com o cache, o que é feito pelo comando <strong>sync</strong>, que deve ser precedido do encerramento de todos os processos, a fim de que não ocorra uma dessincronização em seguida. Todos esses passos são tomados pelo comando <strong>shutdown</strong>: </a></p>
<pre><a name="onoff"><strong>$ shutdown</strong> -y -g 1 -i 5 (Solaris)
<strong>$ shutdown</strong> -h now (Linux)
</a></pre>
<p><a name="onoff">Em sistemas baseados em <strong>PC</strong>, o <strong>shutdown</strong> por vezes é acionável através do <strong>ctrl-alt-del</strong>. </a><a name="files"> </a></p>
<h2><a name="files"> Manipulando arquivos e diretórios </a></h2>
<p><a name="files">O <em>shell</em> é o programa que lê e executa os comandos que você passa a digitar logo após logar no sistema, como <strong>cd</strong> ou <strong>ls</strong>. Via de regra você estará usando o <em>Bourne shell</em> (<strong>sh</strong>), ou o <em>C shell</em> (<strong>csh</strong>), ou aperfeiçoamentos desses, como o <em>Korn shell</em> (<strong>ksh</strong>) ou o <em>Bourne again shell</em> (<strong>bash</strong>). Via de regra você poderá descobrir qual deles está usando ao executar um <strong>ps</strong> ou um <strong>finger</strong> com o seu <em>username</em> com argumento. </a></p>
<p><a name="files">Obsoleta ou não, a interface de linha de comandos possui características ainda não suficientemente reproduzidas nas interfaces gráficas, como a possibilidade de uso remoto com baixa banda, e a programabilidade. No caso do Unix, há ainda a vantagem dela estar melhor estandardizada que as interfaces gráficas. Em boa parte dessas notas estaremos nos referindo à interface de linha de comandos, mas abordaremos também a interface gráfica ao final. Vejamos alguns típicos comandos dos sistemas Unix-like: </a></p>
<ul>
<li>
<pre><a name="files"><strong>cat</strong> [-r] arquivo1 arquivo2 ... </a></pre>
<p><a name="files"> Concatena os vários arquivos, na ordem especificada, copiando o resultado para a saída padrão. Se não houver argumentos, copia a entrada padrão para a saída padrão. </a></li>
<li>
<pre><a name="files"><strong>cd</strong> diretório</a></pre>
<p><a name="files"> Troca o diretório corrente para o diretório especificado, ou para o diretório <em>home</em>, se não houver argumento. </a></li>
<li>
<pre><a name="files"><strong>cp</strong> [-r] argumento1 argumento2 ... </a></pre>
<p><a name="files"> Copia um ou mais arquivos, trocando seu nome ou criando a cópia num outro diretório, conforme a quantidade e o tipo dos argumentos. Se o primeiro argumento for um diretório, faz uma cópia recursiva de toda a subárvore iniciada nele, desde que a opção <strong>-r</strong> (<em>recursive</em>) tiver sido especificada. </a></li>
<li>
<pre><a name="files"><strong>chmod</strong> nnn argumento1 argumento2 ... </a></pre>
<p><a name="files"> Troca os atributos do(s) argumento(s) para <strong>nnn</strong> (veja <em>atributos de arquivos</em>). Ao invés de <strong>nnn</strong>, a alteração pode ser especificada por exemplo como <strong>a+r</strong> ou <strong>g-w</strong> (<strong>a</strong>, <strong>g</strong> e <strong>o</strong> significam <em>all</em>, <em>group</em> e <em>owner</em>; <strong>+</strong> significa <em>adicionar</em> e <strong>-</strong> <em>remover</em>; <strong>r</strong>,<strong>w</strong>,           <strong>x</strong> e <strong>s</strong> indicam respectivamente atributos de leitura, escrita, execução e setuid). </a></li>
<li>
<pre><a name="files"><strong>ls</strong> [-la] diretório1 diretório2 ... </a></pre>
<p><a name="files"> Lista o conteúdo do(s) diretório(s) especificado(s), ou do diretório corrente se não houver argumento. Opções principais:<br />
<strong>-a</strong> Inclui arquivos com nome iniciado por &#8220;.&#8221; (tais arquivos normalmente armazenam configurações de aplicativos).<br />
<strong>-l</strong> Formato longo (veja <em>atributos de arquivos</em>).<br />
</a></li>
<li>
<pre><a name="files"><strong>ln -s</strong> argumento1 argumento2 </a></pre>
<p><a name="files"> Cria um <em>link simbólico</em> cujo nome é o primeiro argumento, apontando para o segundo argumento. A opção <strong>-s</strong> não pode ser omitida, ou o link criado será um <em>hard link</em>, ao invés de simbólico. </a></li>
<li>
<pre><a name="files"><strong>man</strong> [-k] nome </a></pre>
<p><a name="files"> Invoca a <em>man-page</em> associada ao nome, ou exibe uma lista das man pages associadas ao nome, no caso da opção <strong>-k</strong> (de <em>key</em>) ter sido especificada. </a></p>
<p><a name="files"> As man pages <strong>Unix</strong> são referências técnicas sumárias por vezes difíceis de compreender. Elas são exibidas através do <strong>more</strong> ou de algum outro paginador semelhante, por isso os comandos do <strong>more</strong> indicados mais adiante valem para a leitura de man pages, e são úteis para ajudar a localizar informações dentro de uma man page. </a></p>
<p><a name="files">As man pages são divididas em seções, que tradicionalmente são referidas através de parênteses. Por exemplo, a man page <strong>shutdown(2)</strong> é a man page do system call chamado shutdown, ao passo que a man page <strong>shutdown(8)</strong> é a man page do comando administrativo <strong>shutdown</strong>. Além dessas, a seção 1 contém manuais de comandos comuns, a 3 contém manuais de serviços de bibliotecas, a 4 descreve device special files, a 5 descreve formatos de arquivos de configuração, a 6 os jogos eventualmente instalados, e a 7 contém tudo o mais que não couber nas anteriores. </a></li>
<li>
<pre><a name="files"><strong>mkdir</strong> diretório1 diretório2 ... </a></pre>
<p><a name="files"> Cria os diretório(s) especificado(s). </a></li>
<li>
<pre><a name="files"><strong>more</strong> arquivo </a></pre>
<p><a name="files"> Exibe de forma paginada o arquivo especificado, ou a entrada padrão no caso de não haver argumento. Aceita vários comandos, entre eles<br />
</a></p>
<table width="100%">
<tbody>
<tr>
<td width="20%"><strong>ESPAÇO</strong>,                 <strong>C-b</strong><br />
<strong>/</strong><br />
<strong>?</strong></td>
<td width="80%">Avança/recua uma página.<br />
Busca.<br />
Exibe relação de comandos.</td>
</tr>
</tbody>
</table>
</li>
<li>
<pre><a name="files"><strong>mv</strong> argumento1 argumento2</a></pre>
<p><a name="files">Renomeia o primeiro argumento, que pode ser um arquivo ou um diretório, para o nome dado como segundo argumento. Se ao tentar executar esse comando a mensagem de erro <em>cannot move across filesystems</em> for exibida, é porque a origem e o destino estão em filesystems diferentes. Nesse caso deve-se copiar a origem para o destino usando <strong>cp</strong>, e depois remover a origem com <strong>rm</strong>. </a></li>
<li>
<pre><a name="files"><strong>rm</strong> [-r] argumento1 argumento2 ... </a></pre>
<p><a name="files">Remove os arquivo(s) especificado(s). Se um argumento for um diretório, remove toda a subárvore iniciada nele, desde que a opção <strong>-r</strong> (<em>recursive</em>) tenha sido especificada. Via de regra não há modo em sistemas Unix-like de recuperar (<em>undelete</em>) um arquivo removido. </a></li>
<li>
<pre><a name="files"><strong>rmdir</strong> diretório1 diretório2 ... </a></pre>
<p><a name="files">Remove os diretório(s) especificado(s), desde que estejam vazios. </a></li>
<li>
<pre><a name="files"><strong>vi</strong> arquivo </a></pre>
<p><a name="files">O <strong>vi</strong> é uma ferramenta obsoleta, mas está está presente em virtualmente qualquerr plataforma Unix-like, e constitui por vezes a única alternativa para edição de arquivos, por isso convém conhecê-lo ao menos de forma minimal. No uso quotidiano, entretanto, normalmente preferir-se-á outras ferramentas, como o <strong>emacs</strong> ou o <strong>pico</strong> ou outras. </a></p>
<table width="100%">
<tbody>
<tr>
<td width="10%"><strong>h</strong>, <strong>j</strong>,                 <strong>k</strong>, <strong>l</strong><br />
<strong>C-f</strong>,<strong>C-b</strong><br />
<strong>x</strong>,<strong>X</strong><br />
[n]<strong>dd</strong><br />
<strong>i</strong>,<strong>ESC</strong><br />
<strong>a</strong>,<strong>A</strong><br />
<strong>J</strong><br />
<strong>:</strong></td>
<td width="90%">cursor para esquerda/baixo/cima/direita.<br />
Página seguinte/anterior.<br />
Remove caracter atual/anterior.<br />
Remove n linhas (default 1).<br />
Entra/sai do modo inserção.<br />
Insere após caracter atual/final da linha.<br />
Concatena linha seguinte à atual.<br />
entra comando, entre eles <strong>w</strong> (salva), <strong>q</strong> (sair) e <strong>/</strong> (busca).</td>
</tr>
</tbody>
</table>
</li>
<li>
<pre><a name="files"><strong>wc</strong> arquivo1 arquivo2 ... </a></pre>
<p><a name="files">Obtém o total de linhas, palavras e caracteres de cada um dos arquivos estipulados, ou da entrada padrão no caso de não haver argumentos. </a></li>
</ul>
<hr /><a name="scripts"> </a></p>
<h2><a name="scripts"> Shell Scripts </a></h2>
<p><a name="scripts">Seqüências de comandos que se necessita repetir com grande frqüência podem ser colocados num arquivo que, ao ser &#8220;executado&#8221;, ocasiona o disparo de cada um dos comandos da seqüência, na ordem indicada. Um arquivo desses é um <em>shell script</em>, cujo equivalente no <strong>MS-DOS</strong> são os arquivos &#8220;<strong>.BAT</strong>&#8221;. </a></p>
<p><a name="scripts"> Mesmo que nunca se escreva nenhum, com certa freqüência é necessário analisar shell scripts a fim de elucidar o modo de uso de determinados comandos, ou de realizar diagnósticos. Suponhamos por exemplo que você não se lembre como usar um comando chamado <strong>xpatgen</strong>, mas esteja com um shell num diretório que contém scripts, que usam entre outros o <strong>xpatgen</strong>. Basta então buscar ocorrências dele nos scripts: </a></p>
<pre><a name="scripts"><strong>$ grep</strong> xpatgen *
patgen: xpatgen -cal_bl
</a></pre>
<p><a name="scripts"> Com isso sabemos que o script <strong>patgen</strong> executa o <strong>xpatgen</strong>, e relembramos o modo de executar esse comando, o que talvez já seja suficiente para a necessidade do momento. </a></p>
<p><a name="scripts"> Shell scripts utilizam com freqüência de variáveis de environment e de parâmetros de linha de comando. Assim, se ao analisar um script você se deparar com algo como <strong>$HOST</strong>, lembre-se de que nesse ponto será substituído o valor da variável <strong>HOST</strong>, e que <strong>$1</strong> significa o <em>primeiro parâmetro da linha de comandos</em>, <strong>$2</strong> o segundo, e assim por diante. </a></p>
<hr /><a name="envir"> </a></p>
<h2><a name="envir"> Variáveis de Environment </a></h2>
<p><a name="envir"> Além dos parâmetros de linha de comandos como <strong>-l</strong> ou outros, pode-se também passar parâmetros a um programa através do uso de <em>variáveis de environment</em>. As mais comuns são: </a></p>
<ul>
<li><a name="envir"> <strong>PATH</strong> &#8211; Lista os diretórios (separados por &#8220;:&#8221;) onde os executáveis serão procurados, tipicamente           <strong>/bin</strong>, <strong>/usr/bin</strong> e <strong>/usr/X11/bin</strong>, entre outros. </a></li>
<li><a name="envir"> <strong>TERM</strong> &#8211; Tipo do terminal, por exemplo <strong>xterm</strong> ou <strong>vt100</strong> (veja <em>Configurando o Terminal</em>). </a></li>
<li><a name="envir"> <strong>DISPLAY</strong> &#8211; Display default para as aplicações Xwindows. </a></li>
</ul>
<p><a name="envir"> Para exibir o valor de uma delas pode-se usar <strong>echo</strong>, antepondo o operador <strong>$</strong> ao nome da variável, por exemplo: </a></p>
<pre><a name="envir"><strong>$</strong> echo $TERM</a></pre>
<p><a name="envir">Existem dois estilos de atribuição de valores a variáveis de environment, o do <em>Bourne shell</em>, usado pelo <strong>sh</strong>,       <strong>ksh</strong> e <strong>bash</strong>: </a></p>
<pre><a name="envir"><strong>$</strong> TERM=vt100; <strong>export</strong> TERM</a></pre>
<p><a name="envir">e o do <em>C shell</em>, usado pelo <strong>csh</strong> e pelo <strong>tcsh</strong>: </a></p>
<pre><a name="envir"><strong>%</strong> <strong>setenv</strong> TERM vt100</a></pre>
<hr /><a name="metacs"> </a></p>
<h2><a name="metacs"> Uso de Metacaracteres </a></h2>
<p><a name="metacs"> O metacaracter mais utilizado provavelmente é o &#8220;*&#8221;. Por exemplo, </a></p>
<pre><a name="metacs"><strong>$</strong> <strong>rm *</strong></a></pre>
<p><a name="metacs"> irá remover todos os arquivos do diretório corrente. É necessário prestar atenção a dois detalhes quando se usa metacaracteres: </a></p>
<ol><a name="metacs"> </a></p>
<li><a name="metacs"> O caracter &#8220;.&#8221; não tem o significado de separador entre nome e sufixo que possui no <strong>MS-DOS</strong>, por isso <strong>&#8220;*.*&#8221;</strong> significa <em>todos os arquivos em cujo nome ocorre ao menos um ponto</em>.
<p></a></li>
<p><a name="metacs"> </a></p>
<li><a name="metacs"> A expansão do metacaracter é feita pelo shell, e não pela aplicação, por isso o comando
<pre><strong>$ mv *.txt *.bak</strong></pre>
<p>não irá surtir o efeito esperado de renomear todos os arquivos que terminam com &#8220;.txt&#8221; para &#8220;.bak&#8221; (para essa operação deve-se usar o comando <strong>for</strong>).</p>
<p></a></li>
<p><a name="metacs"> </a></ol>
<p><a name="metacs">Os shells <strong>Unix</strong> aceitam também o metacaracter &#8220;<strong>?</strong>&#8221;, que significa <em>qualquer caracter</em> e tambem <em>intervalos</em>, como <strong>[0-9]</strong> (<em>qualquer dígito decimal</em>), entre outros. </a></p>
<hr /><a name="eregs"> </a></p>
<h2><a name="eregs"> Uso de Expressões Regulares </a></h2>
<p><a name="eregs">Aplicativos <strong>Unix</strong> via de regra aceitam expressões regulares como argumentos de busca. Os usos mais freqüentes delas são bem ilustrados através do aplicativo <strong>grep</strong>. Nos casos abaixo ele será utilizado para buscar uma dada expressão em todos os arquivos do diretório corrente: </a></p>
<ol>
<li><a name="eregs"> Busca de ocorrências de algum dos anos da década de 80: </a>
<pre><a name="eregs"><strong>$ grep</strong> "198[0-9]" * </a></pre>
</li>
<li><a name="eregs"> Busca de uma ocorrência da palavra &#8220;yellow&#8221; seguida de uma ocorrência da palavra &#8220;page&#8221;, separadas por zero ou mais caracteres quaisquer: </a>
<pre><a name="eregs"><strong>$ grep</strong> -i "yellow.*page" * </a></pre>
</li>
<li><a name="eregs"> Busca de uma das palavras &#8220;roget&#8221; ou &#8220;thesaurus&#8221;: </a>
<pre><a name="eregs"><strong>$ grep</strong> -i "roget\|thesaurus" * </a></pre>
</li>
</ol>
<p><a name="eregs"> A sintaxe das expressões regulares pode variar um pouco, dependendo da plataforma e da ferramenta. Via de regra as diferenças consistem em proteger-se ou não alguns caracteres especiais, e nas extensões que algumas ferramentas introduzem. Note por exemplo, o uso do <strong>egrep</strong>, em comparação com o uso do <strong>grep</strong> acima: </a></p>
<pre><a name="eregs"><strong>$ egrep</strong> -i "roget|thesaurus" * </a></pre>
<p><a name="eregs"> Via de regra todas as ferramentas <strong>Unix</strong> que lidam com texto, como o <strong>more</strong>, o <strong>sed</strong>, e o <strong>vi</strong>, entre outros, aceitam expressões regulares como argumento de buscas. </a></p>
<hr /><a name="procs"> </a></p>
<h2><a name="procs"> Manipulando processos </a></h2>
<p><a name="procs"> Um processo é um programa em execução. Num computador que possui apenas uma cpu, na verdade apenas um processo pode estar sendo executado em cada instante. O que se faz é executar um processo durante uma fração fixa de segundo, congelá-lo e passar a executar um outro, e assim por diante, criando a ilusão de simultaneidade. </a></p>
<p><a name="procs"> Através do comando ps pode-se examinar os processos correntes. Por exemplo: </a></p>
<pre><a name="procs">$ <strong>ps</strong>
PID TTY STAT TIME COMMAND
45 v02 S 0:00 -bash
105 v02 R 0:00 ps
</a></pre>
<p><a name="procs"> O <strong>ps</strong> em geral omite muitos processos a fim de exibir uma saída limpa. Através das opções <strong>a</strong> e <strong>x</strong> (ou <strong>e</strong> no <strong>Solaris</strong>), pode-se exibir todos os processos correntes. O número de um processo é usado, por exemplo quando é necessário interromper prematuramente a sua execução, através do comando <strong>kill</strong>. </a></p>
<p><a name="procs">A finalidade primária do comando <strong>kill</strong> não é matar um processo, mas enviar um sinal para ele. O Unix possui diversos sinais predefinidos, como SIGHUP, SIGPIPE, SIGTERM, etc. O atendimento a um sinal entretanto é responsabilidade do processo, ou do programador que fez o programa, e por isso a forma com que cada processo reagirá a cada sinal poderá variar. A fim de se interromper a execução de um processo, deve-se enviar para ele o sinal SIGKILL: </a></p>
<pre><a name="procs">$ <strong>kill</strong> -SIGKILL 45
$ <strong>kill</strong> -9 45
</a></pre>
<p><a name="procs">As duas formas acima em geral são equivalentes (o número associado a cada sinal pode variar com a plataforma). </a></p>
<p><a name="procs"> O caracter &#8220;<strong>&amp;</strong>&#8221; colocado ao final da linha de comandos instrui o shell para disparar o comando em <em>background</em>, a fim de que se possa continuar usando o shell mesmo antes desse comando encerrar a sua execução. </a></p>
<p><a name="procs"> O comando <strong>nice</strong> faz com que um processo seja disparado com <em>baixa prioridade</em>. </a></p>
<pre><a name="procs"> $ <strong>nice gzip -9 *</strong></a></pre>
<p><a name="procs"> O comando <strong>nohup</strong> faz com que o processo sendo disparado se torne imune ao sinal <strong>SIGHUP</strong>. Em combinação com o <strong>&amp;</strong>, ele permite o disparo de programas que permanecerão em execução mesmo após o <em>logout</em> do usuário. Exemplos: </a></p>
<pre><a name="procs"> $ <strong>nohup gzip -9 * &amp;</strong></a></pre>
<p><a name="procs"> Através do comando <strong>at</strong> pode-se programar a execução de um comando para um horário determinado. Por exemplo: </a></p>
<pre><a name="procs">$ <strong>at now + 1 minute</strong>
ls
<em>ctrl-d</em>
</a></pre>
<p><a name="procs">O comando <strong>ls</strong> será dessa forma executado daqui a um minuto. Note que na linha seguinte do comando <strong>at</strong> o que se escreve é na verdade um shell script, terminado com control-d. Ao invés de digitá-lo, poder-se-ia lê-lo de um arquivo através do redirecionamento da entrada: </a></p>
<pre><a name="procs">$ <strong>at now + 1 minute &lt;meuscript </strong>
</a></pre>
<p><a name="procs">A execução periódica de um comando se faz através do <strong>cron</strong>, que é disparado no boot do sistema e monitora as tabelas de execução periódica de comandos de todos os usuários (a cada usuário corresponde uma tabela). Uma tal tabela é chamada <strong>crontab</strong>. Através dela pode-se especificar que um comando seja executado a cada hora, ou diariamente, ou semanalmente, etc. A edição, inspeção e remoção da <strong>crontab</strong> de um usuário é feita através do comando <strong>crontab</strong>, e opções <strong>-e</strong>, <strong>-l</strong> e <strong>-d</strong>. Cada linha da crontab indica um comando e a periodicidade com que ele deve ser executado (minutos, horas, dias do mês, meses e dias da semana). Por exemplo: </a></p>
<pre><a name="procs">$ crontab -l
40 07 * * * updatedb
0 22 5 * * pagamento
0 6,12,15,18 * * * fetch
0 0 * * 6 backup
</a></pre>
<p><a name="procs">No caso a crontab contém três comandos. O <strong>updatedb</strong> deverá ser executado todos os dias às 7:40. O comando <strong>pagamento</strong> deverá ser executado às 22:00 do dia 5 de cada mês, e o <strong>backup</strong> será executado à zero hora de cada sábado. </a></p>
<p><a name="procs">Note que a <strong>crontab</strong> é um arquivo texto simples, e quando se executa o comando <strong>crontab</strong> com a opção <strong>-e</strong>, entra-se num editor de textos para editá-la. O editor de textos utilizado normalmente será o <strong>vi</strong>, ou aquele especificado na variável de environment <strong>EDITOR</strong>. </a></p>
<hr /><a name="term"> </a></p>
<h2><a name="term"> Configurando o terminal </a></h2>
<p><a name="term"> O <em>terminal</em> pode ser um terminal no sentido estrito do termo, conectado ao computador por uma linha serial, ou então o próprio console da máquina, ou uma aplicação como o <strong>xterm</strong> emulando um terminal dentro do <strong>Xwindows</strong>, </a></p>
<p><a name="term"> A configuração do terminal é necessária para executar aplicativos como editores de texto visuais, ou para os comandos de teclado como <em>backspace</em> serem corretamente reconhecidos. Essa configuração envolve a <em>configuração do driver do sistema</em>, feita através do comando <strong>stty</strong> e o <em>informe da aplicação</em>, normalmente feito através da variável <strong>TERM</strong>. Vejamos exemplos de situações onde uma delas ou ambas são necessárias, e como realizá-la: </a></p>
<ol>
<li><a name="term"> Ao pressionar a tecla <em>backspace</em>, ao invés de ser apagado o caracter anterior, surge na tela os caracteres &#8220;^H&#8221;. Solução: </a>
<pre><a name="term"><strong>$ stty erase ^H</strong></a></pre>
</li>
<li><a name="term"> Ao executar o <strong>more</strong> ou o <strong>vi</strong>, algumas linhas permanecem escondidas, ou o <em>scroll</em> comporta-se de forma errática. Solução: cheque quantas linhas (vamos supor: 24) e quantas colunas (vamos supor: 80) o seu terminal/emulador possui e execute </a><a name="term"> </a>
<pre><a name="term">$ <strong>stty</strong> rows 24 cols 80</a></pre>
</li>
<li><a name="term"> Após o uso de alguma aplicação, os caracteres aparecem trocados ou o <em>eco</em> deixou de funcionar, ou quando pressiono <em>enter</em> o cursor permanece na mesma linha. Tentativa de solução: </a><a name="term"> </a>
<pre><a name="term"><strong>$ stty sane</strong></a></pre>
</li>
<li><a name="term"> Ao tentar executar uma aplicação, a mensagem de erro <em>terminal capability cm required</em>, ou <em>Terminal type is not defined</em>, ou <em>Terminal type is not powerful enough</em>, ou outra semelhante foi exibida. Solução: cheque o tipo de terminal que você está usando ou emulando (dificilmente será algo diferente de <strong>xterm</strong> ou <strong>vt100</strong>) e atribua para a variável de environment <strong>TERM</strong> esse valor. </a></li>
</ol>
<hr /><a name="dirs"> </a></p>
<h2><a name="dirs"> Diretórios Principais do Sistema </a></h2>
<p><a name="dirs">No <strong>Unix</strong> não há o conceito de nomes de <em>drives</em>, como <strong>C:</strong>, mas todos os <em>paths</em> partem de uma raiz comum, o <em>root directory</em> &#8220;<strong>/</strong>&#8221;. Quando a máquina possui vários discos diferentes (ou ao menos várias partições diferentes de um mesmo disco), cada uma delas em geral corresponderá a uma subárvore do filesystem, como <strong>/usr</strong>, <strong>/var</strong> ou ainda nomes não standard como <strong>/disco2</strong>, que são chamados de seus <em>pontos de montagem</em>. O comando <strong>mount</strong> executado sem parâmetros listará os diferentes dispositivos físicos <em>montados</em> (discos locais e remotos e suas partições) e a subárvore correspondente a cada um deles. A tabela que indica todas essas montagens é o arquivo <strong>/etc/fstab</strong>. Apesar de algumas pequenas diferenças de plataforma para plataforma, os diretórios principais do sistema são: </a></p>
<table width="100%">
<tbody>
<tr>
<td width="10%"><strong>/bin</strong><br />
<strong>/sbin</strong><br />
<strong>/etc</strong><br />
<strong>/home</strong><br />
<strong>/lib</strong><br />
<strong>/proc</strong><br />
<strong>/tmp</strong><br />
<strong>/usr</strong></td>
<td width="90%">Binários básicos, como <strong>sh</strong> e <strong>ls</strong>.<br />
Binários básicos de administração do sistema.<br />
Arquivos de configuração do sistema e scripts de boot.<br />
Os diretórios dos usuários residem aqui.<br />
Bibliotecas básicas.<br />
Estado corrente do sistema e dos processos.<br />
Arquivos temporários.<br />
Demais binários e bibliotecas.</td>
</tr>
</tbody>
</table>
<p><a name="dirs"> O termo <em>básico</em> aplicado acima aos diretórios <strong>/bin</strong> e <strong>/lib</strong> quer significar principalmente <em>essenciais para o boot e operação mínima do sistema</em>. A separação desses elementos básicos, em contraposição aos que são deixados no <strong>/usr</strong>, deve-se a razões práticas, principalmente para facilitar a organização de redes de máquinas compartilhando subárvores de diretório. De fato, é comum que o diretório <strong>/usr</strong> ao invés de estar replicado em todas as máquina da rede esteja residindo fisicamente num único disco, e sendo compartilhado por todas as máquinas. </a></p>
<hr /><a name="atribs"> </a></p>
<h2><a name="atribs"> Atributos e Nomes de Arquivos </a></h2>
<p><a name="atribs"> No <strong>Unix</strong> cada arquivo (inclusive diretórios, que são casos particulares de arquivos), conta com um conjunto de <em>atributos</em> de leitura, escrita e execução, que são setáveis através do comando <strong>chmod</strong>, e podem ser exibidos pelo comando <strong>ls -l</strong>: </a></p>
<pre><a name="atribs"><strong>$ ls -l</strong> /bin/cat
-rwxr-xr-x 1 root root 16584 Dec 16 20:09 /bin/cat
</a></pre>
<p><a name="atribs"> A <em>string</em> <strong>-rwxr-xr-x</strong> representa os atributos do arquivo <strong>/bin/cat</strong>. O primeiro caracter (<strong>-</strong>) significa que se trata de um arquivo regular, em contraposição aos diretórios (<strong>d</strong>), <em>device special files</em> (<strong>c</strong>) e <em>links</em> simbólicos (<strong>l</strong>). Os 9 caracteres restantes informam as permissões de <em>leitura</em>, <em>escrita</em> e <em>execução</em> desse arquivo relativas ao seu proprietário, ao seu grupo, e a todos os demais. O proprietário e o grupo são informados logo à direita, e no caso são o <em>usuário       <strong>root</strong> e o <em>grupo</em> <strong>root</strong>. </em></a></p>
<p><a name="atribs"><em>Note que no <strong>Unix</strong> não existem os atributos de arquivo <em>oculto</em> (&#8220;hidden&#8221;) e <em>do sistema</em> (&#8220;system&#8221;), suportados no <strong>MS-DOS</strong>. Não obstante, arquivos cujo primeiro caractere é ponto (&#8220;.&#8221;) normalmente são omitidos pelo <strong>ls</strong>, a não ser que se utilize a opção <strong>-a</strong> (de &#8220;all&#8221;), conforme comentamos no início. </em></a></p>
<p><a name="atribs"><em>Um atributo importantíssimo existente no <strong>Unix</strong> é o chamado <strong>setuid</strong>, através do qual um processo adquire ao ser executado os privilégios do owner do arquivo. Isso é frequentemente utilizado por programas que são disparados por usuários não privilegiados mas que por algum motivo necessitam dos privilégios do superusuário, por exemplo: </em></a></p>
<pre><a name="atribs"><em>$ ls -l /usr/sbin/pppd
-rwsr-xr-x 1 root bin 104876 Apr 27 1998 /usr/sbin/pppd
</em></a></pre>
<p><a name="atribs"><em>Sem os privilégios de superusuário, um usuário comum não conseguiria configurar a interface ppp e nem alterar a tabela de rotas do sistema, no momento em que se conecta ao provedor Internet. Assim, o <strong>pppd</strong>, ao ser executado, requisitará os privilégios do owner do arquivo, que no caso é o superusuário, e dessa forma ele poderá realizar essas operações. </em></a></p>
<p><a name="atribs"><em> No <strong>Unix</strong> via de regra são suportados nomes &#8220;longos&#8221; (até 64 ou às vezes até 256 caracteres), e o &#8220;.&#8221; não é um separador entre o nome do arquivo e sua extensão, mas um caracter como os outros. Não obstante, a noção de &#8220;sufixo&#8221; é utilizada informalmente para facilitar a identificação de alguns formatos de arquivos, por exemplo: </em></a></p>
<table width="100%">
<tbody>
<tr>
<td width="10%"><strong>.tar</strong><br />
<strong>.zip</strong><br />
<strong>.Z</strong><br />
<strong>.gz</strong></td>
<td width="90%"><em>Archive</em> produzido com <strong>tar</strong><br />
<em>Archive</em> comprimido produzido com <strong>zip</strong><br />
Arquivo comprimido com <strong>compress</strong><br />
Arquivo comprimido com <strong>gzip</strong></td>
</tr>
</tbody>
</table>
<p><a name="atribs"><em> <em>Archives</em> (o termo não tem correspondente em português) são concatenações de vários arquivos ou de subárvores inteiras num único arquivo. Em <strong>Unix</strong>, tipicamente são produzidos com <strong>tar: </strong></em></a></p>
<pre><a name="atribs"><em><strong><strong>$ tar cvf</strong> /tmp/etc.tar /etc
<strong>$ tar tvf</strong> /tmp/etc.tar /etc
<strong>$ cd </strong> /tmp; tar xvf</strong> etc.tar
</em></a></pre>
<p><a name="atribs"><em> O primeiro comando irá criar o <em>archive</em> /tmp/etc.tar, composto por toda a subárvore /etc. O segundo exibirá o conteúdo desse <em>archive</em>. O terceiro irá extrair todo o seu conteúdo dentro do diretório /tmp, ou seja, recriará aquela mesma subárvore como uma subárvore do diretório /tmp. </em></a></p>
<hr /><a name="disq"> </a></p>
<h2><em><a name="disq"> Intercambiando Disquetes com o <strong>MS-DOS</strong> </a></em></h2>
<p><em><a name="disq">Via de regra as plataformas Unix-like oferecem ferramentas para lidar com disquetes &#8220;formatados&#8221; no <strong>MS-DOS</strong> (ou, mais precisamente, disquetes que usam <strong>FAT</strong>). Um <em>set</em> de ferramentas bastante popular é o <strong>mtools</strong>, que oferece clones das ferramentas do <strong>MS-DOS</strong>. Exemplos de uso: </a></em></p>
<pre><em><a name="disq">$ <strong>mformat</strong> a:
$ <strong>mcopy</strong> a:relat.txt .
$ <strong>mdir</strong> a:
</a></em></pre>
<p><em><a name="disq">Versões recentes dessas ferramentas lidam também com o <strong>VFAT</strong> do <strong>Windows 95</strong>, que permite nomes de arquivos &#8220;longos&#8221;. </a></em></p>
<p><em><a name="disq"> O intercâmbio de arquivos texto entre <strong>Unix</strong> e <strong>MS-DOS</strong> deve ser feito com cuidado. Por herança das antigas impressoras, o <em>fim-de-linha</em> no <strong>MS_DOS</strong> é codificado através de dois caracteres (<strong>CR</strong> e <strong>LF</strong>), enquanto no <strong>Unix</strong> há apenas um (o <strong>LF</strong>), além do que o final do arquivo é sinalizado no <strong>MS-DOS</strong> por um <strong>CTRL-Z</strong>. O <strong>mcopy</strong> possui a opção <strong>-t</strong> para realizar essas conversões quando copia de ou para disquetes. </a></em></p>
<hr /><em><a name="kernel"> </a></em></p>
<h2><em><a name="kernel">O Kernel</a></em></h2>
<p><em><a name="kernel">O <strong>Kernel</strong> do Unix (e de virtualmente qualquer outro sistema operacional) possui um papel de que convém ter noções, a fim de se poder compreender melhor o funcionamento do sistema, realizar diagnósticos e procedimentos administrativos como adição de componentes de hardware. Algum conhecimento do papel do kernel é importante também para se ter uma noção mais clara do uso de arquivos especiais e do diretório <strong>/proc</strong>. </a></em></p>
<p><em><a name="kernel">O Kernel ordinariamente reside no filesystem como um outro arquivo qualquer. No Linux, ele é em geral o arquivo <strong>/vmlinuz</strong> ou <strong>/boot/vmlinuz</strong>, ou ainda <strong>/boot/vmlinuz-2.0.36</strong>. Ele é um programa, ainda que um pouco diferente dos programas de aplicação como o       <strong>/bin/ls</strong>. O kernel é carregado e posto em execução no boot da máquina, e a sua execução somente se encerra com o <strong>shutdown</strong>. </a></em></p>
<p><em><a name="kernel">De forma simplificada, o seu papel é num primeiro momento reconhecer o hardware e inicializar os respectivos drivers. Em seguida ele entra num estado administrativo onde funciona como intermediário entre as aplicações e o hardware. Por exemplo, quando uma aplicação necessita alocar mais memória, ela solicita isso ao kernel. É o kernel que distribui o tempo de CPU aos vários processos ativos. É ele que habitualmente realiza a entrada e saída de dados nas diferentes portas de comunicação. </a></em></p>
<p><em><a name="kernel">É por isso que a adição de hardware novo a uma máquina pode requerer a substituição ou ao menos a reconfiguração do kernel. Os kernels mais recentes do Linux oferecem vários mecanismos de configuração que os tornam sobremaneira flexíveis, a ponto de ser rara a necessidade de substituição do kernel. Os dois mecanismos fundamentais de se configurar a operação do kernel são a passagem de parâmetros no momento do boot (realizada pelo LILO) e a carga de módulos, feita manualmente ou por mecanismos automáticos como o <strong>kerneld</strong>. </a></em></p>
<p><em><a name="kernel">O diálogo entre as aplicações e o kernel realiza-se fundamentalmente através dos <em>system calls</em>, que são serviços que o kernel oferece, como por exemplo <strong>read(2)</strong>. Os <em>device special files</em> são maneiras de se referir ao kernel os dispositivos físicos ou lógicos com que se pretende operar, por exemplo a primeira porta serial ou a segunda unidade de fita, ou o disco principal do sistema. Neles, o importante não é o nome, mas sim os números de dispositivo, ou mais precisamente o major e o minor device numbers. Device special files são criados através do comando <strong>mknod</strong>, ou através de interfaces mais amigáveis, como o comando <strong>MAKEDEV</strong>. </a></em></p>
<p><em><a name="kernel">Os sistemas Unix-like mais recentes oferecem um outro mecanismo de comunicação com o kernel, que é o filesystem <strong>/proc</strong>. As entradas desse filesystem são pseudo-arquivos cujo conteúdo reflete o estado atual de inúmeras estruturas de dados internas do kernel. Assim, um programa de aplicação passa a poder comunicar-se com o kernel através dos mecanismos ordinários de leitura e escrita de arquivos. </a></em></p>
<p><em><a name="kernel">Em muitos casos a comunicação entre as aplicações e o kernel é intermediada por bibliotecas, principalmente a <strong>libc</strong>. Elas oferecem serviços de mais alto nível que os system calls do kernel, tornando mais simples o trabalho de programação. </a><a name="pipe"> </a></em></p>
<h2><em><a name="pipe"> Redirecionamento da Entrada e da Saída; Pipes </a></em></h2>
<p><em><a name="pipe"> Processos num sistema <strong>Unix</strong> habitualmente possuem três dispositivos de I/O &#8220;padrões&#8221;, a &#8220;saída padrão&#8221;, a &#8220;entrada padrão&#8221; e a &#8220;saída de erros&#8221;. O <strong>Unix</strong> permite que esses dispositivos (e outros) sejam definidos no momento da execução, podendo escolher o console, um &#8220;pipe&#8221;, a impressora, um circuito virtual de rede conectando duas máquinas, uma linha física serial ou outras coisas. </a></em></p>
<p><em><a name="pipe"> Usuários de <strong>MS-DOS</strong> talvez já tenham feito coisas como </a></em></p>
<pre><em><a name="pipe"><strong>C&gt;</strong> DIR &gt;PRN:</a></em></pre>
<p><em><a name="pipe"> para imprimir a saída de um comando. Essa sintaxe foi herdada do <strong>Unix</strong> daí a semelhança: </a></em></p>
<pre><em><a name="pipe"><strong>$ ls -l &gt;</strong>/dev/lp1</a></em></pre>
<p><em><a name="pipe"> Naturalmente tanto no <strong>MS-DOS</strong> quanto no <strong>Unix</strong> existem formas mais apropriadas para se imprimir algo, mas no momento esse exemplo convém. Shells do estilo &#8220;Bourne&#8221; (<strong>sh</strong>, <strong>ksh</strong>, <strong>bash</strong>) permitem redirecionamento da saída de erros através da seguinte sintaxe: </a></em></p>
<pre><em><a name="pipe"><strong>$ rm /bin/ls 2&gt;</strong>/tmp/error</a></em></pre>
<p><em><a name="pipe">O &#8220;<strong>2</strong>&#8221; deve-se a que, internamente, a saída de erros corresponde ao <em>descritor 2</em> (o <strong>0</strong> é a entrada padrão e o <strong>1</strong> é a saída padrão). </a></em></p>
<p><em><a name="pipe">A entrada pode ser redirecionada de forma semelhante: </a></em></p>
<pre><em><a name="pipe"><strong>$ wc &lt;</strong>/tmp/error </a></em></pre>
<p><em><a name="pipe">Os shells <strong>Unix</strong> oferecem um recurso para a ligação da saída padrão de um processo com a entrada padrão de outro, chamado <em>pipe</em>: </a></em></p>
<pre><em><a name="pipe"><strong>$</strong> ls<strong>|</strong>wc</a></em></pre>
<p><em><a name="pipe"> No exemplo a saída do ls está sendo usada como entrada do wc. Note que o shell dispara os dois processos ao mesmo tempo. Se o primeiro estiver produzindo saída numa taxa superior à que o segundo lê, o sistema operacional paralizará o primeiro sempre que o buffer que armazena o tráfego estiver cheio. Isso significa, por exemplo, que um pipe pode ser usado mesmo quando o volume total da saída do primeiro processo é extraordinariamente grande, por exemplo quando se tenta localizar informações de arquivos deletados através de um dump de todos os setores do disco. </a></em></p>
<p><em><a name="pipe"> </a></em></p>
<hr /><em><a name="comms"> </a></em></p>
<h2><em><a name="comms">Comunicação Serial e Paralela </a></em></h2>
<p><em><a name="comms">O <strong>Unix</strong> apresenta as portas de comunicação seriais e paralelas na forma de <em>arquivos especiais. Já vimos um exemplo do seu uso no ítem <em>Redirecionamento da Entrada e da Saída</em>, em que fizemos a impressão da saída de um comando. </em></a></em></p>
<p><em><a name="comms"><em> Na comunicação entre dois computadores, utiliza-se freqüentemente portas seriais, e às vezes também as paralelas. Em muitos casos, quando a distância entre os dois é grande, haverá uso de modems, e eventualmente também de uma linha telefônica. Através de três exemplos práticos pode-se ter um bom panorama do uso de comunicação serial no <strong>Unix</strong>. Como os procedimentos variam um pouco dependendo das plataformas em uso, só é possível indicá-los de forma genérica: </em></a></em></p>
<p><em><a name="comms"><em><strong>a) Adição de um terminal</strong> </em></a></em></p>
<ol>
<li><em><a name="comms"><em> Conectar a serial do terminal com a da máquina <strong>Unix</strong>. </em></a></em></li>
<li><em><a name="comms"><em> Disparar no <strong>Unix</strong> a variante do <strong>getty</strong> disponível. </em></a></em></li>
<li><em><a name="comms"><em> Logar no terminal. </em></a></em></li>
<li><em><a name="comms"><em>Transferir arquivos se o terminal oferecer esse recurso. </em></a></em></li>
</ol>
<p><em><a name="comms"><em><strong>b) Conexão a um sistema remoto</strong> </em></a></em></p>
<ol>
<li><em><a name="comms"><em> Disparar algum emulador de terminal disponível. </em></a></em></li>
<li><em><a name="comms"><em>Selecionar a serial em que o modem está conectado. </em></a></em></li>
<li><em><a name="comms"><em>Configurar o modo de operação da serial (velocidade, bits). </em></a></em></li>
<li><em><a name="comms"><em>Configurar o modem através de comandos <strong>AT</strong>, se necessário. </em></a></em></li>
<li><em><a name="comms"><em> Instruir o modem para discar, com <strong>ATD</strong> </em></a></em></li>
<li><em><a name="comms"><em> Aguardar a negociação. </em></a></em></li>
<li><em><a name="comms"><em> Logar. </em></a></em></li>
</ol>
<p><em><a name="comms"><em><strong>c) Estabelecimento de um <em>link ppp</em></strong> </em></a></em></p>
<ol>
<li><em><a name="comms"><em> Executar a conexão ao sistema remoto como indicada acima. </em></a></em></li>
<li><em><a name="comms"><em> Iniciar o ppp no sistema remoto. </em></a></em></li>
<li><em><a name="comms"><em> Disparar o pppd localmente. </em></a></em></li>
</ol>
<p><em><a name="comms"><em> Em <strong>PCs</strong>, os conectores externos das portas seriais são conectores <strong>DB-9</strong> ou <strong>DB-25</strong> macho, e os das paralelas são <strong>DB-25</strong> fêmea. </em></a></em></p>
<hr /><em><a name="tcpcf"> </a></em></p>
<h2><em><em><a name="tcpcf">Configuração do TCP/IP </a></em></em></h2>
<p><em><em><a name="tcpcf"> Numa rede TCP/IP, a cada máquina está associado um <em>número IP</em>, que é um inteiro de 32 bits, normalmente escrito na forma de <em>octetos</em>, como <strong>192.168.0.5</strong>. A cada máquina está associado um <em>nome</em>, como por exemplo <strong>marte</strong> ou <strong>pimenta</strong>. </a></em></em></p>
<p><em><em><a name="tcpcf"> A <em>atribuição</em> tanto do número quanto do nome é feita durante o processo de boot, a partir da <em>especificação</em> deles feita através da edição manual de arquivos de configuração e/ou do uso de aplicativos de gerenciamento do sistema específicos de cada plataforma. </a></em></em></p>
<p><em><em><a name="tcpcf"> Na verdade, o número IP não está associado à <em>máquina</em>, mas a uma determinada <em>interface</em> dela. Via de regra, a interface envolvida é a <em>ethernet</em>. Tanto para exibir quanto para setar manualmente o número IP de uma interface usa-se o comando <strong>ifconfig</strong>. Por exemplo, o comando: </a></em></em></p>
<pre><em><em><a name="tcpcf"><strong>$</strong> <strong>ifconfig -a</strong></a></em></em></pre>
<p><em><em><a name="tcpcf">irá listar todas as interfaces com informações de cada uma. A interface ethernet costuma chamar-se <strong>le0</strong> (Solaris) ou <strong>eth0</strong> (Linux). Além do ethernet, é comum usar-se portas seriais para criar interfaces <strong>TCP/IP</strong>, principalmente para criar links com linhas telefônicas. As placas ethernet costuma oferecer dois ou mais tipos de conectores. Ela pode ou não descobrir automaticamente qual está em uso. Em caso negativo, você deverá informá-la, o que habitualmente é feito através de um software de configuração que acompanha a placa. </a></em></em></p>
<p><em><em><a name="tcpcf"> O passo seguinte é a configuração das <em>rotas</em>. Através delas a máquina sabe por onde enviar datagramas a fim de que eles cheguem em seus destinos. Equivale de certa forma à sinalização do tráfego urbano, com placas indicativas da direção a tomar para atingir cada destino (<em>Ponte do Limão à esquerda</em>, ou <em>Avenida Bandeirantes em frente</em>, etc). </a></em></em></p>
<p><em><em><a name="tcpcf"> Cada rota envolve um <em>destino</em>, uma <em>máscara</em>, um <em>gateway</em> e uma <em>interface</em>. Pode-se exibir todas elas através do comando <strong>netstat</strong>: </a></em></em></p>
<pre><em><em><a name="tcpcf"><strong>$ netstat -r</strong>
Destination Gateway Genmask Iface
192.168.1.0 * 255.255.255.0 eth0
127.0.0.0 * 255.0.0.0 lo
default 192.168.1.1 0.0.0.0 eth0
</a></em></em></pre>
<p><em><em><a name="tcpcf"> Suponha que você deseja atingir a máquina <strong>192.168.1.7</strong>. A aplicação da tabela de rotas indica, através de uma operação <strong>e</strong> bit-a-bit entre <strong>192.168.1.7</strong> e a máscara <strong>255.255.255.0</strong>, que deve ser usada a primeira rota. Como não há gateway, a comunicação será feita diretamente através do ethernet. </a></em></em></p>
<p><em><em><a name="tcpcf"> Se o destino agora for <strong>200.136.35.65</strong>, as duas primeiras rotas não nos servirão (experimente aplicar o <strong>e</strong> como no caso anterior). Portanto será usada a rota default, e como ela especifica um gateway, a comunicação terá que ser feita <em>através</em> dele. Assim, toda vez que se pretender enviar alguma informação para o <strong>200.136.35.65</strong>, esta será enviada antes para o gateway <strong>192.168.1.1</strong>, <em>na esperança</em> de que este consiga roteá-la para o seu destino. </a></em></em></p>
<hr /><em><em><a name="tcps"> </a></em></em></p>
<h2><em><em><a name="tcps">Serviços TCP/IP </a></em></em></h2>
<p><em><em><a name="tcps"> Atualmente é comum as pessoas confundirem Internet com a teia mundial <strong>WWW</strong>, entretanto muito antes de surgir a teia, a Internet já usava um sem-número de serviços construídos a partir dos protocolos de transporte <strong>TCP</strong> e <strong>UDP</strong>. </a></em></em></p>
<p><em><em><a name="tcps"> Um <em>circuito TCP</em> entre duas máquinas equivale a um <em>pipe</em> duplo entre dois processos, cada um rodando em uma das máquinas. O <em>telnet</em> é um típico serviço que se utiliza desse recurso, a fim de criar sessões remotas. Pode-se exibir todas os circuitos <strong>TCP</strong> ativos através do comando <strong>netstat</strong>: </a></em></em></p>
<pre><em><em><a name="tcps"><strong>$</strong> <strong>netstat -t</strong></a></em></em></pre>
<p><em><em><a name="tcps"> O <em>FTP</em>, por sua vez, cria <em>dois</em> circuitos, utilizando um para envio de comandos e outro de dados. Através do uso de alguns comandos simples, permite transferir arquivos de ou para uma máquina remota. Os principais comandos do <strong>FTP</strong> são: </a></em></em></p>
<table width="100%">
<tbody>
<tr>
<td width="10%"><strong>asc,bin</strong><br />
<strong>hash</strong><br />
<strong>get,put</strong><br />
<strong>mget,mput</strong><br />
<strong>prompt</strong></td>
<td width="90%">modo de transferência texto/binário<br />
faz o display de um &#8220;#&#8221;a cada 1kb transferido<br />
transfere de/para a máquina remota o arquivo especificado<br />
idem, múltiplos arquivos<br />
liga/desliga o modo interativo</td>
</tr>
</tbody>
</table>
<hr /><em><em><a name="X"> </a></em></em></p>
<h2><em><em><a name="X"> Disparo do Xwindows e das suas aplicações </a></em></em></h2>
<p><em><em><a name="X"> O disparo do       <strong>X</strong> é desnecessário quando o sistema opera num <em>runmode</em> em que o <strong>X</strong> está permanentemente ativo. Nesse caso, o próprio login é feito numa janela, ao invés de no console no modo texto. </a></em></em></p>
<p><em><em><a name="X"> Quando for necessário disparar o <strong>X</strong> manualmente, via de regra haverá dois ou três scripts já preparados para isso, como o <strong>startx</strong> ou o <strong>openwin</strong>. O que eles fazem basicamente é definir uma série de parâmetros e executar o <strong>xinit</strong>, que por sua vez dispara o <em>Xserver</em> e o <em>Window Manager</em>. </a></em></em></p>
<p><em><em><a name="X">Convém não perder de vista que o <strong>Xwindows</strong> é um sistema cliente-servidor. O <em>Xserver</em> é o programa que conhece o hardware gráfico, é capaz de colocar o display no modo desejado, e desenhar nele. As aplicações <em>conectam</em> o Xserver através de um circuito <strong>TCP</strong> (por exemplo) e enviam a ele comandos através dos quais desenham as suas janelas e o conteúdo delas. O <em>Window Manager</em> é responsável por desenhar as molduras das janelas, criar menus de aplicações, e controlar o foco. </a></em></em></p>
<p><em><em><a name="X"> Assim, é natural que no disparo de cada aplicação seja necessário especificar qual é o server a ser utilizado. Isso normalmente se faz através da opção de linha de comando <strong>-display</strong>, ou através da variável de environment <strong>DISPLAY</strong>. </a></em></em></p>
<pre><em><em><a name="X"><strong>$</strong> xterm <strong>-display</strong> 192.168.0.1:0.0
<strong>$ DISPLAY=</strong>192.168.0.1:0.0; export <strong>DISPLAY</strong>; xterm
</a></em></em></pre>
<p><em><em><a name="X"> Quando o Xserver está rodando numa máquina <strong>Unix</strong>, a permissão para um cliente usá-lo é dada através do comando <strong>xhost</strong>: </a></em></em></p>
<pre><em><em><a name="X"><strong>$ xhost</strong> +192.168.1.5 (autoriza o cliente 192.168.1.5)
<strong>$ xhost</strong> -192.168.1.5 (desautoriza o cliente 192.168.1.5)
<strong>$ xhost</strong> (lista os clientes autorizados)
</a></em></em></pre>
<p><em><em><a name="X"> Pode-se autorizar permanentemente um cliente a usar um determinado Xserver adicionando-o ao arquivo <strong>/etc/X0.hosts</strong> (um cliente por linha). </a></em></em></p>
<p><em><em><a name="X">Ao longo dos anos foram sendo criados inúmeros Window Managers diferentes para o Xwindows. Algumas vezes além do window manager foram criadas também complexas bibliotecas oferecendo serviços de alto nível que além de simplificar o trabalho de programação tamém permitem estandardizar o aspecto visual e os recursos das janelas das aplicações. Um dos produtos mais conhecidos dessa linha é o Motif. O advento do Free Software criou outras opções, sendo as mais em voga atualmente o <strong>GTK</strong> e o <strong>QT</strong>, que são utilizados respectivamente pelo <strong>GNOME</strong> e pelo <strong>KDE</strong>. </a></em></em></p>
<hr /><em><em><a name="init"> </a></em></em></p>
<h2><em><em><a name="init">Procedimentos de boot e o init </a></em></em></h2>
<p><em><em><a name="init"> O boot do       <strong>Unix</strong> consiste inicialmente na carga e execução do <em>kernel</em>. Em seguida, é disparado o processo <strong>init</strong>, que segue as instruções do arquivo <strong>/etc/inittab</strong>, que portanto é o ponto de partida para tudo o que se pretenda configurar a nível de disparo de processos ao longo do boot. </a></em></em></p>
<p><em><em><a name="init"> O <strong>inittab</strong> não é um script como o <strong>AUTOEXEC.BAT</strong>, mas uma lista de ações, algumas delas de valor permanente para todo o curso da operação do sistema. Cada linha válida representa um processo que o <strong>init</strong> deve disparar. O termo <strong>respawn</strong> significa que, além de disparar, o <strong>init</strong> deverá monitorar o processo e, se porventura ao longo da operação do sistema ele for encerrado, o <strong>init</strong> deverá redispará-lo. </a></em></em></p>
<p><em><em><a name="init"> Via de regra as linhas do <strong>inittab</strong> referem-se ou à chamada de scripts de configuração inicial do sistema, que são executados apenas uma vez, ou aos processos de controle de login no sistema, que são redisparados sempre que ocorre um logout. O <strong>inittab</strong> inclui ainda o conceito de <em>runlevel</em>, o que cria a flexibilidade de se poder inicializar a máquina em um de vários possíveis modos de operação. Na prática, costuma haver três modos principais, o <em>single-user</em>, utilizado para manutenção, um <em>gráfico</em> e um <em>não gráfico</em>. </a></em></em></p>
<p><em><em><a name="init">Quanto aos scripts de configuração (normalmente são os arquivos e/ou diretórios <strong>/etc/rc.*</strong>, dependendo da plataforma a mecânica de disparo deles pode ser bastante complexa. Note que cada runlevel pode disparar ou deixar de disparar alguns scripts, a fim de estabelecer o modo de operação desejado. Em quase todas as versões mais recentes do Linux essa mecânica segue o padrão dos diretórios <strong>/etc/rc.d/rcN.d</strong>, onde <strong>N</strong> é cada um dos runlevels. O conteúdo desses diretórios são links para cada um dos scripts de ativação ou desativação de serviços básicos (interfaces de rede, servidor de email, etc), com números embutidos nos nomes dos links, a fim de definir a ordem em que devem ser processados. </a></em></em></p>
<hr /><em><em><a name="refs"> </a></em></em></p>
<h2><em><em><a name="refs">Referências </a></em></em></h2>
<p><em><em><a name="refs">Virtualmente qualquer informação técnica sobre sistemas Unix-like pode ser obtida na Teia Mundial. Estou colocando aqui apenas um referência clássica (o Livro do Bach), e um link para uma lista de pontos de entrada de documentação sobre Linux. </a></em></em></p>
<p><em><em><a name="refs">[1] Bach, M. J. The Design of the Unix Operating System, Prentice-Hall, 1986. </a></em></em></p>
<p><em><em><a name="refs">[2] Alguns links de Linux, inclusive para materiais em português, estão disponíveis em </a><a href="http://www.ime.usp.br/%7Eueda/ldoc/links.html"> http://www.ime.usp.br/~ueda/ldoc/links.html </a>. </em></em></p>
<p style="text-align: right;"><em><em>Fonte: </em></em>http://www.ufrgs.br</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2009/12/20/estilizando-o-prompt-da-console-com-uso-de-cores/' rel='bookmark' title='Permanent Link: Estilizando o PROMPT da console (com uso de cores)'>Estilizando o PROMPT da console (com uso de cores)</a> <small>Para quem gosta de trabalhar com a console (modo texto)...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/16/comandos-console/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso de Perl – Como programar em Perl parte II</title>
		<link>http://blog.deserv.info/2010/05/05/curso-de-perl-%e2%80%93-como-programar-em-perl-parte-ii/</link>
		<comments>http://blog.deserv.info/2010/05/05/curso-de-perl-%e2%80%93-como-programar-em-perl-parte-ii/#comments</comments>
		<pubDate>Thu, 06 May 2010 01:30:29 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PERL]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Como programar em Perl]]></category>
		<category><![CDATA[Curso]]></category>
		<category><![CDATA[Curso de Perl]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=365</guid>
		<description><![CDATA[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 Intro, também disponibilizado no LinuxChix.org.br. Esta aula de forma alguma cobre todas as informações disponíveis sobre Perl best practices ou Perl modules. *** Transformando um código mal [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/04/curso-de-perl-%e2%80%93-como-programar-em-perl/' rel='bookmark' title='Permanent Link: Curso de Perl – Como programar em Perl'>Curso de Perl – Como programar em Perl</a> <small>Nota, se você não tem acesso a um UNIX para...</small></li>
<li><a href='http://blog.deserv.info/2010/01/31/scripts-de-conexao-ao-mysql-%e2%80%93-perl/' rel='bookmark' title='Permanent Link: Scripts de conexão ao MySQL – Perl'>Scripts de conexão ao MySQL – Perl</a> <small>Segue abaixo um exemplo simples para testar a conexão do...</small></li>
<li><a href='http://blog.deserv.info/2010/01/05/tutorial-perl/' rel='bookmark' title='Permanent Link: Tutorial PERL'>Tutorial PERL</a> <small>A linguagem Perl (Practical Extraction and Report Language) - inicialmente...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<p>Perl best practices: escrevendo códigos legíveis; Perl modules:  instalação,</p>
<p>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><span id="more-365"></span></p>
<p>Formatar o código de maneira legível é parte das “boas praticas”<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>
<blockquote><p># FORMATACAO 1:</p>
<p>my $código= “XYZ456475″;<br />
my $data = “2006/04/23″ ;</p>
<p>my $resposta_do_teste =testar_formato_dos_dados ($código,$data );</p>
<p>print “$resposta_do_teste\n” ;</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 “qualquer texto \n”;<br />
return “Os dados estao no formato correto”;<br />
}<br />
else{        return “Os dados não estao no formato correto” ;<br />
}<br />
}</p></blockquote>
<blockquote><p># FORMATACAO 2:</p>
<p>my $código = “XYZ456475″;<br />
my $data = “2006/04/23″;<br />
my $resposta_do_teste = testar_formato_dos_dados($código, $data);<br />
print “$resposta_do_teste\n”;</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 “qualquer texto \n”;<br />
return “Os dados estao no formato correto”;<br />
} else {<br />
return “Os dados não estao no formato correto”;<br />
}<br />
}</p></blockquote>
<blockquote><p># FORMATACAO 3:</p>
<p>my $código = “XYZ456475″;<br />
my $data   = “2006/04/23″;</p>
<p>my $resposta_do_teste = testar_formato_dos_dados($código, $data);</p>
<p>print “$resposta_do_teste\n”;</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 “qualquer texto \n”;<br />
return “Os dados estao no formato correto”;<br />
} else {<br />
return “Os dados não estao no formato correto”;<br />
}<br />
}</p></blockquote>
<p>— 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 – onde a<br />
teoria é por muitas vezes diferente da prática – 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>— 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 – 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 “criando módulos em Perl” 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 “avisar” 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 “use”.</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… 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 += ‘t’;<br />
print $numero . “\n”;</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 ” t  +<br />
10 ” 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 – Perl Intro – 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 />
————– Próxima Parte ———-<br />
Um anexo em HTML foi limpo…<br />
URL:  http://listas.linuxchix.org.br/pipermail/cursos/attachments/20070205/bb6576b8/attachment.html</p>
<p>## Perl Tutorial – 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 “boas praticas”<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>
<blockquote><p># FORMATACAO 1:</p>
<p>my $codigo= “XYZ456475″;<br />
my $data = “2006/04/23″ ;</p>
<p>my $resposta_do_teste =testar_formato_dos_dados ($codigo,$data );</p>
<p>print “$resposta_do_teste\n” ;</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 “qualquer texto \n”;<br />
return “Os dados estao no formato correto”;<br />
}<br />
else{        return “Os dados NAO estao no formato correto” ;<br />
}<br />
}</p></blockquote>
<blockquote><p># FORMATACAO 2:</p>
<p>my $codigo = “XYZ456475″;<br />
my $data = “2006/04/23″;<br />
my $resposta_do_teste = testar_formato_dos_dados($codigo, $data);<br />
print “$resposta_do_teste\n”;</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 “qualquer texto \n”;<br />
return “Os dados estao no formato correto”;<br />
} else {<br />
return “Os dados NAO estao no formato correto”;<br />
}<br />
}</p></blockquote>
<blockquote><p># FORMATACAO 3:</p>
<p>my $codigo = “XYZ456475″;<br />
my $data   = “2006/04/23″;</p>
<p>my $resposta_do_teste = testar_formato_dos_dados($codigo, $data);</p>
<p>print “$resposta_do_teste\n”;</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 “qualquer texto \n”;<br />
return “Os dados estao no formato correto”;<br />
} else {<br />
return “Os dados NAO estao no formato correto”;<br />
}<br />
}</p></blockquote>
<p>— 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 – onde a<br />
teoria eh por muitas vezes diferente da pratica – 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>— 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 – 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 “criando modulos em Perl” 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 “avisar” 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 “use”.</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… 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 += ‘t’;<br />
print $numero . “\n”;</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 ” t  +<br />
10 ” 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 />
————– next part ————–<br />
An HTML attachment was scrubbed…<br />
URL:  http://listas.linuxchix.org.br/pipermail/cursos/attachments/20070205/49e7b8d0/attachment.html<br />
## Perl Tutorial – 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>— 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>— 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>— 3. Tirando duvidas</p>
<p>- consulte as aulas anteriores<br />
- envie email para a lista</p>
<p>*** Funcoes para tratamento de strings</p>
<p>— Funcoes: uc, lc, lcfirst e ucfirst</p>
<p>- Exemplo de uso:</p>
<p>my $string = ‘TeM GeNtE QuE EsCrEvE AsSiM.’;<br />
print uc $string .”\n”;<br />
print lc $string .”\n”;</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 – retorna a versao em letras maiusculas (uppercase) de uma string<br />
lc – 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>— Funcao: length</p>
<p>- Exemplo de uso:</p>
<p>my $string = ‘inconstitucionalissimamente’;<br />
print length($string) . “\n”;</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>— Funcao: shift</p>
<p>- Exemplo de uso:</p>
<p>my @os = (“Fedora”, “CentOS”, “Windows”, “HP-UX”, “AIX”, “Solaris”);<br />
print “@os\n”;<br />
shift @os;<br />
print “@os\n\n”;</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 – 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>— Funcao: push</p>
<p>- Exemplo de uso:</p>
<p>my @os = (“Fedora”, “CentOS”, “Windows”, “HP-UX”, “AIX”, “Solaris”);<br />
print “@os\n”;<br />
push (@os, “Ubuntu”);<br />
print “@os\n”;</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 – usado para acrescentar um ou mais elementos ao final de um  array</p>
<p>— Funcao: qw</p>
<p>- Exemplo de uso:</p>
<p>my @os = qw(Fedora CentOS Windows HP-UX AIX Solaris);<br />
print “@os\n”;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>Fedora CentOS Windows HP-UX AIX Solaris</p>
<p>- Notas:</p>
<p>o qw() – faz com que cada elemento dentro do “()” 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 = (“Fedora”, “CentOS”, “Windows”, “HP-UX”, “AIX”, “Solaris”);</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 = (“Fedora Core”, “Sun Solaris”); # indica um array de 2  elementos.</p>
<p>my @os = qw/Fedora Core Sun Solaris/; # indica um array de 4  elementos.</p>
<p>— Funcao: reverse</p>
<p>- Exemplo de uso:</p>
<p>my @os = qw/Fedora CentOS Windows HP-UX AIX Solaris/;<br />
print “@os\n”;<br />
my @os_invertido = reverse @os;<br />
print “Array invertido: @os_invertido\n”;</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 – 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>— Funcao: join</p>
<p>- Exemplo de uso:</p>
<p>my @os_array = qw/usuario senha email homepage/;<br />
my $os_string = join(‘:’, @os_array);<br />
print “$os_string\n\n”;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>usuario:senha:email:homepage</p>
<p>— Funcao: split</p>
<p>- Exemplo de uso:</p>
<p>my $string = ‘usuario:::senha:::email:::homepage’;<br />
my ($usuario, $senha, $email, $homepage) = split(/:::/, $string);</p>
<p>print “User: $usuario\n”;<br />
print “Passwd: $senha\n”;<br />
print “E-mail: $email\n”;<br />
print “Home Page: $homepage\n\n”;</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 – agrupa os elementos de uma lista em uma string, separados pelo<br />
pattern passado como parametro.<br />
split – 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 “:” (dois pontos). Uma serie de outros<br />
delimitadores podem ser usados tambem.</p>
<p>*** Funcoes para tratamento de diretorios:</p>
<p>— Funcoes: opendir, closedir, readdir</p>
<p>- Exemplo de uso</p>
<p>my $dir = ‘/etc’;<br />
my $dir_handle;</p>
<p>opendir ($dir_handle, “&lt;”, $dir) || die “Erro ao abrir diretorio  $dir: $!”;</p>
<p>foreach my $file ( readdir($dir_handle) ) {<br />
print “$file \n\n”;<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 – abre um diretorio para processamento<br />
closedir – fecha um diretorio<br />
readdir – retorna o conteudo do diretorio</p>
<p>*** Funcoes para controle de loops</p>
<p>— Funcoes: next, last</p>
<p>- Exemplo de uso</p>
<p>my $dir = ‘/etc’;<br />
my $dir_handle;</p>
<p>opendir ($dir_handle, $dir) || die “Erro ao abrir diretorio $dir:  $!”;</p>
<p>foreach my $file ( readdir($dir_handle) ) {<br />
next if ($file =~ /^\./);<br />
print “$file \n\n”;<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 ‘.’) 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 “.”, 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>— 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 = ‘/etc/passwd’;<br />
my $fh;<br />
my @users;</p>
<p># abre arquivo /etc/passwd<br />
open( $fh, “&lt;”, $file ) || die “Erro ao abrir arquivo $file: $!”;</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(“\n”, 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 “:”.</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 “:”.</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 – 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>— 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>— 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 />
“Brasil” =&gt; “Sao Paulo”, “Rio de Janeiro”,<br />
“Canada” =&gt; “Toronto”, “Ottawa”, “Montreal”, “Windsor”,<br />
# etc<br />
);</p>
<p>Think again! <img src="http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_smile.gif" alt=":)" /></p>
<p>O trecho de codigo acima nao e’ valido, pois ele esta “armazenando”  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 />
“Brasil” =&gt; [ "Sao Paulo", "Rio de Janeiro", ],<br />
“Canada” =&gt; [ "Toronto", "Ottawa", "Montreal", "Windsor", ],<br />
# etc<br />
);</p>
<p>### Observe que a sintaxe mudou de um codigo para o outro.<br />
### Observe os “[]”</p>
<p>O simbolo “[]” 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>— 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; “Brasilia”,<br />
Canada =&gt; “Ottawa”,<br />
Alemanha =&gt; “Berlin”,<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; “Brasilia”,<br />
Canada =&gt; “Ottawa”,<br />
Alemanha =&gt; “Berlin”,<br />
);<br />
my $capitas_ref = \%capitais;</p>
<p>- Para acessar os valores dentro de uma referencia</p>
<p>Ex. de leitura:</p>
<p>print “O elemento 2 do array idades eh $idades_ref-&gt;[2]\n”;<br />
print “A capital da Alemanha eh $capitais_ref-&gt;{Alemanha}\n”;</p>
<p>Ex. de gravacao:</p>
<p>$idades_ref-&gt;[1] = 54;<br />
$idades_ref-&gt;[5] = 30;<br />
$capitais_ref-&gt;{Dinamarca} = “Copenhagen”;             # criando uma  nova<br />
key no hash<br />
$capitais_ref-&gt;{Brasil} = “Brasilia, DF”;             # alterando uma  key<br />
existente</p>
<p>— 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 “Pais: $pais\n”;<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 “Pais: $pais\n”;<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>— 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 />
‘login’ =&gt; ‘root’<br />
‘passwd’ =&gt; ‘x’,<br />
‘uid’ =&gt; ‘0′,<br />
’shell’ =&gt; ‘/bin/bash’,<br />
‘home’ =&gt; ‘/root’,<br />
‘gcos’ =&gt; ‘root’,<br />
‘gid’ =&gt; ‘0′,<br />
},<br />
{<br />
‘login’ =&gt; ‘bin’<br />
‘passwd’ =&gt; ‘x’,<br />
‘uid’ =&gt; ‘1′,<br />
’shell’ =&gt; ‘/sbin/nologin’,<br />
‘home’ =&gt; ‘/bin’,<br />
‘gcos’ =&gt; ‘bin’,<br />
‘gid’ =&gt; ‘1′,<br />
},<br />
{<br />
‘login’ =&gt; ‘daemon’<br />
‘passwd’ =&gt; ‘x’,<br />
‘uid’ =&gt; ‘2′,<br />
’shell’ =&gt; ‘/sbin/nologin’,<br />
‘home’ =&gt; ‘/sbin’,<br />
‘gcos’ =&gt; ‘daemon’,<br />
‘gid’ =&gt; ‘2′,<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 = ‘/etc/passwd’;<br />
my $fh;<br />
my @users;</p>
<p># abre arquivo /etc/passwd<br />
open( $fh, “&lt;”, $file ) || die “Erro ao abrir arquivo $file: $!”;</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 “O usuario de ID $user-&gt;{uid} e’ o $user-&gt;{login} e tem home<br />
em $user-&gt;{home}\n”;<br />
}<br />
}</p>
<p>###</p>
<p>— 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; “Beltrano de Tal”,<br />
endereco  =&gt; “Avenida Rua Bairro, 87654″,<br />
cidade    =&gt; “Guarulhos”,<br />
idade     =&gt; 24,<br />
telefones =&gt; {<br />
trabalho =&gt; “416-888-3245″,<br />
casa     =&gt; “416-567-6767″,<br />
},<br />
filhos =&gt; [<br />
{<br />
nome  =&gt; "Beltraninha Baby",<br />
idade =&gt; 2,<br />
},<br />
],<br />
},<br />
{<br />
nome      =&gt; “Ciclano”,<br />
endereco  =&gt; “Avenida Rua Bairro, 78678″,<br />
cidade    =&gt; “Sao Paulo”,<br />
idade     =&gt; 27,<br />
telefones =&gt; { celular =&gt; “907-787-9595″, },<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>— 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( “Pessoas com mais de $idade anos”, \@pessoas_encontradas<br />
);<br />
# nao se preocupe com esta funcao ainda, apenas entenda que ela vai<br />
exibir pessoas<br />
}</p>
<p>###</p>
<p>— 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( “Pessoas com filhos com menos de $idade anos”,<br />
\@pessoas_encontradas );<br />
}</p>
<p>###</p>
<p>— 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; “Beltrano de Tal”,<br />
endereco  =&gt; “Avenida Rua Bairro, 87654″,<br />
cidade    =&gt; “Guarulhos”,<br />
idade     =&gt; 24,<br />
telefones =&gt; {<br />
trabalho =&gt; “416-888-3245″,<br />
casa     =&gt; “416-567-6767″,<br />
},<br />
filhos =&gt; [<br />
{<br />
nome  =&gt; "Beltraninha Baby",<br />
idade =&gt; 2,<br />
},<br />
],<br />
},<br />
{<br />
nome      =&gt; “Ciclano”,<br />
endereco  =&gt; “Avenida Rua Bairro, 78678″,<br />
cidade    =&gt; “Sao Paulo”,<br />
idade     =&gt; 27,<br />
telefones =&gt; { celular =&gt; “907-787-9595″, },<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( “Pessoas com mais de $idade anos”,  \@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( “Pessoas com filhos com menos de $idade anos”,<br />
\@pessoas_encontradas );<br />
}</p>
<p>sub exibir_pessoas {<br />
my ( $titulo, $pessoas ) = @_;</p>
<p>print “\n### $titulo\n”;</p>
<p>foreach my $pessoa (@$pessoas) {<br />
print “$pessoa-&gt;{nome} mora em $pessoa-&gt;{cidade} e tem<br />
$pessoa-&gt;{idade} anos”;<br />
if ( exists $pessoa-&gt;{filhos} ) {<br />
print ” e tem ” . scalar( @{ $pessoa-&gt;{filhos} } ) . ”<br />
filho(s)”;<br />
}<br />
print “\n”;<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 – 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 – There’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>— Antes, algumas consideracoes…</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>— E alguns exercicios:</p>
<p>A) Escreva um programa que le a saida do “netstat -na” 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 “quit”, 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 “telnet www.exemplo.com 80″.</p>
<p>— 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 “argumento2 argumento3″ foo\ bar</p>
<p>*** Lendo dados digitados pelo usuario</p>
<p>STDIN – entrada padrao</p>
<p>- Exemplo</p>
<p># blah.pl:<br />
print “\n digite algo: \n”;<br />
my $info = &lt;STDIN&gt;;<br />
print “\n Voce digitou: \n $info\n\n”</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>— Funcao: system</p>
<p>— Sintaxe: system COMANDO</p>
<p>— Exemplo:</p>
<p>system “gzip arquivo.txt”</p>
<p>— 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…</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>— Funcao: open</p>
<p>— Sintaxe: open $fh, “COMANDO|”</p>
<p>— Exemplo:</p>
<p>open my $fh, “ps uxaw|” or die “Erro ao executar comando: $!\n”;<br />
while (&lt;$fh&gt;) {<br />
print “saida do ps: $_”;<br />
}<br />
close $fh;</p>
<p>— 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>— Funcoes:</p>
<p>socket<br />
connect</p>
<p>— sintaxe:</p>
<p>socket SOCKET,DOMAIN,TYPE,PROTOCOL<br />
connect SOCKET,NAME</p>
<p>— 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 “host unknown: $host”;<br />
my $paddr = sockaddr_in( $port, $ip_addr );<br />
my $proto = getprotobyname(‘tcp’);<br />
socket( my $socket, PF_INET, SOCK_STREAM, $proto ) or die “socket: $!”;<br />
connect( $socket, $paddr ) or die “connect: $!”;</p>
<p>autoflush $socket;</p>
<p>print $socket “GET / HTTP/1.0\r\nHost: $host\r\n\r\n” or die “print:  $!”;</p>
<p>while ( my $line = &lt;$socket&gt; ) {<br />
print “got $line”;<br />
}</p>
<p>close $socket;</p>
<p>— Testando:</p>
<p>./socket_exemplo.pl exemplo.com</p>
<p>*** Expressoes Regulares</p>
<p>— Exemplo para ler e tratar a saida do comando netstat -na</p>
<p>my %count_of;</p>
<p>open my $fh, “netstat -na|” or die “Erro ao executar netstat -na:  $!”;<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 ” LISTEN: $count_of{LISTEN}\n”;<br />
print ” ESTABLISHED: $count_of{ESTABLISHED}\n”;</p>
<p>— Notes:</p>
<p>/(LISTEN|ESTABLISHED)/;    # da match em LISTEN ou ESTABLISHED</p>
<p>## Perl Tutorial – Parte 5 ###</p>
<p>Fim da 2a parte do Curso de Perl – 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>— 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>— 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>— Code debugging</p>
<p>- Uso do modulo diagnostics<br />
- Uso do modulo Data::Dumper</p>
<p>— 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>— 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>— 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>— 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>— 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, … };    # cria um hashref</p>
<p>$ man perlreftut</p>
<p>— 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>— Sempre faca:</p>
<p>use strict;<br />
use warnings;<br />
my $variavel;            # sempre declare variaveis<br />
open(…) 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>— 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 “Exporter”; # 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>— 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 “var1 = $var1\n”;</p>
<p>my $var2 = funcao2(“blAHHHhhhhHHHhhhH!”);</p>
<p>print “Resultado: $var2\n”;</p>
<p>— Rode o programa.pl</p>
<p>####</p>
<p>Fim da 2a parte do curso de Perl.</p>
<p style="text-align: right;">Fonte: http://www.gustavoroberto.blog.br</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/04/curso-de-perl-%e2%80%93-como-programar-em-perl/' rel='bookmark' title='Permanent Link: Curso de Perl – Como programar em Perl'>Curso de Perl – Como programar em Perl</a> <small>Nota, se você não tem acesso a um UNIX para...</small></li>
<li><a href='http://blog.deserv.info/2010/01/31/scripts-de-conexao-ao-mysql-%e2%80%93-perl/' rel='bookmark' title='Permanent Link: Scripts de conexão ao MySQL – Perl'>Scripts de conexão ao MySQL – Perl</a> <small>Segue abaixo um exemplo simples para testar a conexão do...</small></li>
<li><a href='http://blog.deserv.info/2010/01/05/tutorial-perl/' rel='bookmark' title='Permanent Link: Tutorial PERL'>Tutorial PERL</a> <small>A linguagem Perl (Practical Extraction and Report Language) - inicialmente...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/05/curso-de-perl-%e2%80%93-como-programar-em-perl-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso de Perl – Como programar em Perl</title>
		<link>http://blog.deserv.info/2010/05/04/curso-de-perl-%e2%80%93-como-programar-em-perl/</link>
		<comments>http://blog.deserv.info/2010/05/04/curso-de-perl-%e2%80%93-como-programar-em-perl/#comments</comments>
		<pubDate>Wed, 05 May 2010 01:26:20 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PERL]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Como programar em Perl]]></category>
		<category><![CDATA[Curso de Perl]]></category>
		<category><![CDATA[Cursos]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=362</guid>
		<description><![CDATA[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 Introdução É 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. Documentação Na [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/05/curso-de-perl-%e2%80%93-como-programar-em-perl-parte-ii/' rel='bookmark' title='Permanent Link: Curso de Perl – Como programar em Perl parte II'>Curso de Perl – Como programar em Perl parte II</a> <small>Perl best practices: escrevendo códigos legíveis; Perl modules: instalação, uso,...</small></li>
<li><a href='http://blog.deserv.info/2010/01/31/scripts-de-conexao-ao-mysql-%e2%80%93-perl/' rel='bookmark' title='Permanent Link: Scripts de conexão ao MySQL – Perl'>Scripts de conexão ao MySQL – Perl</a> <small>Segue abaixo um exemplo simples para testar a conexão do...</small></li>
<li><a href='http://blog.deserv.info/2010/01/05/tutorial-perl/' rel='bookmark' title='Permanent Link: Tutorial PERL'>Tutorial PERL</a> <small>A linguagem Perl (Practical Extraction and Report Language) - inicialmente...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<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. <span id="more-362"></span></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 “;”</p>
<p>Exemplo:</p>
<blockquote><p>print “Blah, blah, blah”;</p></blockquote>
<p>Para comentar uma linha, use “#”</p>
<p>Exemplo:</p>
<blockquote><p># Isso é um comentario</p>
<p>print “Blah, blah, blah”; # 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 “$” e é usado  para guardar valores simples, como por exemplo: uma palavra, um texto ou  números, uma data, etc.</p>
<blockquote><p>my $fruta = “laranja”;<br />
print “$fruta\n”;</p>
<p>my $total = 24;<br />
my $resultado = $total / 2;<br />
print “$resultado\n”;</p></blockquote>
<p><strong>array</strong> : É representado pelo símbolo “@” e é usado  para guardar uma lista de valores.</p>
<blockquote><p>my @frutas = (“laranja”, “manga”, “banana”);<br />
my @numeros = (10, 45, 20, -78, 99.9, 14);<br />
my @tudo = (“laranja”, 100, 24, “manga”, 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 “%” 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 “O Fulano tem $idades{Fulano} anos, mas o Beltrano tem<br />
$idades{Beltrano}\n”;</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 = “Hello, World!”;<br />
print $texto,”\n”;  # 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 “my” antes de usa-las ou na  primeira<br />
vez que usa-las, exemplo:</p>
<blockquote><p>my $variavel;<br />
$variavel = “123 testando”;<br />
print “$variavel\n”;</p></blockquote>
<p>ou então:</p>
<blockquote><p>my $variavel = “123 testando”;<br />
print “$variavel\n”;</p></blockquote>
<p>NÃO declare a variável mais de uma vez, como por exemplo:</p>
<blockquote><p>my $variavel;<br />
my $variavel = “123 testando”;</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 – 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 “Soma: $soma\n”;</p></blockquote>
<blockquote><p>my $x = 22;<br />
my $y = 5;<br />
my $resto = 22 % 5;<br />
print “Resto: $resto\n”;</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 />
…<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 />
…<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 />
…<br />
}</p></blockquote>
<blockquote><p>if ( !($numero1 == $numero2) ) {<br />
…<br />
}</p></blockquote>
<p><strong>Condições</strong></p>
<p><strong>IF ELSIF ELSE</strong></p>
<blockquote><p>if (condicao) {</p>
<p>…</p>
<p>} elsif (outra condicao) {</p>
<p>…<br />
} else {</p>
<p>…<br />
}</p></blockquote>
<p>OU</p>
<blockquote><p>… if condicao;</p></blockquote>
<p><strong>Exemplo:</strong></p>
<blockquote><p>my $sisop = ‘linux’;</p>
<p>if ($sisop eq “solaris”) {</p>
<p>print “Solaris\n”;</p>
<p>} elsif ($sisop eq “linux”) {</p>
<p>print “Linux\n”;</p>
<p>} else {</p>
<p>print “Outro sistema operacional\n”;<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 – eh a negativa do IF.</strong></p>
<p><strong>Sintaxe:</strong></p>
<blockquote><p>… 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 “condicao” não  for verdade.</p>
<p><strong>Sintaxe:</strong></p>
<blockquote><p>while (condicao) {<br />
…<br />
}</p></blockquote>
<p>OU</p>
<blockquote><p>… while condicao;</p></blockquote>
<p><strong>Exemplo:</strong></p>
<blockquote><p>my $contador = 0;<br />
while ($contador  10) {<br />
print “Contando ate 10 com until… $contador\n”;<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 – o FOREACH – que é muito  mais<br />
pratica que o FOR.</p>
<blockquote><p>for (inicia contador; condicao; incrementa contador) {<br />
…<br />
}</p></blockquote>
<p><strong>Exemplo:</strong></p>
<blockquote><p>my $fim = 10;<br />
for ( my $contador=0; $contador  “MySQL”,<br />
linguagem =&gt; “Perl”,<br />
webserver =&gt; “Apache”,<br />
);<br />
foreach my $ferramenta (keys %desenvolvimento) {<br />
print “O Conteudo de $ferramenta eh<br />
$desenvolvimento{$ferramenta}\n”;<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 = “linux ” x 5;<br />
print “O resultado de linux x 5 eh igual a $resultado\n”;</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: “tratamento de arquivos” e “expressões regulares”.  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,  “/path/do/arquivo.txt”)</p></blockquote>
<p><strong>NOTA:</strong> O símbolo “&gt;” 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, “&gt;&gt;/path/do/arquivo.txt”)</p></blockquote>
<p>NOTA: O símbolo “&gt;&gt;” 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,  “) {    # 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 “print” sozinho eh a mesma coisa que “print $_”<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,  “&gt;/path/do/arquivo.txt”);</p></blockquote>
<p>ou:</p>
<blockquote><p>open(my $arquivo,  “&gt;&gt;/path/do/arquivo.txt”);</p></blockquote>
<p>Para escrever algo nesse arquivo, pode-se usar algo como:</p>
<blockquote><p>print $arquivo “1 \n”;<br />
print $arquivo “2 \n”;<br />
print $arquivo “3 \n”;<br />
print $arquivo “4 \n”;</p></blockquote>
<p>Ou, melhor:</p>
<blockquote><p>foreach my $numero (1..4) {<br />
print $arquivo “$numero\n”;<br />
}</p></blockquote>
<p><strong>FECHANDO UM ARQUIVO:</strong></p>
<p>— 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, “) {<br />
print “Nome do pais: $_\n”;<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, “&gt;esportes.txt”) or die “Nao consegui abrir  esportes.txt:<br />
$!”;<br />
my @esportes = (“hockey”, “futebol”, “tennis”, “levantamento de peso”,<br />
“baseball”);<br />
print $arquivo “Criando um arquivo em Perl… \n”;<br />
foreach my $esporte (@esportes) {<br />
print $arquivo “Nome do esporte: $esporte\n”;<br />
}<br />
print $arquivo “Fim do arquivo… \n\n”;<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…<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…</p>
<p><strong>Expressões Regulares – ou simplesmente “regexp”:</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: “ls *.pdf”, o que vai<br />
retornar todos os arquivos com extensão “.pdf”. 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, “) {<br />
print “Nome do pais: $_\n”;<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 “m”. 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, “) {<br />
if ($_ =~ /m/) {        # verifica se o nome do pais contem a letra<br />
m<br />
print “Pais que contem a letra m: $_ \n”;<br />
} else {<br />
print “Pais que NAO contem a letra m: $_ \n\n”;<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 “while<br />
()”.</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 “m”.</p>
<p>Outros exemplos:</p>
<blockquote><p>my $texto = “Ola Mundo”;<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, “&gt;esportes.txt”) or die “Nao  consegui abrir esportes.txt:<br />
$!”;</p></blockquote>
<p>por:</p>
<blockquote><p>open (my $arquivo, “&gt;&gt;esportes.txt”) or die “Nao  consegui abrir esportes.txt:<br />
$!”;</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 – mata o  programa;<br />
função use – carrega um módulo, avisa o Perl para “usar” 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 “Esse fulano eh um chato: $_ \n”;</p></blockquote>
<p>por:</p>
<blockquote><p>while () {<br />
chomp;<br />
print “Esse fulano eh um chato: $_ \n”;</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: “tratamento de arquivos”, “expressões regulares” e<br />
“subrotinas/funções”. 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, “/path/do/arquivo.txt”)</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, ”<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 />
“hora=10:20,data=25/12/2005″ 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 = “horario=10:20,data=25/12/2005″;<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 “Dia = $dia\n”;<br />
print “Mes = $mes\n”;<br />
print “Ano = $ano\n”;<br />
}</p></blockquote>
<p>Ou então:</p>
<p>my $info = “horario=10:20,data=25/12/2005″;<br />
my ($dia, $mes, $ano);</p>
<p>if ( $info =~ m|^.*data=(\d{2})/(\d{2})/(\d{4})| ) {</p>
<p>print “Dia = $1\n”;<br />
print “Mes = $2\n”;<br />
print “Ano = $3\n”;<br />
}</p>
<p>Ou ainda:</p>
<blockquote><p>my $info = “horario=10:20,data=25/12/2005″;</p>
<p>if ( my($dia, $mes, $ano) = $info =~  m|^.*data=(\d{2})/(\d{2})/(\d{4})| ) {</p>
<p>print “Dia = $dia\n”;<br />
print “Mes = $mes\n”;<br />
print “Ano = $ano\n”;<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 “my” foi usado dentro de um “if”.  Nesse<br />
caso, as variáveis $dia, $mes e $ano, só existem dentro daquele “if”.</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>.* “ponto” eh qualquer caractere; “asterisco” 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 “data=”</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:  “data=”,<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: “email=<br />
cursos at linuxchix.org.br” e que precisamos isolar o usuário e o  dominio.<br />
Podemos usar algo como:</p>
<blockquote><p>my $info = ‘email=cursos at linuxchix.org.br’;</p>
<p>if ( $info =~ m|^e-?mail=(.+)@(.+)| ) {</p>
<p>print “Usuario = $1\n”;<br />
print “Dominio = $2\n”;<br />
}</p></blockquote>
<p><strong>Analisando trechos do programa:</strong></p>
<blockquote><p>my $info = ‘email=cursos at linuxchix.org.br’;</p></blockquote>
<p>Note que aqui foi usado ‘ (aspas simples) ao invés de ” (aspas). Isso<br />
porque, em Perl, quando usamos “, significa que o Perl vai interpretar  tudo<br />
o que esta dentro de ” (aspas), inclusive variáveis. Então, no exemplo<br />
acima, se fizermos algo como:</p>
<blockquote><p>my $info = “email=cursos at linuxchix.org.br”;</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 ‘ o Perl não tenta interpretar o conteudo entre ‘  (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 “e-”</p>
<p>? indica zero ou uma ocorrência do caractere anterior, no caso do  exemplo<br />
dado, indica 0 ou uma ocorrência do “-”. Ou seja, vai dar match se a  string<br />
começar com “email” ou “e-mail”.</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 “e” seguida ou não de um “-”, seguida  do<br />
texto “mail=”, 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 “reinventar a roda”, 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 – Porta: 23 – Protocolo: TCP<br />
Serviço: http – Porta: 80 – Protocolo: TCP</p>
<p>b) Altere o programa do exercício “a” 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 – Porta: 23<br />
Serviço: http – Porta: 80</p>
<p>d)Altere o programa do exercicio “c” para que ele imprima informação  somente<br />
se o nome do serviço não começa com a letra “t” ou “h”.</p>
<p>e) Altere novamente o programa do exercício “c” para que ele imprima<br />
informação somente se a porta na qual o servico escuta seja maior do que<br />
500.</p>
<p style="text-align: right;">Fonte: http://www.gustavoroberto.blog.br</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/05/05/curso-de-perl-%e2%80%93-como-programar-em-perl-parte-ii/' rel='bookmark' title='Permanent Link: Curso de Perl – Como programar em Perl parte II'>Curso de Perl – Como programar em Perl parte II</a> <small>Perl best practices: escrevendo códigos legíveis; Perl modules: instalação, uso,...</small></li>
<li><a href='http://blog.deserv.info/2010/01/31/scripts-de-conexao-ao-mysql-%e2%80%93-perl/' rel='bookmark' title='Permanent Link: Scripts de conexão ao MySQL – Perl'>Scripts de conexão ao MySQL – Perl</a> <small>Segue abaixo um exemplo simples para testar a conexão do...</small></li>
<li><a href='http://blog.deserv.info/2010/01/05/tutorial-perl/' rel='bookmark' title='Permanent Link: Tutorial PERL'>Tutorial PERL</a> <small>A linguagem Perl (Practical Extraction and Report Language) - inicialmente...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/04/curso-de-perl-%e2%80%93-como-programar-em-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução ao sistema de arquivos ReiserFS</title>
		<link>http://blog.deserv.info/2010/04/30/introducao-ao-sistema-de-arquivos-reiserfs/</link>
		<comments>http://blog.deserv.info/2010/04/30/introducao-ao-sistema-de-arquivos-reiserfs/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 21:34:59 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[RAID]]></category>
		<category><![CDATA[ext2]]></category>
		<category><![CDATA[ext3]]></category>
		<category><![CDATA[FAT]]></category>
		<category><![CDATA[FAT32]]></category>
		<category><![CDATA[JFS]]></category>
		<category><![CDATA[NTFS]]></category>
		<category><![CDATA[particionamento]]></category>
		<category><![CDATA[ReiserFS]]></category>
		<category><![CDATA[Sistema de Arquivos Linux]]></category>
		<category><![CDATA[XFS]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=360</guid>
		<description><![CDATA[Introdução O sistema operacional GNU/Linux (por comodidade, neste artigo o chamaremos somente de Linux) é muito abrangente no que se refere à compatibilidade com sistemas de arquivos (ou filesystems) variados. A maioria dos usuários de Linux o instalam em partições ext3 e ReiserFS (além de outras menos conhecidas), sendo que este último vem ganhando cada [...]


Related posts:<ol><li><a href='http://blog.deserv.info/2010/01/22/implementando-raid1-em-um-sistema-sem-perder-dados/' rel='bookmark' title='Permanent Link: Implementando RAID1 em um sistema sem perder dados'>Implementando RAID1 em um sistema sem perder dados</a> <small>Quem mexe bastante com servidores de qualquer tipo sabe muito...</small></li>
</ol>

Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[
<h3>Introdução</h3>
<p>O sistema operacional GNU/Linux (por comodidade, neste artigo o chamaremos          somente de Linux) é muito abrangente no que se refere à          compatibilidade com sistemas de arquivos (ou <em>filesystems</em>) variados.          A maioria dos  usuários de Linux o instalam em partições          ext3 e <strong>ReiserFS</strong> (além          de outras menos conhecidas), sendo que este último vem ganhando          cada vez mais notoriedade. Prova disso, é que ele já tem          até um sucessor, o Reiser4. Mas, o que é que o ReiserFS          tem de vantajoso? Quais são as suas principais características?          Quais as suas desvantagens? As respostas para essas perguntas você          encontra no decorrer deste artigo.  <span id="more-360"></span></p>
<h3>O que é um sistema de arquivos?</h3>
<p>Antes de conhecer o ReiserFS em si, é conveniente saber o que          é um sistema de arquivos. Em poucas palavras, trata-se de uma estrutura          que indica como os dados devem ser gravados em dispositivos de gravação.          É de acordo com os recursos oferecidos por essa estrutura que é          possível determinar o espaço disponível e ocupado          em disco, e gerenciar como partes de um arquivo podem ficar &#8220;distribuídas&#8221;          nas áreas de armazenamento. É também o sistema de          arquivos que determina como os dados podem ser acessados, copiados, movidos,          renomeados, protegidos e eliminados. Portanto, sem um sistema de arquivos,          é impossível utilizar um disco rígido (e outros dispositivos)          para armazenamento de informações.</p>
<h3>O sistema de arquivos ReiserFS</h3>
<h4>Principais características</h4>
<p>O sistema de arquivos ReiserFS teve sua primeira aparição          no ano de 2001 pelas mãos de Hans          Reiser (daí o nome do padrão), que também montou          uma equipe de nome NAMESYS para gerenciar os trabalhos do projeto. Desde então, o ReiserFS          vem sendo cada vez mais utilizado, principalmente por estar disponível          como padrão em muitas das distribuições Linux, fazendo          frente ao sistema de arquivos ext3.</p>
<p>A boa aceitação do ReiserFS é devida ao seu conjunto          de características, que o tornam um sistema de arquivos seguro,          eficiente, rápido e confiável. Entre seus principais recursos,          tem-se:</p>
<p>- <em>Journaling</em>, um recurso que ajuda a manter a integridade dos          dados em caso de erros no sistema causados por desligamento incorreto          ou determinadas falhas de hardware, por exemplo. O journaling é          uma das características mais importantes do ReiserFS, motivo pelo          qual é explicado com mais detalhes adiante;</p>
<p>- Suporte a arquivos com mais de 2 GB (limitação existente          em alguns filesystems);</p>
<p>- Organização dos objetos do sistema de arquivos em uma          estrutura de dados chamada <em>B+Trees</em> (árvores B+). Nesse esquema,          os dados são fixados em posições organizadas por          divisões denominadas folhas. Por sua vez, as folhas são          organizadas por nós ou ponteiros chamados de sub-árvores,          que estão ligados a um nó raiz (ver ilustração          abaixo para entender melhor). Esse processo organizacional exige algoritmos          mais complexos, porém apresenta performance superior na gravação          e no acesso aos dados, se comparado a outros sistemas de arquivos;</p>
<p><img src="http://www.infowester.com/img_art/reiser_arv.jpg" alt="Esquema de árvores - ReiserFS" width="553" height="163" /></p>
<p>- Alocação dinâmica de <em>inodes</em> (em poucas palavras,          inodes são estruturas que contém  informações sobre os arquivos), diminuindo o desperdício de espaço.          Outros sistemas de arquivos têm blocos de tamanho fixo para alocação,          assim, se não for necessário usar um bloco inteiro, o espaço          restante fica em desuso. No ReiserFS, a alocação é          feita com base no tamanho do arquivo.</p>
<h4>Organização</h4>
<p>O ReiserFS tem como referência o já mencionado esquema <em>B+Trees</em> para organizar e localizar os itens que compõem, em sua essência,          todo o sistema de arquivos, isto é, os dados em si e as informações          associadas (data de criação, permissões de acesso,          proprietário, etc). Basicamente, todos esses itens são classificados          em diretórios (<em>directory items</em>), blocos de dados diretos          e indiretos (<em>direct items / indirect items</em>) e inodes (<em>stat data          items</em>).</p>
<p>Nos inodes é que são classificadas as informações          referentes a cada arquivo, isto é, os metadados. Os direct items          são os arquivos em si, mas quando armazenados nas &#8220;folhas&#8221;          das sub-árvores e, embora tenham tamanho variável, são          compostos por blocos de dados pequenos. Os direct items ficam próximos          aos metadados, já que tanto um como o outro são organizados          nas árvores. Já os blocos maiores, isto é, os indirect          items, não são incluídos nas árvores (por          isso recebem esse nome) e são &#8220;localizáveis&#8221; por          ponteiros que indicam onde estão armazenados.</p>
<p>Todo esse esquema acaba fazendo com que o espaço em disco seja          melhor aproveitado no ReiserFS. Por outro lado, também há          desvantagens, já que pode causar maior fragmentação          de dados, assim como exigir mais recursos de processamento.</p>
<h3>O que é Journaling?</h3>
<p>Um dos recursos que faz o ReiserFS ser bastante seguro é a funcionalidade          <strong>Journaling</strong> (também presente em outros sistemas de arquivos,          como o ext3). Com ela, o sistema de arquivos passa a registrar em uma          área especial chamada &#8220;<em>journal</em>&#8221; ou &#8220;<em>log</em>&#8221;          as ações que serão feitas nos arquivos (gravação          ou alteração de dados, por exemplo) antes da execução          em si. Após a execução, as operações          registradas no log são tidas como concluídas e, portanto,          eliminadas. Note que todo esse procedimento acontece de maneira extremamente          rápida.</p>
<p>Mas, no que, exatamente, o Journaling se mostra vantajoso? Os registros          de log são escritos antes que as mudanças efetivamente ocorram          no sistema de arquivos. Esses registros somente são eliminados          quando as mudanças são executadas. Se, por exemplo, o  computador for desligado repentinamente (como ocorre em falta de energia elétrica),          o sistema de arquivos verificará os registros existentes no journal          e executará aquilo que estiver marcado como não realizado.          Isso faz com que o risco de perda de dados diminua drasticamente, já          que o sistema operacional saberá &#8220;onde parou&#8221;.</p>
<p>É importante frisar que, no caso do ReiserFS, as técnicas          de Journaling se limitam aos metadados (conjuntos de informação          sobre arquivos, como tamanho, proprietário, permissões,          data de alteração, etc), fazendo com que esse filesystem          seja eficiente na recuperação do sistema operacional como          um todo em caso de problemas. Por outro lado, o sistema de arquivos ext3          é capaz de usar Journaling preservando metadados e as informações          dos arquivos em si, mas isso pode fazer com que o desempenho do sistema          de arquivos diminua.</p>
<h3>Reiser4</h3>
<p>O Reiser4 é uma nova implementação do ReiserFS,          ou seja, é seu sucessor natural. Sua proposta é a de oferecer,          entre outros recursos, o seguinte:</p>
<p>- Journaling mais eficiente;<br />
- Melhor suporte a grandes quantidades de arquivos pequenos;<br />
- Gerenciamento mais rápido de diretórios com muitos arquivos          (na casa dos milhares);<br />
- Estrutura de arquivos dinamicamente otimizada;<br />
- Transações atômicas na modificação          do sistema de arquivos. Neste caso, uma operação só          pode ser tida como concluída se executada por completo, ou seja,          não há meio termo: ou está feito ou não está.</p>
<p>O Reiser4 é um projeto que demorou alguns anos para ser concretizado          e, embora já tenha uma versão estável disponível          para uso, sua adoção é muito lenta devido a alguns          entraves, sendo um deles, a demora de sua inclusão no kernel.          Essas questões ainda estão sendo tratadas.</p>
<h3>Finalizando</h3>
<p>Quando o assunto é sistema de arquivos no Linux, é inevitável          as comparações entre o ReiserFS e o ext3, além de          outros menos usados, como o XFS.          Nada mais natural, afinal, cada usuário procura o melhor para o          seu computador. Mas apontar qual realmente é melhor não          é uma tarefa fácil. Há vários comparativos          na  internet que tentam oferecer essa resposta, mas, aqui no InfoWester,          somos da opinião de que a melhor coisa a se fazer é testar          os sistemas de arquivos que lhe atraíram para definir qual mais          lhe agrada.</p>
<p>Como este artigo trata especificamente do ReiserFS, nada melhor que finalizar          sugerindo aos que desejam mais detalhes, as leituras que serviram de referência          para este texto:</p>
<p>- <a href="http://www.namesys.com/X0reiserfs.html" target="_blank">www.namesys.com/X0reiserfs.html</a><br />
- <a href="http://www.namesys.com/v4/v4.html" target="_blank">www.namesys.com/v4/v4.html</a><br />
- <a href="http://www.cerias.purdue.edu/homes/florian/reiser/reiserfs.php" target="_blank">www.cerias.purdue.edu/homes/florian/reiser/reiserfs.php</a><br />
- <a href="http://en.wikipedia.org/wiki/Reiser4" target="_blank">en.wikipedia.org/wiki/Reiser4</a></p>
<p><em>Escrito por Emerson Alecrim</em></p>
<p><em>Fonte: </em>http://www.infowester.com</p>



<p>Related posts:<ol><li><a href='http://blog.deserv.info/2010/01/22/implementando-raid1-em-um-sistema-sem-perder-dados/' rel='bookmark' title='Permanent Link: Implementando RAID1 em um sistema sem perder dados'>Implementando RAID1 em um sistema sem perder dados</a> <small>Quem mexe bastante com servidores de qualquer tipo sabe muito...</small></li>
</ol></p>
<p>Posts relacionados trazidos a você pelo <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/04/30/introducao-ao-sistema-de-arquivos-reiserfs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
