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

<channel>
	<title>Blog do Beraldo &#187; Programação</title>
	<atom:link href="http://www.rberaldo.com.br/blog/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rberaldo.com.br/blog</link>
	<description>Programação, Música, Entretenimento e o que mais me vier à mente</description>
	<lastBuildDate>Mon, 06 Feb 2012 14:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Curso de Shell Script &#8211; Módulo #1: Scripts Shell e suas estruturas</title>
		<link>http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas/</link>
		<comments>http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 20:44:59 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sh]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=478</guid>
		<description><![CDATA[(Caso não tenha lido a primeira parte (módulo #0), veja-a aqui: http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/) Inicialmente, eu separaria este texto em vários módulos. Porém, optei por faer algo mais sucinto e criar apenas este módulo &#8211; que complementa o Módulo #0, sobre os comandos básicos do Linux. Neste módulo, serão abordados vários temas da programação em Shell (Bash), [...]]]></description>
			<content:encoded><![CDATA[<p>(Caso não tenha lido a primeira parte (módulo #0), veja-a aqui: <a href="http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/">http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/</a>)</p>
<p>Inicialmente, eu separaria este texto em vários módulos. Porém, optei por faer algo mais sucinto e criar apenas este módulo &#8211; que complementa o Módulo #0, sobre os comandos básicos do Linux.</p>
<p>Neste módulo, serão abordados vários temas da programação em Shell (Bash), desde variáveis e funções, até expansões, expressões regulares etc.</p>
<p>Sem mais delongas, vamos ao que interessa! :)</p>
<p><span id="more-478"></span></p>
<h3>Sumário</h3>
<p><a href="#scripts">0. Scripts Shell</a><br />
<a href="#vars">1. Variáveis</a><br />
<a href="#envvars">1.1 Variáveis de Ambiente</a><br />
<a href="#espvars">1.2. Variáveis Especiais</a><br />
<a href="#fluxo">2. Controle de Fluxo</a><br />
<a href="#cond">2.1. Condicionais</a><br />
<a href="#if">2.1.1. if</a><br />
<a href="#case">2.1.2. case</a><br />
<a href="#select">2.1.3. select</a><br />
<a href="#repeat">2.2. Estruturas de Repetição (Loops)</a><br />
<a href="#for">2.2.1. for</a><br />
<a href="#while">2.2.2. while</a><br />
<a href="#until">2.2.3. until&#8230;do</a><br />
<a href="#break">2.2.4. break</a><br />
<a href="#continue">2.2.5. continue</a><br />
<a href="#cpattern">3. Padrão C/C++ em Expressões &#8220;(())&#8221;</a><br />
<a href="#es">4. Entrada/Saída</a><br />
<a href="#redir">4.1. Redirecionamento</a><br />
<a href="#pipe">4.2. Usando Pipelines</a><br />
<a href="#expansoes">5. Expansões</a><br />
<a href="#varexp">5.1. Expansão de Variáveis</a><br />
<a href="#params">6. Parâmetros de linha de comando</a><br />
<a href="#funcs">7. Definindo Funções</a><br />
<a href="#return">7.1. Retorno de Funções</a><br />
<a href="#er">8. Expressões Regulares em Bash</a><br />
<a href="#mathexp">9. Expressões Matemáticas</a><br />
<a href="#bashrc">10. O Arquivo .bashrc</a><br />
<a href="#alias">11. Aliases (Apelidos)</a><br />
<a href="#refs">12. Referências</a></p>
<h3><a name="scripts">0. Scripts Shell</a></h3>
<p>Antes de mostrar os recursos do shell, vamos dar uma olhada na maneira como devemos criar scripts shell. Isso facilitará a compreensão do restante do artigo.</p>
<p>Todo arquivo com códigos shell deve ter, na primeira linha, o identificador do interpretador a ser utilizado. A &#8220;linha mágica&#8221; que chama o interpretado bash é:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span></pre></div></div>

<p>O mesmo vale para outras linguagens interpretadas, como PHP, Python, Ruby, Perl etc.</p>
<p>Tendo essa linha no início do arquivo, o segundo passo é dar permissão de execução ao arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">chmod</span> +x script.sh
<span style="color: #000000; font-weight: bold;">&lt;</span>pre<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
Feito isso, basta executar o script:
&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;</span>pre <span style="color: #007800;">lang</span>=<span style="color: #ff0000;">&quot;bash&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>script.sh</pre></div></div>

<p>Também é possível executar o script usando o comando <strong>bash</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">bash</span> script.sh</pre></div></div>

<p>Assim não é necessário haver a &#8220;linha mágica&#8221; no início do script. Também não é preciso dar permissão de execução ao arquivo.</p>
<h3><a name="vars">1. Variáveis</a></h3>
<p>O Bash, assim como muitas outras linguagens, possui o conceito de variável. Para definir uma variável:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">nome_da_variavel</span>=<span style="color: #ff0000;">&quot;valor da variável&quot;</span></pre></div></div>

<p>É importante ressaltar que não deve haver espaços entre o símbolo de atribuição, o nome da variável e seu valor, para que o bash interprete o comando como atribuição, não chamada de comandos.</p>
<p>Para exibir o valor de uma variável, basta usar <strong>echo</strong> da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$nome_da_variavel</span></pre></div></div>

<h4><a name="envvars">1.1 Variáveis de Ambiente</a></h4>
<p>As variáveis de ambiente são aquelas conhecidas pelos demais processos (programas em execução). Exemplos destas variáveis são: HOME, PATH, EDITOR, etc.</p>
<p>Para entender o seu uso, vejamos um exemplo: editores de texto, como <strong>Vi</strong>, possuem diferentes interfaces para os modos texto e gráfico e necessitam saber qual o tipo de terminal o usuário está usando. A variável de ambiente TERM é o modo pelo qual isto pode ser determinado. Outro exemplo são os programas de e-mail que permitem ao usuário editar mensagens com o editor de textos de sua preferência. Como estes programas sabem qual editor usar? É através da variável EDITOR ou VISUAL.</p>
<p>Qualquer variável pode se tornar uma variável de ambiente. Para isto, ela deve ser &#8220;exportada&#8221;, com o comando <strong>export</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #000000; font-weight: bold;">&lt;</span>variável<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Também podemos exportar e atribuir valores a uma variável numa única linha de comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #000000; font-weight: bold;">&lt;</span>variável<span style="color: #000000; font-weight: bold;">&gt;</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>valor<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Podemos verificar quais são as variáveis de ambiente já definidas e seus respectivos valores usando o comando abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #660033;">-p</span></pre></div></div>

<p>Para visualizar todas as variáveis basta usar set ou env. Uma importante variável de ambiente é PATH que ajuda o shell a encontrar os comandos que o usuário executa. Todo comando executado é, na realidade, um arquivo. Estes arquivos são chamados executáveis e estão armazenados em vários diretórios como /bin ou /usr/bin. O valor da variável PATH é uma lista de diretórios em que o shell procura toda vez que executamos um comando cujo arquivo não é encontrado no diretório corrente. Assim, não precisamos alterar o diretório de trabalho todas vez que necessitamos executar um comando que se encontra em outro diretório. Basta acrescentar o diretório que contém tal comando à variável PATH. Os nomes dos diretórios na variável são separados pelo caractere dois-pontos (:).</p>
<p>Caso o usuário joao queira adicionar um outro diretório, digamos /home/joao/bin à variável PATH, deve proceder como mostrado a seguir:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>joao<span style="color: #000000; font-weight: bold;">/</span>bin   <span style="color: #666666; font-style: italic;"># adiciona o diretório</span>
$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$PATH</span>                         <span style="color: #666666; font-style: italic;"># verifica</span>
<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>joao<span style="color: #000000; font-weight: bold;">/</span>bin</pre></div></div>

<p>O primeiro comando faz com que a variável receba o seu valor atual, concatenado com o nome do diretório a ser acrescentado. Observe que existe um &#8220;:&#8221; antes do nome do diretório. O segundo comando é utilizado apenas para visualizarmos o resultado do primeiro.</p>
<h4><a name="espvars">1.2. Variáveis Especiais</a></h4>
<p>Existem algumas variáveis especiais, normalmente utilizadas em script shell, para verificação de parâmetros, valores de retorno de comandos e funções etc.</p>
<table width="100%">
<thead>
<tr>
<td>Variável</td>
<td>Descrição</td>
</tr>
</thead>
<tbody>
<tr>
<td>$0</td>
<td>Parâmetro número 0 (nome do comando ou função)</td>
</tr>
<tr>
<td>$1</td>
<td>Parâmetro número 1 (da linha de comando ou função)</td>
</tr>
<tr>
<td>&#8230;</td>
<td>Parâmetro número N &#8230;</td>
</tr>
<tr>
<td>$9</td>
<td>Parâmetro número 9 (da linha de comando ou função)</td>
</tr>
<tr>
<td>${10}</td>
<td>Parâmetro número 10 (da linha de comando ou função)</td>
</tr>
<tr>
<td>$#</td>
<td>Número total de parâmetros da linha de comando ou função</td>
</tr>
<tr>
<td>$*</td>
<td>Todos os parâmetros, como uma string única</td>
</tr>
<tr>
<td>$@</td>
<td>Todos os parâmetros, como várias strings protegidas</td>
</tr>
<tr>
<td>$$</td>
<td>Número PID do processo atual (do próprio script)</td>
</tr>
<tr>
<td>$!</td>
<td>Número PID do último processo em segundo plano</td>
</tr>
<tr>
<td>$_</td>
<td>Último argumento do último comando executado</td>
</tr>
<tr>
<td>$?</td>
<td>Valor de retorno do último comando executado</td>
</tr>
</tbody>
</table>
<h3><a name="fluxo">2. Controle de Fluxo</a></h3>
<p>Controle de fluxo permite interromper, continuar e deslocar o fluxo de execução do script. Isso envolve controles de decisão (condicionais) e estruturas de repetição (loops).</p>
<h4><a name="cond">2.1. Condicionais</a></h4>
<h4><a name="if">2.1.1. if</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">then</span>
    comandos
<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao_2<span style="color: #000000; font-weight: bold;">&gt;</span>
    comandos 
<span style="color: #000000; font-weight: bold;">else</span>
    comandos 
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>O <strong>if</strong>, ao contrário do que ocorre em muitas outras linguagens, testa o retorno de um comando, não uma expressão.</p>
<p>Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">7</span>
<span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'5 é menor que 7'</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>Porém, é possível posicionar a expressão entre colchetes, de forma a tornar o if mais parecido com o que acontece em outras linguagens:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">7</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'5 é menor que 7'</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>O &#8220;-lt&#8221; significa &#8220;<em>less than</em>&#8220;, ou seja, &#8220;<em>menor que</em>&#8220;, equivalendo ao operador &#8220;<".</p>
<p>Outros possíveis operadores são:</p>
<p><strong>Comparação Numérica</strong><br />
-lt: É menor que (LessThan)<br />
-gt: É maior que (GreaterThan)<br />
-le: É menor igual (LessEqual)<br />
-ge: É maior igual (GreaterEqual)<br />
-eq: É igual (EQual)<br />
-ne: É diferente (NotEqual)</p>
<p><strong>Comparação de Strings</strong><br />
=: É igual<br />
!=: É diferente<br />
-n: É não nula (não vazia)<br />
-z: É nula (vazia)</p>
<p><strong>Operadores Lógicos</strong><br />
!: NÃO lógico (NOT)<br />
-a: E lógico (AND)<br />
-o: OU lógico (OR)</p>
<p><strong>Testes em arquivos</strong><br />
-b: É um dispositivo de bloco<br />
-c: É um dispositivo de caractere<br />
-d: É um diretório<br />
-e: O arquivo existe<br />
-f: É um arquivo normal<br />
-g: O bit SGID está ativado<br />
-G: O grupo do arquivo é o do usuário atual<br />
-k: O sticky-bit está ativado<br />
-L: O arquivo é um link simbólico<br />
-O: O dono do arquivo é o usuário atual<br />
-p: O arquivo é um named pipe<br />
-r: O arquivo tem permissão de leitura<br />
-s: O tamanho do arquivo é maior que zero<br />
-S: O arquivo é um socket<br />
-t: O descritor de arquivos N é um terminal<br />
-u: O bit SUID está ativado<br />
-w: O arquivo tem permissão de escrita<br />
-x: O arquivo tem permissão de execução<br />
-nt: O arquivo é mais recente (NewerThan)<br />
-ot: O arquivo é mais antigo (OlderThan)<br />
-ef: O arquivo é o mesmo (EqualFile)</p>
<h4><a name="case">2.1.2. case</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">case</span> <span style="color: #000000; font-weight: bold;">&lt;</span>string<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">in</span>
    opcao1<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        comandos 
        <span style="color: #000000; font-weight: bold;">;;</span>
    opcao2<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        comandos 
        <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        operação padrão
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Digite um número&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">read</span> x
&nbsp;
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$x</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span> 
    <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Você digitou o número 1&quot;</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Você digitou o número 2&quot;</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Você digitou outro número&quot;</span>
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

<h4><a name="select">2.1.3. select</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000000; font-weight: bold;">&lt;</span>variavel<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">&lt;</span>opcao1<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>opcao2<span style="color: #000000; font-weight: bold;">&gt;</span> ...
<span style="color: #000000; font-weight: bold;">do</span> 
    comandos 
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>O comando <strong>select</strong> é pouco utilizado, mas pode ser muito útil para montar menus. Esse comando exibe um menu, associando cada opção a um número. Quando o usuário seleciona o número da opção, o seu valor é associado à <variavel>.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">select</span> i <span style="color: #000000; font-weight: bold;">in</span> lista_arquivos lista_arquivos_tree
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span> 
        lista_arquivos<span style="color: #7a0874; font-weight: bold;">&#41;</span>
            <span style="color: #c20cb9; font-weight: bold;">ls</span>
            <span style="color: #000000; font-weight: bold;">;;</span>
        lista_arquivos_tree<span style="color: #7a0874; font-weight: bold;">&#41;</span>
            <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-R</span>
            <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h4><a name="repeat">2.2. Estruturas de Repetição (Loops)</a></h3>
<p>Loops são estruturas que permitem fazer iterações sobre algum dado.</p>
<h4><a name="for">2.2.1. for</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #000000; font-weight: bold;">&lt;</span>var<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">&lt;</span>lista<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>&#8220;var&#8221; é o nome da variável a ser usada no bloco de repetição. &#8220;lista&#8221; pode ser uma lista de dados, fixa ou retornada por outro comando (como o ls), uma sequência de números etc.</p>
<p>Exemplos:</p>
<p>Exibe uma sequência de números:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000;">1</span> <span style="color: #000000;">2</span> <span style="color: #000000;">3</span> <span style="color: #000000;">4</span> <span style="color: #000000;">5</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Lista os diretórios e arquivos da raiz do sistema de arquivos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">1</span> <span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h4><a name="while">2.2.2. while</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Exemplos:</p>
<p>Exibe a sequência de 1 a 10:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Loop infinito que exibe &#8220;bash&#8221; na tela:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">true</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'bash'</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Lendo strings da entrada padrão:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Voce digitou a string: '</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Exibe as linhas de um arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #ff0000;">'arquivo.txt'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Esse exemplo facilita o trabalho com arquivos de texto, cujas linhas possuem espaços. Se fosse usado um loop for nesse caso, seria necessário alterar a variável de ambiente IFS, definindo o separador para quebra de linha (\n).</p>
<p>Uma variação do exemplo anterior é esta:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">&lt;</span> arquivo.txt</pre></div></div>

<p>A principal diferença entre estes dois últimos exemplos é que, no primeiro, o loop while é executado num subshell, devido ao uso do pipe (|). No segundo exemplo, o while é executado no shell corrente.</p>
<p>Para ilustrar o problema, crie um arquivo chamado &#8220;arq.txt&#8221; com algumas linhas de texto. Crie este script e execute-o:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">FILE</span>=<span style="color: #ff0000;">'arq.txt'</span>
&nbsp;
<span style="color: #007800;">total</span>=<span style="color: #000000;">0</span>
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$FILE</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #007800;">total</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>total+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Total de linhas: '</span> <span style="color: #007800;">$total</span>
&nbsp;
<span style="color: #007800;">total</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #007800;">total</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>total+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$FILE</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Total de linhas: '</span> <span style="color: #007800;">$total</span></pre></div></div>

<p>O primeiro loop é executado num subshell, fazendo com que a variável &#8220;total&#8221;, usada no corpo do loop, existe apenas nesse subshell. No segundo caso, isso não ocorre. Isso pode gerar grandes dores de cabeça&#8230; (como já ocorreu comigo)</p>
<h4><a name="until">2.2.3. until&#8230;do</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">until</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Nesse loop, a condição é oposta à usada no while. Por exemplo:</p>
<p>Com while:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Com unitl:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">until</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-ge</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Para fazer a mesma coisa, tivemos que usar expressões diferentes na condição do loop. </p>
<h4><a name="break">2.2.4. break</a></h4>
<p>O comando break encerra um loop imediatamente.</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">true</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-ge</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #7a0874; font-weight: bold;">break</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #7a0874; font-weight: bold;">break</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h4><a name="continue">2.2.5. continue</a></h4>
<p>O comando continue para a execução da iteração corrente e vai para a próxima iteração, mesmo que haja mais comandos no bloco de repetição.</p>
<h3><a name="cpattern">3. Padrão C/C++ em Expressões &#8220;(())&#8221;</a></h3>
<p>É possível usar o padrão C em expressões do shell, como em condicionais de estruturas de controle. Para isso, basta colocar a expressão entre dois parênteses. </p>
<p>Exemplos;</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i++<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>É possível, inclusive, usar o padrão do loop for do C:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i = <span style="color: #000000;">0</span>; i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000;">10</span>; i++<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h3><a name="es">4. Entrada/Saída</a></h3>
<p>Existem três dispositivos principais, que sempre estão abertos, que merecem destaque:</p>
<p>stdin (standard input): entrada padrão. Corresponde, em geral, ao teclado;<br />
stdout (standard output): saída padrão. Corresponde, em geral, à tela do terminal;<br />
stderr (standard error): saída padrão de erros. Corresponde, em geral, à tela do terminal, também.</p>
<p>Esses três dispositivos estão em /dev e estão sempre disponíveis. Quem programa em C, sabe muito bem disso, pois já deve ter usado stdin, stdout e stderr junto com fprintf, fread, fwrite e semelhantes; esses três dispositivos comportam-se como arquivos comuns, sempre abertos e que não devem ser fechados.<br />
É possível brincar com eles no próprio shell. Experimentem dar um cat em /dev/stdin para ver o que acontece. :)</p>
<h4><a name="redir">4.1. Redirecionamento</a></h4>
<p>A entrada de um programa consiste nos dados que lhe são passados inicialmente, os quais são necessários para a execução do programa. A entrada de um programa pode vir do teclado ou de um arquivo, por exemplo. Argumentos passados à comandos constituem a sua entrada.<br />
A saída é constituída pelas informações geradas pelo programa, ou seja, o resultado de sua execução. A saída pode ser mostrada na tela ou gravada em um arquivo de registro.</p>
<p>Muitos comandos do Linux têm sua entrada configurada para a entrada padrão e sua saída para a saída padrão. A entrada padrão é o teclado e a saída padrão é o monitor. Vejamos um exemplo usando o comando cat, que lê dados de todos os arquivos passados como parâmetros e os envia diretamente para a saída padrão. Usando o comando abaixo, veremos o conteúdo do arquivo &#8220;arq1&#8243; seguido pelo conteúdo de &#8220;arq2&#8243;.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> arq1 arq2</pre></div></div>

<p>Entretanto, se nenhum nome de arquivo for dado como parâmetro, o comando cat lê dados da entrada padrão e os envia para a saída padrão. Para interromper, deve-se pressionar as teclas ctrl e d simultaneamente (ctrl+d).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> 
Ola<span style="color: #000000; font-weight: bold;">!</span> Tem alguem ai?  <span style="color: #666666; font-style: italic;"># usuário </span>
Ola<span style="color: #000000; font-weight: bold;">!</span> Tem alguem ai?  <span style="color: #666666; font-style: italic;"># eco do sistema </span>
Ate mais<span style="color: #000000; font-weight: bold;">!</span>            <span style="color: #666666; font-style: italic;"># usuário </span>
Ate mais<span style="color: #000000; font-weight: bold;">!</span>            <span style="color: #666666; font-style: italic;"># eco do sistema</span>
              <span style="color: #666666; font-style: italic;"># usuário pressiona ctrl+d</span></pre></div></div>

<p>Como podemos ver, cada linha que o usuário digita é imediatamente ecoada pelo comando cat. Aqui um outro exemplo: o comando sort lê dados da entrada padrão &#8211; a menos que algum arquivo seja dado como parâmetro &#8211; e ordena os dados, enviando-os para a saída padrão:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sort</span> 
bananas     <span style="color: #666666; font-style: italic;"># usuário</span>
peras       <span style="color: #666666; font-style: italic;"># usuário</span>
goiabas     <span style="color: #666666; font-style: italic;"># usuário</span>
            <span style="color: #666666; font-style: italic;"># ctrl+d</span>
bananas     <span style="color: #666666; font-style: italic;"># eco do sistema</span>
goiabas     <span style="color: #666666; font-style: italic;"># eco do sistema</span>
peras       <span style="color: #666666; font-style: italic;"># eco do sistema</span></pre></div></div>

<p>Digamos que queremos enviar a saída do comando sort para um arquivo, gravando os dados digitados anteriormente. O shell nos permite redirecionar a saída para um arquivo usando o símbolo &#8220;>&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #000000; font-weight: bold;">&gt;</span> lista
bananas  <span style="color: #666666; font-style: italic;"># usuário</span>
peras    <span style="color: #666666; font-style: italic;"># usuário</span>
goiabas  <span style="color: #666666; font-style: italic;"># usuário</span>
         <span style="color: #666666; font-style: italic;"># ctrl+d</span></pre></div></div>

<p>Como se pode ver, o resultado do comando sort não é mostrado imediatamente após o se digitar ctrl+d. Ao invés disso, é salvo em um arquivo chamado &#8220;lista&#8221;. Vejamos o conteúdo desse arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> lista
bananas
goiabas
peras</pre></div></div>

<p>Com o redirecionamento de saída, temos uma maneira simples de criar arquivos de texto. Para isso, utilizamos o comando cat para ler a entrada padrão (teclado) e redirecionamos sua saída para um arquivo.</p>
<p>Ao usar &#8220;>&#8221; para redirecionar a saída para um arquivo, estamos realizando um redirecionamento destrutivo, ou seja, o comando &#8220;ls > lista&#8221; sobrescreve o conteúdo do arquivo &#8220;lista&#8221;. Isto é equivalente a dizer que todo o conteúdo anterior de &#8220;lista&#8221; é apagado.<br />
Se, ao invés disso, redirecionarmos usando &#8220;>>&#8221;, a saída será concatenada ao final do arquivo e o conteúdo (se houver) de &#8220;lista&#8221; será preservado. Para melhor entender isso, experimente executar a seguinte seqüência de comandos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> listagem
<span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> listagem
<span style="color: #c20cb9; font-weight: bold;">less</span> listagem</pre></div></div>

<p>O redirecionamento neste exemplo, diferentemente do exemplo anterior, é denominado redirecionamento não-destrutivo.</p>
<h3><a name="pipe">4.2. Usando Pipelines</a></h3>
<p>Nos exemplos para o filtro sort, os dados de entrada eram digitados pelo usuário ou estavam gravados em um arquivo. O que aconteceria se quiséssemos ordenar dados vindos do saída de outro comando ? Para listar os arquivos do diretório corrente em ordem alfabética invertida devemos fazer com que a saída do comando ls seja ordenada pelo comando sort. Usando a opção &#8220;-r&#8221;, este comando ordena os dados na ordem inversa.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span>
historia  notas     tese      testes 
$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;</span> lista 
$ <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-r</span> lista 
testes
tese
notas
lista                             <span style="color: #666666; font-style: italic;"># observe esse nome de arquivo</span>
historia</pre></div></div>

<p>Aqui, salvamos a saída do comando ls em um arquivo (lista) e usamos sort com a opção &#8220;-r&#8221;. Porém, isso faz com que tenhamos um arquivo temporário para armazenar os dados. Assim, toda vez que fizermos isso, teremos que, em seguida, remover o arquivo lista. A solução é usar o que chamamos de pipeline, outro recurso do shell que nos permite conectar vários comandos usando um pipe, onde a saída do primeiro comando é enviada diretamente à entrada do segundo e assim por diante no caso de haver mais de dois comandos conectados por pipes.</p>
<p>No nosso caso, queremos enviar a saída do comando ls para a entrada do comando sort. O símbolo &#8220;|&#8221; (barra vertical) é usado para criar um pipe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-r</span> 
testes
tese
notas
historia</pre></div></div>

<p>Note que neste exemplo, nenhum nome de arquivo é usado na linha de comando, diferentemente do exemplo anterior que fazia o uso do arquivo intermediário lista. Outra diferença é que o nome desse arquivo intermediário aparece no resultado do penúltimo exemplo, mas não neste último. O comando é mais curto, mais fácil de digitar e o resultado é mais adequado pois não inclui nomes de arquivos intermediários.</p>
<p>É importante observar que o redirecionamento e o uso de pipes são características do shell e não dos comandos em si. É o shell quem provê a sintaxe dos símbolos &#8220;>&#8221;, &#8220;<" e "|". Logo, se você criar um programa que utilize entrada de dados via stdin, poderá usar redirecionamento para especificar uma entrada para o seu programa.</p>
<h3><a name="expansoes">5. Expansões</a></h3>
<p>Expansões são caracteres, ou uma sequência deles, que expressa outro significado. O intuito disso é facilitar e padronizar comandos.</p>
<p>~: path à home do usuário corrente<br />
~user: path à home do usuário &#8220;user&#8221;<br />
{a,b,c}: presença do caractere &#8220;a&#8221;, &#8220;b&#8221; ou &#8220;c&#8221;. Podem ser usadas strings em vez de simplesmente caracteres.</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> ~</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> ~root</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>std<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000; font-weight: bold;">in</span>,out,err<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<h4><a name="varexp">5.1. Expansão de Variáveis</a></h4>
<table width="100%">
<thead>
<tr>
<td>Sintaxe</td>
<td>Expansão</td>
</tr>
</thead>
<tbody>
<tr>
<td>${var:-texto}</td>
<td>Se var não está definida, retorna &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:=texto}</td>
<td>Se var não está definida, defina-a com &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:?texto}</td>
<td>Se var não está definida, retorna o erro &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:+texto}</td>
<td>Se var está definida, retorna &#8216;texto&#8217;, senão retorna o vazio</td>
</tr>
<tr>
<td>${var}</td>
<td>É o mesmo que $var, porém não ambíguo</td>
</tr>
<tr>
<td>${#var}</td>
<td>Retorna o tamanho da string</td>
</tr>
<tr>
<td>${!var}</td>
<td>Executa o conteúdo de $var (igual &#8216;eval \$$var&#8217;)</td>
</tr>
<tr>
<td>${!texto*}</td>
<td>Retorna os nomes de variáveis começadas por &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:N}</td>
<td>Retorna o texto a partir da posição &#8216;N&#8217;</td>
</tr>
<tr>
<td>${var:N:tam}</td>
<td>Retorna &#8216;tam&#8217; caracteres a partir da posição &#8216;N&#8217;</td>
</tr>
<tr>
<td>${var#texto}</td>
<td>Corta &#8216;texto&#8217; do início da string</td>
</tr>
<tr>
<td>${var##texto}</td>
<td>Corta &#8216;texto&#8217; do início da string (* guloso)</td>
</tr>
<tr>
<td>${var%texto}</td>
<td>Corta &#8216;texto&#8217; do final da string</td>
</tr>
<tr>
<td>${var%%texto}</td>
<td>Corta &#8216;texto&#8217; do final da string (* guloso)</td>
</tr>
<tr>
<td>${var/texto/novo}</td>
<td>Substitui &#8216;texto&#8217; por &#8216;novo&#8217;, uma vez</td>
</tr>
<tr>
<td>${var//texto/novo}</td>
<td>Substitui &#8216;texto&#8217; por &#8216;novo&#8217;, sempre</td>
</tr>
<tr>
<td>${var/#texto/novo}</td>
<td>Se a string começar com &#8216;texto&#8217;, substitui &#8216;texto&#8217; por &#8216;novo&#8217;</td>
</tr>
<tr>
<td>${var/%texto/novo}</td>
<td>Se a string terminar com &#8216;texto&#8217;, substitui &#8216;texto&#8217; por &#8216;novo&#8217;</td>
</tr>
</tbody>
</table>
<h3><a name="params">6. Parâmetros de linha de comando</a></h3>
<p>Assim como em outras linguagens, é possível passar parâmetros para scripts shell. Para isso, usam-se as variáveis $1, $2, &#8230; A variável $0 contém o comando chamado via linha de comando.</p>
<p>Exemplo:</p>
<p>Crie um arquivo &#8220;test.sh&#8221; com este conteúdo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'$0 = '</span><span style="color: #007800;">$0</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'$1 = '</span><span style="color: #007800;">$1</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'$2 = '</span><span style="color: #007800;">$2</span></pre></div></div>

<p>Veja as saídas das execuções abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ .<span style="color: #000000; font-weight: bold;">/</span>test.sh 
<span style="color: #007800;">$0</span> = .<span style="color: #000000; font-weight: bold;">/</span>test.sh
<span style="color: #007800;">$1</span> = 
<span style="color: #007800;">$2</span> = 
$ .<span style="color: #000000; font-weight: bold;">/</span>test.sh um
<span style="color: #007800;">$0</span> = .<span style="color: #000000; font-weight: bold;">/</span>test.sh
<span style="color: #007800;">$1</span> = um
<span style="color: #007800;">$2</span> = 
$ .<span style="color: #000000; font-weight: bold;">/</span>test.sh um dois
<span style="color: #007800;">$0</span> = .<span style="color: #000000; font-weight: bold;">/</span>test.sh
<span style="color: #007800;">$1</span> = um
<span style="color: #007800;">$2</span> = dois</pre></div></div>

<h3><a name="funcs">7. Definindo Funções</a></h3>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> nome_da_funcao<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Para chamar a função:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">nome_da_funcao
&nbsp;
<span style="color: #666666; font-style: italic;"># caso haja parâmetros</span>
nome_da_funcao param1 param2 ...</pre></div></div>

<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> imprime<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Sou a função '<span style="color: #007800;">${0}</span>'&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Param 1: <span style="color: #007800;">${1}</span>&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Param 2: <span style="color: #007800;">${2}</span>&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Lista de parâmetros: <span style="color: #007800;">${*}</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
imprime um dois tres quatro</pre></div></div>

<p>Da mesma forma como foram usados $0, $1 etc anteriormente, aqui essas variáveis são usadas para retornar os parâmetros da função. Logo, percebe-se que, dentro de funções, não é possível acessar parâmetros de script, a menos que eles sejam passados por parâmetro para a função.</p>
<h4><a name="return">7.1. Retorno de Funções</a></h4>
<p>Antes de tudo, é preciso diferenciar retorno de função e saída de função. Por exemplo, ao se executar o comando &#8220;cat /etc/passwd&#8221;, a saída é o conteúdo do arquivo; o retorno é 0 (ou outro valor, caso ocorra erro). O retorno de uma função shell é um valor inteiro, normalmente utilizado para definir o status da função, ou seja, se ocorreu algum erro ou e ela foi executada corretamente.</p>
<p>Para obter o valor de retorno de uma função, usa-se a variável &#8220;$?&#8221;. Ela exibe o retorno do último  comando executado. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$?</span></pre></div></div>

<p>Para retornar valor (status) numa função, usa-se o comando return.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> retorna<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;sou um valor&quot;</span>
    <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">42</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #007800;">valor</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span>retorna<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$?</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$valor</span></pre></div></div>

<p>Ao se executar a função, sua saída será &#8220;sou um valor&#8221;; seu retorno será 42.</p>
<p>Em shell, considera-se o valor 0 como execução bem sucedida. Qualquer outro valor representa erro. É por isso que recomenda-se que toda função <code>main</code> de um programa em C retorne o valor 0, desde que não ocorra algum erro.</p>
<h3><a name="er">8. Expressões Regulares em Bash</a></h3>
<p>Expressões regulares em shell podem ser usadas em comparações (if&#8217;s), por exemplo. Em if&#8217;s, usa-se o operador &#8220;=~&#8221; para realizar comparações usando ER&#8217;s:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">s</span>=<span style="color: #ff0000;">&quot;bash&quot;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$s</span>&quot;</span> =~ ^b <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'começa com b'</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<h3><a name="mathexp">9. Expressões Matemáticas</a></h3>
<p>O bash não trabalha com expressões matemáticas tão facilmente. Existe o comando &#8220;let&#8221;, que permite realizar expressões matemáticas, mas é mais comum se usar a sintaxe semelhante ao C, utilizando dois parênteses:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">a</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span> + <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
$ <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i++<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
$ <span style="color: #007800;">x</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>x<span style="color: #000000; font-weight: bold;">*</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
...</pre></div></div>

<h3><a name="bashrc">10. O Arquivo .bashrc</a></h3>
<p>Na home dos usuários (~), é comum haver o arquivo .bashrc (o ponto no início indica que o arquivo é oculto). Esse arquivo é sempre executado quando se abre um shell. Nele, constam diversas configurações, como definição de variáveis de ambientes, definição de aliases etc. Você pode editar esse arquivo (ou criá-lo, caso não exista):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">vim</span> ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p>É possível usar outros editores, não apenas o vim.</p>
<h3><a name="alias">11. Aliases (Apelidos)</a></h3>
<p>Algumas vezes usamos comandos que necessitam de várias opções e argumentos. Para amenizar o trabalho de digitarmos repetidamente estes comandos o bash oferece um recurso chamado alias com o qual podemos definir sinônimos ou &#8220;apelidos&#8221; para um comando. Um alias pode ser definido na linha de comando da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #000000; font-weight: bold;">&lt;</span>nome<span style="color: #000000; font-weight: bold;">&gt;</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>comando<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Observe que não pode haver espaços em branco antes ou depois do &#8220;=&#8221;.</p>
<p>Esta sintaxe indica que nome é um &#8220;alias&#8221; (apelido) para comando. Toda vez que digitarmos o comando &#8220;nome&#8221;, o bash o substituirá por &#8220;comando&#8221;.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">lf</span>=<span style="color: #ff0000;">'ls -F'</span></pre></div></div>

<p>Isso fará o shell executar &#8220;ls -F&#8221; toda vez que usarmos &#8220;lf&#8221; na linha de comando. Ou seja, o que o alias faz na verdade é substituir a palavra &#8220;lf&#8221; por &#8220;ls -F&#8221;. Observe neste exemplo, existe um espaço em branco entre ls e -F. Sempre que houver espaços em branco na definição de um campo, todo o campo deve ser digitado entre aspas simples (&#8216;) ou duplas (&#8220;).</p>
<p>É possível definir aliases em seu .bashrc, para que eles estejam sempre disponíveis na sua sessão.</p>
<h3><a name="refs">12. Referências</a></h3>
<p>Linux Básico:<br />
http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico/ ou http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico.pdf</p>
<p>Linux Avançado</p>
<p>http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxAvancado.pdf</p>
<p>Canivete Suiço do Shell (Bash)</p>
<p>http://aurelio.net/shell/canivete/</p>
<p>Livro Shell Script Profissional (Livro físico):</p>
<p>http://www.shellscript.com.br/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Curso de Shell Script: Módulo #0 &#8211; Comandos Básicos do Linux</title>
		<link>http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/</link>
		<comments>http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/#comments</comments>
		<pubDate>Fri, 06 May 2011 14:34:11 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[básicos]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[iniciante]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=443</guid>
		<description><![CDATA[Pretendo escrever uma série de posts sobre Shell Script, para ensinar e consolidar o que sei, além de aprender alguns detalhes a mais. Não adianta querer programar usando Shell sem conhecer os comandos básicos do Linux. Por isso o primeiro módulo do &#8220;curso&#8221; abordará os comandos básicos do Linux, que são fundamentais para a construção [...]]]></description>
			<content:encoded><![CDATA[<p>Pretendo escrever uma série de posts sobre Shell Script, para ensinar e consolidar o que sei, além de aprender alguns detalhes a mais.</p>
<p>Não adianta querer programar usando Shell sem conhecer os comandos básicos do Linux. Por isso o primeiro módulo do &#8220;curso&#8221; abordará os comandos básicos do Linux, que são fundamentais para a construção dos scripts.</p>
<p><span id="more-443"></span></p>
<p>Vamos analisar apenas alguns comandos, os mais conhecidos e usados, juntamente com algumas de suas opções. A maioria dos comandos permitem o uso de inúmeras opções, não sendo possível abordar todos elas neste texto.</p>
<p>Antes de iniciarmos, vale lembrar que os manuais de todos os comandos podem ser lidos usando o comando <code>man nome_do_comando</code>, por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">man</span> <span style="color: #7a0874; font-weight: bold;">echo</span></pre></div></div>

<p>A maioria dos comandos também têm a opção -h, ou &#8211;help, que lista os parâmetros aceitos pelo programa.</p>
<p>Os comandos estão ordenados alfabeticamente, sem levar em consideração relevância ou complexidade de utilização.</p>
<h3>Sumário</h3>
<p><a href="#cmd_awk">awk</a><br />
<a href="#cmd_cat">cat</a><br />
<a href="#cmd_cd">cd</a><br />
<a href="#cmd_chmod">chmod</a><br />
<a href="#cmd_cut">cut</a><br />
<a href="#cmd_date">date</a><br />
<a href="#cmd_diff">diff</a><br />
<a href="#cmd_echo">echo</a><br />
<a href="#cmd_find">find</a><br />
<a href="#cmd_grep">grep</a><br />
<a href="#cmd_head">head</a><br />
<a href="#cmd_kill">kill</a><br />
<a href="#cmd_ls">ls</a><br />
<a href="#cmd_printf">printf</a><br />
<a href="#cmd_rev">rev</a><br />
<a href="#cmd_scp">scp</a><br />
<a href="#cmd_sed">sed</a><br />
<a href="#cmd_seq">seq</a><br />
<a href="#cmd_sort">sort</a><br />
<a href="#cmd_ssh">ssh</a><br />
<a href="#cmd_tac">tac</a><br />
<a href="#cmd_tail">tail</a><br />
<a href="#cmd_top">top</a></p>
<h3><a name="cmd_awk">awk</a></h3>
<p>O AWK é uma linguagem de programação para processamento de textos. Ao lado do comando <a href="#cmd_sed">SED</a>, é capaz de realizar muitos truques.</p>
<p>Um post exclusivo sobre AWK pode ser visto aqui:</p>
<p><a href="http://www.rberaldo.com.br/blog/tutorial-awk" target="_blank">http://www.rberaldo.com.br/blog/tutorial-awk</a></p>
<h3><a name="cmd_cat">cat</a></h3>
<p>Exibe o conteúdo de um arquivo.</p>
<p>Opções:<br />
-n : numera as linhas</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">hostname</span> 
orion</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #660033;">-n</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">hostname</span> 
     <span style="color: #000000;">1</span>	orion</pre></div></div>

<h3><a name="cmd_cd">cd</a></h3>
<p>Muda o diretório de trabalho, ou seja, entra em um determinado diretório.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~</pre></div></div>

<h3><a name="cmd_chmod">chmod</a></h3>
<p>O chmod (<em>change mode</em>) muda as permissões de um arquivo ou diretório. O sistema de permissões em sistemas Unix-Like, como Linux ou Mac OS, é um dos pontos fortes desses sistemas. Porém, infelizmente, poucos usuários realmente sabem usá-lo.</p>
<p>Um post exclusivo ao chmod pode ser lido aqui:</p>
<p><a href="http://www.rberaldo.com.br/blog/chmod-permissoes-em-sistemas-linux-e-unix-like" target="_blank">http://www.rberaldo.com.br/blog/chmod-permissoes-em-sistemas-linux-e-unix-like</a></p>
<h3><a name="cmd_cut">cut</a></h3>
<p>Separa trechos ou campos de uma linha, por meio de um delimitador. Também trunca textos, exibindo apenas um número específico de caracteres.</p>
<p>Opções<br />
-d : define o delimitador<br />
-f : define o(s) campo(s) a ser(em) exibido(s)<br />
-c : número do caractere a ser exibido ou intervalo de caracteres</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;um:dois:tres:quatro&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> -d: <span style="color: #660033;">-f</span> <span style="color: #000000;">2</span>
dois</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;um:dois:tres:quatro&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> -d: <span style="color: #660033;">-f</span> <span style="color: #000000;">2</span>,<span style="color: #000000;">3</span>
dois:tres</pre></div></div>

<p>Também é possível definir intervalo de valores para a opção -f:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;um:dois:tres:quatro&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> -d: <span style="color: #660033;">-f</span> <span style="color: #000000;">1</span>-<span style="color: #000000;">3</span>
um:dois:tres</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;um:dois:tres:quatro&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> -d: <span style="color: #660033;">-f</span> <span style="color: #000000;">2</span>-
dois:tres:quatro</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;1234567890&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-c</span> <span style="color: #000000;">7</span>
<span style="color: #000000;">7</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;1234567890&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-c</span> <span style="color: #000000;">1</span>,<span style="color: #000000;">3</span>,<span style="color: #000000;">5</span>
<span style="color: #000000;">135</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">beraldo<span style="color: #000000; font-weight: bold;">@</span>orion:~$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;1234567890&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-c</span> <span style="color: #000000;">1</span>-<span style="color: #000000;">7</span>
<span style="color: #000000;">1234567</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;1234567890&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-c</span> <span style="color: #000000;">8</span>-
<span style="color: #000000;">890</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">beraldo<span style="color: #000000; font-weight: bold;">@</span>orion:~$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;1234567890&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-c</span> <span style="color: #660033;">-5</span>
<span style="color: #000000;">12345</span></pre></div></div>

<h3><a name="cmd_date">date</a></h3>
<p>Mostra a data atual ou uma data específica, com diversas opções para formatação da data.</p>
<p>Opções:<br />
-d : especifica a data (Ex: tomorrow, 5 days ago)<br />
+%? : define o padrão de formatação da data. A lista de opções pode ser lida no manual do comando (<code>man date</code>).</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">date</span>
Dom Mai  <span style="color: #000000;">1</span> <span style="color: #000000;">20</span>:05:<span style="color: #000000;">47</span> BRT <span style="color: #000000;">2011</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot;yesterday&quot;</span>
Sáb Abr <span style="color: #000000;">30</span> <span style="color: #000000;">20</span>:05:<span style="color: #000000;">59</span> BRT <span style="color: #000000;">2011</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot;2 days ago&quot;</span>
Sex Abr <span style="color: #000000;">29</span> <span style="color: #000000;">20</span>:06:<span style="color: #000000;">10</span> BRT <span style="color: #000000;">2011</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">beraldo<span style="color: #000000; font-weight: bold;">@</span>orion:~$ <span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot;2 days&quot;</span>
Ter Mai  <span style="color: #000000;">3</span> <span style="color: #000000;">20</span>:06:<span style="color: #000000;">13</span> BRT <span style="color: #000000;">2011</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #ff0000;">&quot;%d/%m/%Y&quot;</span>
01<span style="color: #000000; font-weight: bold;">/</span>05<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2011</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot;30 days&quot;</span> +<span style="color: #ff0000;">&quot;Daqui 30 dias será %d/%m/%Y&quot;</span>
Daqui <span style="color: #000000;">30</span> dias será <span style="color: #000000;">31</span><span style="color: #000000; font-weight: bold;">/</span>05<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2011</span></pre></div></div>

<h3><a name="cmd_diff">diff</a></h3>
<p>Exibe as diferenças entre dois arquivos.</p>
<p>Opções:<br />
-i : case-insensitive (indiferente a maiúsculas e minúsculas)<br />
-y : exibe as diferenças lado a lado<br />
-E : ignora diferenças no tamanho do TAB<br />
-B : ignora linhas vazias<br />
-b : ignora quantidade de espaços</p>
<p>Outros comandos semelhantes muito úteis: <code>vimdiff</code> e <code>diff3</code></p>
<p>O comando diff é muito útil para encontrar cópias de trabalhos de faculdade, por exemplo. :P</p>
<h3><a name="cmd_echo">echo</a></h3>
<p>Exibe um texto na saída padrão.</p>
<p>Opções:<br />
-n : não pula linha no final do texto<br />
-e : interpreta caracteres de escape</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;sou <span style="color: #000099; font-weight: bold;">\n</span> um <span style="color: #000099; font-weight: bold;">\n</span> texto&quot;</span>
sou \n um \n texto</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;sou <span style="color: #000099; font-weight: bold;">\n</span> um <span style="color: #000099; font-weight: bold;">\n</span> texto&quot;</span>
sou 
 um 
 texto</pre></div></div>

<h3><a name="cmd_find">find</a></h3>
<p>Localiza arquivos no sistema de arquivos.</p>
<p>Esse comando possui diversas opções e truques. Por isso, merece um post específico para ele. Um post muito bom sobre o find pode ser encontrado aqui:</p>
<p><a href="http://gerencievocemesmo.com.br/site/?p=56" target="_blank" onclick="urchinTracker('/outgoing/gerencievocemesmo.com.br/site/?p=56&amp;referer=');">http://gerencievocemesmo.com.br/site/?p=56</a></p>
<h3><a name="cmd_grep">grep</a></h3>
<p>Localiza padrões dentro de um ou mais arquivos. A busca é feita usando Expressões Regulares.</p>
<p>Opções:<br />
-i : case-insensitive<br />
-v : inverte o critério de busca<br />
-r : recursivo, busca em subdiretórios também<br />
-n : mostra, também, o número da linha<br />
-c : conta o número de linhas que casaram com o padrão<br />
-l : exibe só o nome do arquivo onde o padrão foi encontrado<br />
-A N : mostra N linhas após a linha onde o padrão foi encontrado<br />
-B N : mostra N linhas antes da linha onde o padrão foi encontrado<br />
-C N : mostra N linhas antes e depois da linha onde o padrão foi encontrado</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">10</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-A2</span> <span style="color: #660033;">-B3</span> <span style="color: #ff0000;">&quot;5&quot;</span>
<span style="color: #000000;">2</span>
<span style="color: #000000;">3</span>
<span style="color: #000000;">4</span>
<span style="color: #000000;">5</span>
<span style="color: #000000;">6</span>
<span style="color: #000000;">7</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;olá<span style="color: #000099; font-weight: bold;">\n</span>sou<span style="color: #000099; font-weight: bold;">\n</span>1<span style="color: #000099; font-weight: bold;">\n</span>teste<span style="color: #000099; font-weight: bold;">\n</span>para<span style="color: #000099; font-weight: bold;">\n</span>grep&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;^[a-z]&quot;</span>
olá
sou
teste
para
<span style="color: #c20cb9; font-weight: bold;">grep</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;olá<span style="color: #000099; font-weight: bold;">\n</span>sou<span style="color: #000099; font-weight: bold;">\n</span>1<span style="color: #000099; font-weight: bold;">\n</span>teste<span style="color: #000099; font-weight: bold;">\n</span>para<span style="color: #000099; font-weight: bold;">\n</span>grep&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">&quot;^[a-z]&quot;</span>
<span style="color: #000000;">1</span></pre></div></div>

<p>Para usar todos os recursos das Expressões Regulares, use <code>egrep</code> em vez de <code>grep</code>, o que permite usar grupos, quantificadores &#8220;+&#8221; e &#8220;{quantificador}&#8221;. </p>
<h3><a name="cmd_head">head</a></h3>
<p>Mostra o início de um arquivo. O limite pode ser estabelecido em número de linhas ou caracteres. É o inverso do comando <code>tail</code>.</p>
<p>Opções:<br />
-n N : exibe as N primeiras linhas<br />
-c N : exibe os N primeiros caracteres</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;olá, sou<span style="color: #000099; font-weight: bold;">\n</span>um teste<span style="color: #000099; font-weight: bold;">\n</span>para o<span style="color: #000099; font-weight: bold;">\n</span>comando head&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-n</span> <span style="color: #000000;">2</span>
olá, sou
um teste</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;ola, sou<span style="color: #000099; font-weight: bold;">\n</span>um teste<span style="color: #000099; font-weight: bold;">\n</span>para o<span style="color: #000099; font-weight: bold;">\n</span>comando head&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-c</span> <span style="color: #000000;">7</span>
ola, so</pre></div></div>

<h3><a name="cmd_kill">kill</a></h3>
<p>O comando kill &#8220;mata&#8221; processos, ou seja, encerra, ou força o encerramento, de um programa.</p>
<p>Opções:<br />
-9 : força o encerramento da execução de um processo<br />
-1 : mata todos os processos que o usuário pode matar</p>
<p>Exemplos:</p>
<p>Força o encerramento do processo 1234:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-9</span> <span style="color: #000000;">1234</span></pre></div></div>

<p>Encerra a sessão do usuário, ou seja, força o encerramento de todos os seus processos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-1</span> <span style="color: #660033;">-9</span></pre></div></div>

<p>Os IDs dos processos (PID &#8211; Process ID) podem ser encontrados usando o comando ps, que é o gerenciador de processos. Com as opções &#8220;ux&#8221;, listam-se os processos do usuário. Com grep podemos filtrar a saída pelo processo desejado:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ps</span> ux <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> skype
beraldo   <span style="color: #000000;">2267</span>  <span style="color: #000000;">1.0</span>  <span style="color: #000000;">2.0</span> <span style="color: #000000;">281508</span> <span style="color: #000000;">82968</span> ?        Sl   09:<span style="color: #000000;">58</span>   <span style="color: #000000;">0</span>:<span style="color: #000000;">41</span> skype
beraldo   <span style="color: #000000;">5672</span>  <span style="color: #000000;">0.0</span>  <span style="color: #000000;">0.0</span>  <span style="color: #000000;">10128</span>   <span style="color: #000000;">848</span> pts<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">0</span>    S+   <span style="color: #000000;">11</span>:04   <span style="color: #000000;">0</span>:00 <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">--color</span>=auto skype</pre></div></div>

<p>O skype é o processo 2267. Para forçar seu encerramento, fazemos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-9</span> <span style="color: #000000;">2267</span></pre></div></div>

<p>Como lição de casa, vale ler os manuais dos comandos killall e pkill. :)</p>
<h3><a name="cmd_ls">ls</a></h3>
<p>Lista o conteúdo de um diretório.</p>
<p>Opções:<br />
-a : lista arquivos e diretórios ocultos<br />
-l : mostra diversos atributos dos arquivos e diretórios, como data de criação, dono, permissões etc<br />
-R : lista o conteúdo recursivamente</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-a</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-la</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-laR</span></pre></div></div>

<h3><a name="cmd_printf">printf</a></h3>
<p>Exibe um texto na tela, com várias opções de formatação, semelhante à função <code>printf()</code>, da linguagem C.</p>
<p>As opções de formatação são praticamente as mesmas da linguagem C. A lista completa pode ser vista no manual (<code>man printf</code>).</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%x<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">15</span>
f</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%o<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">7</span>
<span style="color: #000000;">7</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%o<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">8</span>
<span style="color: #000000;">10</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%05d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">70</span>
00070</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;%.2f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000;">70</span>
<span style="color: #000000;">70</span>,00</pre></div></div>

<h3><a name="cmd_rev">rev</a></h3>
<p>Esse comando inverte uma string.</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;texto&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">rev</span>
otxet</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;duh&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">rev</span>
hud</pre></div></div>

<h3><a name="cmd_scp">scp</a></h3>
<p>Copia arquivos e diretórios via <a href="#cmd_ssh">ssh</a>, ou seja, cópia segura entre máquinas remotas.</p>
<p>Opções:<br />
-r : cópia recursiva</p>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">scp</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>opções<span style="color: #7a0874; font-weight: bold;">&#93;</span> maquina:origem destino
$ <span style="color: #c20cb9; font-weight: bold;">scp</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>opções<span style="color: #7a0874; font-weight: bold;">&#93;</span> origem maquina:destino</pre></div></div>

<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">scp</span> 192.168.0.100:~<span style="color: #000000; font-weight: bold;">/</span>arquivo.txt .</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">scp</span> arquivo.txt 192.168.0.102:~</pre></div></div>

<h3><a name="cmd_sed">sed</a></h3>
<p>Linguagem para edição de arquivos e textos. Veja um post exclusivo a ela aqui:</p>
<p><a href="http://www.rberaldo.com.br/blog/o-comando-sed-do-linux/">http://www.rberaldo.com.br/blog/o-comando-sed-do-linux/</a></p>
<h3><a name="cmd_seq">seq</a></h3>
<p>Exibe uma sequência de números.</p>
<p>Opções:<br />
-s : separador (padrão &#8220;\n&#8221;)<br />
-f : formato (padrão &#8220;%g&#8221;)</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">3</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">2</span>
<span style="color: #000000;">3</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">3</span> <span style="color: #000000;">5</span>
<span style="color: #000000;">3</span>
<span style="color: #000000;">4</span>
<span style="color: #000000;">5</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">3</span> <span style="color: #000000;">2</span> <span style="color: #000000;">10</span>
<span style="color: #000000;">3</span>
<span style="color: #000000;">5</span>
<span style="color: #000000;">7</span>
<span style="color: #000000;">9</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">10</span> <span style="color: #660033;">-2</span> <span style="color: #000000;">0</span>
<span style="color: #000000;">10</span>
<span style="color: #000000;">8</span>
<span style="color: #000000;">6</span>
<span style="color: #000000;">4</span>
<span style="color: #000000;">2</span>
<span style="color: #000000;">0</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">seq</span> -s, <span style="color: #000000;">10</span> <span style="color: #660033;">-2</span> <span style="color: #000000;">0</span>
<span style="color: #000000;">10</span>,<span style="color: #000000;">8</span>,<span style="color: #000000;">6</span>,<span style="color: #000000;">4</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">0</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">seq</span> -s, <span style="color: #660033;">-f</span><span style="color: #ff0000;">&quot;%04g&quot;</span> <span style="color: #000000;">10</span> <span style="color: #660033;">-2</span> <span style="color: #000000;">0</span>
0010,0008,0006,0004,0002,0000</pre></div></div>

<h3><a name="cmd_sort">sort</a></h3>
<p>Ordena linhas de um texto, alfabética ou numericamente.</p>
<p>Opções:<br />
-n : ordena numericamente<br />
-r : ordena inversamente (de Z para A e de 9 para 1)<br />
-f : case-insensitive<br />
-k N : ordena pela coluna N do texto<br />
-t : separador de coluna para a opção -k (padrão TAB)<br />
-o : define um arquivo para a saída do comando</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;um<span style="color: #000099; font-weight: bold;">\n</span>dois<span style="color: #000099; font-weight: bold;">\n</span>tres<span style="color: #000099; font-weight: bold;">\n</span>quatro&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span>
dois
quatro
tres
um</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;um<span style="color: #000099; font-weight: bold;">\t</span>dois<span style="color: #000099; font-weight: bold;">\n</span>tres<span style="color: #000099; font-weight: bold;">\t</span>quatro&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-k</span> <span style="color: #000000;">2</span>
um	dois
tres	quatro</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;um<span style="color: #000099; font-weight: bold;">\t</span>dois<span style="color: #000099; font-weight: bold;">\n</span>tres<span style="color: #000099; font-weight: bold;">\t</span>quatro&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-k</span> <span style="color: #000000;">2</span> <span style="color: #660033;">-r</span>
tres	quatro
um	dois</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;1<span style="color: #000099; font-weight: bold;">\n</span>10<span style="color: #000099; font-weight: bold;">\n</span>100<span style="color: #000099; font-weight: bold;">\n</span>2<span style="color: #000099; font-weight: bold;">\n</span>20<span style="color: #000099; font-weight: bold;">\n</span>200&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> 
<span style="color: #000000;">1</span>
<span style="color: #000000;">10</span>
<span style="color: #000000;">100</span>
<span style="color: #000000;">2</span>
<span style="color: #000000;">20</span>
<span style="color: #000000;">200</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;1<span style="color: #000099; font-weight: bold;">\n</span>10<span style="color: #000099; font-weight: bold;">\n</span>100<span style="color: #000099; font-weight: bold;">\n</span>2<span style="color: #000099; font-weight: bold;">\n</span>20<span style="color: #000099; font-weight: bold;">\n</span>200&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-n</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">2</span>
<span style="color: #000000;">10</span>
<span style="color: #000000;">20</span>
<span style="color: #000000;">100</span>
<span style="color: #000000;">200</span></pre></div></div>

<h3><a name="cmd_ssh">ssh</a></h3>
<p>O SSH (Secure Shell) realiza acesso remoto a outras máquinas Linux. Um post exclusivo a SSH pode ser lido aqui:</p>
<p><a href="http://www.rberaldo.com.br/blog/usando-o-ssh" target="_blank">http://www.rberaldo.com.br/blog/usando-o-ssh</a></p>
<h3><a name="cmd_tac">tac</a></h3>
<p>Inverso do comando <code>cat</code>. Exibe o conteúdo de um arquivo do fim para o início.</p>
<h3><a name="cmd_tail">tail</a></h3>
<p>Exibe o fim de um texto, exatamente o oposto do comando <code>head</code></p>
<p>Opções:<br />
-n N : número de linhas a exibir<br />
-c N : número de caracteres a exibir</p>
<p>Exemplos semelhantes ao do comando <code><a href="#cmd_head">head</a></code>.</p>
<h3><a name="cmd_top">top</a></h3>
<p>O comando top exibe os processos atualmente em execução. É semelhante ao ps, citado na seção do comando <a href="#cmd_kill">kill</a>, mas atualiza-se automaticamente, além de possuir várias opções de ordenação.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ top</pre></div></div>

<p>O comando &#8220;htop&#8221; é mais completo e <em>user-friendly</em>, mas normalmente não vem instalado nas distros Linux. É possível instalá-lo via gerenciador de pacotes. Por exemplo, em sistemas baseados em Debian:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># apt-get install htop</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Servidor WEB Simples em Python</title>
		<link>http://www.rberaldo.com.br/blog/servidor-web-simples-em-python/</link>
		<comments>http://www.rberaldo.com.br/blog/servidor-web-simples-em-python/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 17:56:19 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[monothread]]></category>
		<category><![CDATA[multithread]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[simples]]></category>
		<category><![CDATA[thread]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=445</guid>
		<description><![CDATA[Algumas vezes pode ser necessário implementar um servidor WEB simples, para uso pessoal, em pequenas aplicações ou em máquinas com poucos recursos. Em situações assim, Apache ou Tomcat são exageradamente pesados e desnecessários. O Python possui bibliotecas para implementação de servidores WEB simples. Há versão de apenas uma thread (atende uma requisição por vez) ou [...]]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes pode ser necessário implementar um servidor WEB simples, para uso pessoal, em pequenas aplicações ou em máquinas com poucos recursos. Em situações assim, Apache ou Tomcat são exageradamente pesados e desnecessários.</p>
<p>O Python possui bibliotecas para implementação de servidores WEB simples. Há versão de apenas uma thread (atende uma requisição por vez) ou multi-thread (atende diversas requisições simultaneamente).</p>
<p><span id="more-445"></span></p>
<p>Os exemplos abaixo apenas enviam al cliente uma mensagem &#8220;INICIO&#8221;, esperam 2 segundos, e enviam outra mensagem, &#8220;FIM&#8221;. A espera por 2 segundos será útil apenas para enfatizar a diferença entre as versões monothread e multi-thread.</p>
<p>Os códigos funcionam em qualquer Sistema Operacional com Python instalado, mas os exemplos de execução que mostrarei são voltados para Linux ou Mac OS, onde há um terminal com suporte a bash e curl. Porém, nada impede que os testes sejam feitos em navegadores.</p>
<p>Versão simples, com apenas uma thread, ou seja, atende apenas uma requisição por vez:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># coding: utf-8</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">BaseHTTPServer</span> <span style="color: #ff7700;font-weight:bold;">import</span> BaseHTTPRequestHandler
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urlparse</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Porta onde o servidor rodará</span>
PORT = <span style="color: #ff4500;">8888</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> GetHandler<span style="color: black;">&#40;</span>BaseHTTPRequestHandler<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> do_GET<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">send_response</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">end_headers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;INICIO<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span> <span style="color: #ff4500;">2</span> <span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;FIM<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">BaseHTTPServer</span> <span style="color: #ff7700;font-weight:bold;">import</span> HTTPServer
    server = HTTPServer<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'localhost'</span>, PORT<span style="color: black;">&#41;</span>, GetHandler<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Starting server, use &lt;Ctrl-C&gt; to stop'</span>
    server.<span style="color: black;">serve_forever</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Para executar:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ python monothread.py</pre></div></div>

<p>Ou, caso você dê permissão de execução ao script:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ .<span style="color: #000000; font-weight: bold;">/</span>monothread.py</pre></div></div>

<p>Para enviar solicitações ao servidor, sugiro este comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> i = <span style="color: #000000;">0</span>; i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000;">5</span>; i++ <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> ; <span style="color: #000000; font-weight: bold;">do</span> curl http:<span style="color: #000000; font-weight: bold;">//</span>localhost:<span style="color: #000000;">8888</span> <span style="color: #000000; font-weight: bold;">&amp;</span> <span style="color: #000000; font-weight: bold;">done</span>;</pre></div></div>

<p>Você verá que cada requisição será atendida de cada vez. Ou seja, ao terminar a requisição 1, inicia-se o atendimento à requisição 2, mesmo que todas as 5 requisições tenham sido feitas &#8220;ao mesmo tempo&#8221; (note o &#038; indicando que o cURL rodará em background).<br />
Você verá que cada par &#8220;INICIO&#8221; e &#8220;FIM&#8221; aparecerão sequencialmente, mostrando que cada requisição é atendida individualmente.</p>
<p>Versão multi-thread, ou seja, atende várias requisições simultaneamente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># coding: utf-8</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">BaseHTTPServer</span> <span style="color: #ff7700;font-weight:bold;">import</span> HTTPServer, BaseHTTPRequestHandler
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">SocketServer</span> <span style="color: #ff7700;font-weight:bold;">import</span> ThreadingMixIn
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Porta onde o servidor rodará</span>
PORT = <span style="color: #ff4500;">8888</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Handler<span style="color: black;">&#40;</span>BaseHTTPRequestHandler<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> do_GET<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">send_response</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">end_headers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'INICIO<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span> <span style="color: #ff4500;">2</span> <span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'FIM!<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ThreadedHTTPServer<span style="color: black;">&#40;</span>ThreadingMixIn, HTTPServer<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Handle requests in a separate thread.&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    server = ThreadedHTTPServer<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'localhost'</span>, PORT<span style="color: black;">&#41;</span>, Handler<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Starting server, use &lt;Ctrl-C&gt; to stop'</span>
    server.<span style="color: black;">serve_forever</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>O procedimento para execução é o mesmo do anterior. Para testar, vamos usar o mesmo loop de requisições:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> i = <span style="color: #000000;">0</span>; i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000;">5</span>; i++ <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> ; <span style="color: #000000; font-weight: bold;">do</span> curl http:<span style="color: #000000; font-weight: bold;">//</span>localhost:<span style="color: #000000;">8888</span> <span style="color: #000000; font-weight: bold;">&amp;</span> <span style="color: #000000; font-weight: bold;">done</span>;</pre></div></div>

<p>Dessa vez, todas as requisições serão atendidas ao mesmo tempo. A palavra &#8220;INICIO&#8221; aparecerá 5 vezes de uma só vez, e os logs de requisição do servidor aparecerão os 5 de uma só vez.</p>
<p>Os códigos acima foram adaptados deste link:<br />
<a href="http://blog.doughellmann.com/2007/12/pymotw-basehttpserver.html" target="_blank" onclick="urchinTracker('/outgoing/blog.doughellmann.com/2007/12/pymotw-basehttpserver.html?referer=');">http://blog.doughellmann.com/2007/12/pymotw-basehttpserver.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/servidor-web-simples-em-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A extensão MySQLi do PHP</title>
		<link>http://www.rberaldo.com.br/blog/a-extensao-mysqli-do-php/</link>
		<comments>http://www.rberaldo.com.br/blog/a-extensao-mysqli-do-php/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 13:57:02 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[banco]]></category>
		<category><![CDATA[base]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[mysqli]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=431</guid>
		<description><![CDATA[O PHP possui a extensão MySQL nativamente desde o PHP 4. No PHP 5 foi adicionada a extensão MySQLi, que é uma versão mais completa e recente da antiga extensão MySQL. Além disso, a extensão MySQLi é totalmente orientada e objetos. Essa nova extensão também viabiliza o uso de novos recursos do MySQL, como Stored [...]]]></description>
			<content:encoded><![CDATA[<p>O PHP possui a extensão MySQL nativamente desde o PHP 4. No PHP 5 foi adicionada a extensão MySQLi, que é uma versão mais completa e recente da antiga extensão MySQL. Além disso, a extensão MySQLi é totalmente orientada e objetos. Essa nova extensão também viabiliza o uso de novos recursos do MySQL, como Stored Procedures ou Views.</p>
<p>A extensão MySQLi necessita do servidor MySQL 4.1 ou superior.</p>
<p>Vale lembrar que há boatos de que a extensão MySQL deixe de existir no PHP 6. Logo, seja isso verdade ou não, é preferível usar MySQLi.</p>
<p>Vou mostrar aqui a forma de se trabalhar com a extensão MySQLi.</p>
<p><span id="more-431"></span></p>
<p>Para realizar a conexão com a base de dados, basta isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$MySQLi</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'servidor'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'usuario'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'senha'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'nome_da_db'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$MySQLi</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'passwd'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Se a conexão for bem sucedida, $MySQLi será um objeto, que será usado para consultas posteriores e outras ações com a base de dados.</p>
<p>Para realizar uma consulta, por exemplo, basta usar o método query() e percorrer com fetch_assoc(), muito semelhante ao que se faz usando a extensão mysql:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$exec</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$MySQLi</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'select dados from tabela'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$f</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$exec</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$f</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A lista completa de propriedades e métodos da classe MySQLi pode ser encontrada no link abaixo:</p>
<p><a href="http://php.net/manual/pt_BR/book.mysqli.php" target="_blank" onclick="urchinTracker('/outgoing/php.net/manual/pt_BR/book.mysqli.php?referer=');">http://php.net/manual/pt_BR/book.mysqli.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/a-extensao-mysqli-do-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Inserindo Múltiplos Registros em Tabela de Banco de Dados</title>
		<link>http://www.rberaldo.com.br/blog/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/</link>
		<comments>http://www.rberaldo.com.br/blog/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 13:00:35 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[banco]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[inserir]]></category>
		<category><![CDATA[insert]]></category>
		<category><![CDATA[linhas]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[múltiplas]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[registros]]></category>
		<category><![CDATA[simultaneamente]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=397</guid>
		<description><![CDATA[Como inserir diversos registros simultaneamente em uma tabela de banco de dados]]></description>
			<content:encoded><![CDATA[<p>Muitos programadores costumam executar vários comandos INSERT quando pretendem inserir informações em uma tabela de banco de dados. Porém, quando os dados serão salvos na mesma tabela, não é necessário executar diversos comandos INSERT; apenas um é suficiente.</p>
<p>Por exemplo: em vez de executar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela<span style="color: #66cc66;">&#40;</span>numero<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela<span style="color: #66cc66;">&#40;</span>numero<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">...</span></pre></div></div>

<p>Poderíamos executar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela<span style="color: #66cc66;">&#40;</span>numero<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Vou mostrar uma maneira simples de se fazer isso dinamicamente, com quantidade indeterminada informações, que podem vir de qualquer tipo de fonte de dados.</p>
<p><span id="more-397"></span></p>
<p>Vamos considerar um array com números inteiros, de 1 a 10:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valores</span> <span style="color: #339933;">=</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para inserir isso num banco de dados, muitos fariam isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valores</span> <span style="color: #339933;">=</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$valores</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$DB</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'INSERT INTO tabela(numero) VALUES('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$valores</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Isso funciona. Mas é lento e sobrecarrega o servidor. Imaginem um array com 100 mil valores.</p>
<p>O correto é gerar a string SQL com todos os valores a serem inseridos, separados por vírgula, de forma a executar a consulta apenas uma vez.  Logo, podemos fazer isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valores</span> <span style="color: #339933;">=</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'INSERT INTO tabela(numero) VALUES (%s)'</span><span style="color: #339933;">,</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'), ('</span> <span style="color: #339933;">,</span> <span style="color: #000088;">$valores</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$DB</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sql</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Se dermos um echo em $sql, teremos como saída:</p>
<pre>
INSERT INTO tabela(numero) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
</pre>
<p>Dessa forma só se executa a SQL uma vez, tornando a execução bem mais rápida.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Arquivos .ini: processando arquivos de configuração com PHP</title>
		<link>http://www.rberaldo.com.br/blog/arquivos-ini-processando-arquivos-de-configuracao-com-php/</link>
		<comments>http://www.rberaldo.com.br/blog/arquivos-ini-processando-arquivos-de-configuracao-com-php/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 19:27:04 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[arquivo]]></category>
		<category><![CDATA[configuração]]></category>
		<category><![CDATA[ini]]></category>
		<category><![CDATA[inicialização]]></category>
		<category><![CDATA[parse_ini_file]]></category>
		<category><![CDATA[processamento]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=393</guid>
		<description><![CDATA[Processamento de arquivos INI usando PHP e a função nativa parse_ini_file]]></description>
			<content:encoded><![CDATA[<p>Um formato de arquivo muito usado para armazenar diretrizes de configuração são os <a href="http://pt.wikipedia.org/wiki/INI_(formato_de_arquivo)" target="_blank" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/INI_formato_de_arquivo?referer=');">Arquivos .INI</a>, muito comum em plataformas Windows.</p>
<p>Normalmente são usados em sistemas desktop, mas é possível usá-lo para qualqquer tipo de aplicação. O PHP possui uma função nativa destinada ao processamento desse tipo de arquivo.</p>
<p><span id="more-393"></span></p>
<p>Antes de tudo, é bom entender a formatação de um arquivo INI. O <a href="http://pt.wikipedia.org/wiki/INI_(formato_de_arquivo)" target="_blank" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/INI_formato_de_arquivo?referer=');">artigo sobre arquivos INI da Wikipedia</a> explica muito bem essa formatação. Além disso, se você está lendo este post é porque tem familiaridade com o PHP e, consequentemente, com o arquivo <code>php.ini</code>, o arquivo de configuração do PHP, que é um arquivo INI.</p>
<p>Vamos considerar o arquivo INI abaixo, nomeado como <code>config.ini</code>.</p>
<pre>
; comentário da seção 1
[section 1]
config1 = "valor 1"

; comentário da seção 2
[section 2]
config2 = "valor 2"
</pre>
<p>Usaremos a função <a href="http://php.net/manual/en/function.parse-ini-file.php" target="_blank" onclick="urchinTracker('/outgoing/php.net/manual/en/function.parse-ini-file.php?referer=');"><code>parse_ini_file</code></a>, do PHP, para processarmos esse arquivo.</p>
<p>O protótipo da função é:</p>
<p><strong>array</strong> parse_ini_file ( string $filename [, bool $process_sections = false]);</p>
<p>O primeiro parâmetro é o nome  do arquivo a ser processado. O segundo, opcional, define se devem ser processadas as seções dos arquivos. O padrão é <strong>false</strong>. Caso passe-se o valor <strong>true</strong>, o array de retorno será multidimensional, sendo cada dimensão correspondente a cada seção do arquivo .ini.</p>
<p>Isso ficará mais claro ao rodarmos este script:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #990000;">parse_ini_file</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'config.ini'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$config</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$configWithSections</span> <span style="color: #339933;">=</span> <span style="color: #990000;">parse_ini_file</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'config.ini'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$configWithSections</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>A saída é:</p>
<pre>
Array
(
    [config1] => valor 1
    [config2] => valor 2
)
Array
(
    [section 1] => Array
        (
            [config1] => valor 1
        )

    [section 2] => Array
        (
            [config2] => valor 2
        )

)
</pre>
<p>O primeiro <code>print_r</code> exibe o array unidimensional, com todas as seções numa única dimensão do array. O segundo <code>print_r</code> exibe o array multidimensional, resultante do processamento que leva em conta as seções do arquivo .ini.</p>
<p>Com isso fica simples criar arquivos de inicialização que buscam configurações básicas em arquivos .ini.</p>
<p>Porém, tome cuidado ao usar arquivos .ini com informações sensíveis, como configurações de acesso a bancos de dados. Arquivos .ini podem ser acessados via URL, sendo possível visualizar seu conteúdo pelo navegador. Logo, opte por manter um arquivo ini fora do diretório público de sua aplicação (geralmente o <code>public_html</code>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/arquivos-ini-processando-arquivos-de-configuracao-com-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>As Mensagens de Erros Mais Comuns do PHP</title>
		<link>http://www.rberaldo.com.br/blog/as-mensagens-de-erros-mais-comuns-do-php/</link>
		<comments>http://www.rberaldo.com.br/blog/as-mensagens-de-erros-mais-comuns-do-php/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 13:00:23 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[comum]]></category>
		<category><![CDATA[erro]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[fatal]]></category>
		<category><![CDATA[mensagem]]></category>
		<category><![CDATA[message]]></category>
		<category><![CDATA[parse]]></category>
		<category><![CDATA[syntax]]></category>
		<category><![CDATA[undefined]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=351</guid>
		<description><![CDATA[Artigo mostrando as mensagens de erros ais comuns do PHP, com suas principais causas e soluções]]></description>
			<content:encoded><![CDATA[<p>As linguagens de programação geram mensagens de erros e <em>warnings</em>, que sempre informam o problema presente no código-fonte &#8211; quem conhece o <em><strong>Segmentation Fault</strong></em> do C/C++ pode querer discordar de mim :P -, de forma que a initerpretação correta dessas mensagens frequentemente indicam a forma adeequada de corrigir o problema.</p>
<p>Porém, poucos programadores iniciantes analisam essas mensagens, seja por falta de conhecimento ou preguiça mesmo. Ou até medo&#8230;</p>
<p>Vou mostrar aqui as mensagens de erro mais frequentes do PHP, junto com suas principais causas e soluções.</p>
<p><span id="more-351"></span></p>
<h3>Sumário</h3>
<p><a href="#enable_errors">Habilitando todas as mensagens de erro</a><br />
<a href="#err_op">Retirar o Operador de Controle de Erros</a><br />
<a href="#parse_error">Parse Error</a><br />
<a href="#undef_index">Undefined Index</a><br />
<a href="#undef_var">Undefined Variable</a><br />
<a href="#header">Cannot modify header information</a><br />
<a href="#undef_func">Call to undefined function</a><br />
<a href="#class_notfound">Class not found</a><br />
<a href="#undef_method">Call to undefined method</a><br />
<a href="#call_member_func">Call to a member function on a non-object</a><br />
<a href="#mysql_result_resource">supplied argument is not a valid MySQL result resource</a><br />
<a href="#foreach">Invalid argument supplied for foreach()</a><br />
<a href="#conclusao">Conclusão</a></p>
<p><a name="enable_errors"><br />
<h3>Habilitando todas as mensagens de erro</h3>
<p></a></p>
<p>Antes de tudo, é bom saber que o PHP é muito personalizável &#8211; o que às vezes pode ser um problema. É possível desabilitar todas as mensagens de erro, ou limitar somente a alguns níveis de erro. Não vou explicar os níveis de erro do PHP, pois não é o foco do texto. Porém deixarei links para referência.</p>
<p>Para habilitar todas as mensagens de erro do PHP, basta inserir este trecho no início do script:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'display_errors'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">E_ALL</span> <span style="color: #339933;">|</span> <span style="color: #009900; font-weight: bold;">E_STRICT</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><a href="http://php.net/manual/en/function.ini-set.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.ini-set.php?referer=');">Documentação da função ini_set</a><br />
<a href="http://php.net/manual/en/function.error-reporting.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.error-reporting.php?referer=');">Documentação da função error_reporting</a><br />
<a href="http://php.net/manual/en/ref.errorfunc.php" onclick="urchinTracker('/outgoing/php.net/manual/en/ref.errorfunc.php?referer=');">Funções para manipulação de erros</a><br />
<a href="http://www.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting" onclick="urchinTracker('/outgoing/www.php.net/manual/en/errorfunc.configuration.php_ini.error-reporting?referer=');">Descrição da diretiva <em>error_reporting</em> do php.ini</a><br />
<a href="http://www.php.net/manual/en/errorfunc.configuration.php#ini.display-errors" onclick="urchinTracker('/outgoing/www.php.net/manual/en/errorfunc.configuration.php_ini.display-errors?referer=');">Descrição da diretiva <em>display_errors</em> do php.ini</a></p>
<p><a name="err_op"><br />
<h3>Retirar o Operador de Controle de Erros</h3>
<p></a></p>
<p>Outro ponto a ser observado é que é possível omitir erros no pHP usando o Operador de Controle de Erros, o famoso arroba (@). Esse operador existe para ser usado, mas use-o com cautela, quando for realmente necessário.</p>
<p><a href="http://www.rberaldo.com.br/blog/2009/05/05/boas-praticas-ao-programar-2/#arroba">Entenda quando usar o Operador de Controle de Erros (arroba &#8211; @)</a><br />
<a href="http://php.net/manual/en/language.operators.errorcontrol.php" onclick="urchinTracker('/outgoing/php.net/manual/en/language.operators.errorcontrol.php?referer=');">Documentação do Operador de Controle de Erros</a></p>
<p><a name="parse_error"><br />
<h3>Parse Error</h3>
<p></a></p>
<p><em>Parse Errors</em> ocorrem quando seu código possui erros de formatação, como caractere faltando ou em excesso.</p>
<p>Por exemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">phpinfo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Retornará o erro:</p>
<pre>
Parse error:  syntax error, unexpected ')' in teste.php on line 2
</pre>
<p>A correção é sempre muito simples: analisar a linha onde o erro ocorre e procurar o acarctere indicado pelo erro. Pode estar faltando algo ou sobrando alguma coisa. Note que o erro pode não estra na linha indicada pela mensagem de erro. Pode estar na anterior. Por exemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'oi'</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'oi de novo'</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Mensagem de erro:</p>
<pre>
Parse error:  syntax error, unexpected T_ECHO, expecting ',' or ';' in teste.php on line 3
</pre>
<p>A mensagem diz que há erro na linha 3, mas é a linha 2 que gera problema, devido à falta do ponto-e-vírgula no final do <strong>echo</strong>. </p>
<p><a name="undef_index"><br />
<h3>Undefined Index</h3>
<p></a></p>
<p>Esse erro ocorre quando tenta-se acessar um índice inexistente de um array. Esse erro é muito comum com iniciantes usando Query String. O famoso exemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$pag</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pag'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Se não existe a variável &#8220;pag&#8221; na URL, dará este erro:</p>
<pre>
PHP Notice:  Undefined index: pag in teste.php on line 2
</pre>
<p>Para evitar esse erro, sempre verifique se o índice existe. A função <a href="http://php.net/manual/en/function.isset.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.isset.php?referer=');">isset</a> resolve facilmente esse problema:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pag'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$pag</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pag'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$pag</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'valor padrão'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>O código pode ser reescrito sda seguinte forma, usando o Operador Condicional Ternário:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$pag</span> <span style="color: #339933;">=</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pag'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pag'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'valor_padrao'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Mais sobre o Operador Ternário aqui:<br />
<a href="http://www.php.net/manual/pt_BR/language.operators.comparison.php" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/language.operators.comparison.php?referer=');">http://www.php.net/manual/pt_BR/language.operators.comparison.php</a></p>
<p><a name="undef_var"><br />
<h3>Undefined Variable</h3>
<p></a></p>
<p>Como o erro mostra claramente, isso ocorre quando se tenta usar uma variável não declarada (ou definida, no caso do PHP).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$var</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Erro:</p>
<pre>
PHP Notice:  Undefined variable: var in teste.php on line 2
</pre>
<p>A solução não poderia der outra: criar a variável antes de usá-la.<br />
Logicamente, o erro pode ter ocorrido por um erro de digitação do nome da variável.</p>
<p><a name="header"><br />
<h3>Cannot modify header information</h3>
<p></a></p>
<p>Essa mensagem de erro está ligada a envio de cabeçalhos HTTP, o que envolve <em>sessions</em>, <em>cookies</em>, a própria função <a href="http://www.php.net/manual/pt_BR/function.header.php" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/function.header.php?referer=');"><em>header</em></a>, do PHP.</p>
<p>O envio de cabeçalhos HTTP devem ser realizados sempre antes de qualquer saída ao navegador, ou seja, sempre antes de códigos HTML e funções que exibam dados, como echo, print, print_r etc. Também não pode haver espaços vazios no código, antes da tag &lt;?.</p>
<p>O membro hinom, do iMasters Fóruns, escreveu um excelente tutorial sobre isso, que pode ser visto no link abaixo:<br />
<a href="http://forum.imasters.com.br/index.php?/topic/342563-dicas-para-uso-de-variaveis-de-sessao" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?/topic/342563-dicas-para-uso-de-variaveis-de-sessao&amp;referer=');">http://forum.imasters.com.br/index.php?/topic/342563-dicas-para-uso-de-variaveis-de-sessao</a></p>
<p><a name="undef_func"><br />
<h3>Call to undefined function</h3>
<p></a></p>
<p>Novamente, o erro é claro: foi feita uma chamada a uma função não definida.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
beraldo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Erro:</p>
<pre>
Fatal error:  Call to undefined function beraldo() in teste.php on line 2
</pre>
<p>Para corrigir, defina a função. Pode ter havido erro de digitação do nome da função ou falta de inclusão do arquivo que a define.</p>
<p><a name="class_notfound"><br />
<h3>Class not found</h3>
<p></a></p>
<p>Ocorre quando o PHP não encontra a classe que se deseja instanciar.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Beraldo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Erro:</p>
<pre>
Fatal error:  Class 'beraldo' not found in teste.php on line 2
</pre>
<p>Como no erro anterior, a solução é declarar a classe, além de verificar se não houve erro de digitação ou falta de inclusão de arquivo.</p>
<p><a name="undef_method"><br />
<h3>Call to undefined method</h3>
<p></a></p>
<p>Ocorre quando se chama um método inexistente de uma classe.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Beraldo
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> darOi<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;oi&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$Beraldo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Beraldo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$Beraldo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">darTchau</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Erro:</p>
<pre>
Fatal error:  Call to undefined method Beraldo::darTchau() in teste.php on line 12
</pre>
<p>Deve-se criar o método ou verificar se não houve erro de digitação do nome do método.</p>
<p><a name="call_member_func"><br />
<h3>Call to a member function on a non-object</h3>
<p></a></p>
<p>Isso ocorre quando se chama um método em uma variável que não é uma instância de um objeto.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'oi, sou uma string'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$var</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">metodo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Erro:</p>
<pre>
Fatal error:  Call to a member function metodo() on a non-object in teste.php on line 3
</pre>
<p>Para solucionar o erro, verifique se não usou a variável errada ou se não modificou o valor original da variável, de forma a ter perdido a instância do objeto.</p>
<p><a name="mysql_result_resource"><br />
<h3>supplied argument is not a valid MySQL result resource</h3>
<p></a></p>
<p>Esse erro ocorre quando uma função espera, como parâmetro, um <em>resource</em> retornado por outra função do MySQL. O mais comum é ocorrer erro na linha onde há a função <code>mysql_fetch_assoc()</code>, <code>mysql_fetch_array()</code> e semlhantes. Isso quer dizer que o parâmetro passado não é um <em>resource</em> retornado por <code>mysql_query()</code>, o que indica que a consulta falhiou e <code>mysql_query()</code> retornou <strong><em>FALSE</em></strong>.</p>
<p>Mensagem de erro:</p>
<pre>
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...
</pre>
<p>A solução é corrigir a query executada. Muitas vezes o erro é simples, apenas nome de tabela ou campo errados, ou erro de sintaxe. Para visualizar o erro retornado pelo MySQL, pode-se usar a função <code>mysql_error()</code>. Logo, deve-se executar a consulta desta maneira:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$exec</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sua_consulta_aqui</span> <span style="color: #009900;">&#41;</span> or <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Caso a consulta falhe, ou seja, <code>mysql_query</code> retorne <strong><em>FALSE</em></strong>, a função <code>exit()</code> finalizará a execução do script, mostrando o erro do MySQL, devido à função <code>mysql_error()</code>. Ler a mensagem de erro ajuda a encontrar o erro na consulta SQL.</p>
<p><em>OBS: Mostrei exemplo usando <strong>MySQL</strong>, mas recomendo fortemente que seja usada a extensão <strong>MySQLi</strong>, que é bem mais completa, além de prover recuersos novos do MySQL 4.1.</em></p>
<p><a name="foreach"><br />
<h3>Invalid argument supplied for foreach()</h3>
<p></a></p>
<p>Esse erro ocorre quando o argumento passado para o <em>loop foreach</em> não é um <em>array</em>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$var</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$k</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$k</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Erro:</p>
<pre>
Warning:  Invalid argument supplied for foreach() in teste.php on line 3
</pre>
<p>Como <code>$var</code> é uma <em>string</em>, foi gerado o erro. Para corrigir, basta verificar se o parâmetro está correto ou se ele não foi modificado durante a execução do script, deixando de ser um <em>array</em>.</p>
<p><a name="conclusao"><br />
<h3>Conclusão</h3>
<p></a></p>
<p>As mensagens de erros geralmente são muito claras. Portanto, leia-as atentamente antes de perguntar para alguém ou criar um tópico em um fórum só para isso. Muitas vezes os erros são de fácil correção, bastando ler com cuidado das mensagens de erro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/as-mensagens-de-erros-mais-comuns-do-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Enviando E-Mails com a Classe PHPMailer</title>
		<link>http://www.rberaldo.com.br/blog/enviando-e-mails-com-a-classe-phpmailer/</link>
		<comments>http://www.rberaldo.com.br/blog/enviando-e-mails-com-a-classe-phpmailer/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 23:23:59 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[phpmailer]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=339</guid>
		<description><![CDATA[Tutorial mostrando como usar a classe PHPMailer com SMTP externo do GMail, com anexo]]></description>
			<content:encoded><![CDATA[<p>O PHP posusi a <a href="http://php.net/manual/en/function.mail.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.mail.php?referer=');">função mail</a>, porém ela é simples demais, uma vez que só é possível usar SMTP local, além de ser necessário definir manualmente todos os cabeçalhos da mensagem. Esses cabeçalhos devem ser preenchidos corretamente, uma vez que são usados por servidores de emails como principal forma de identificação de spam. Mensagens com cabeçalhos fracos e incompletos têm alta probabilidade de serem consideradas spam.</p>
<p>A fim de facilitar o envio de e-mails, foi criada a classe <a href="http://phpmailer.worxware.com" title="Link para a página oficial do PHPMailer" onclick="urchinTracker('/outgoing/phpmailer.worxware.com?referer=');">PHPMailer</a>, que possui excelente configuração de cabeçalhos, além de facilitar tarefas meio chatas, como anexar arquivos nas mensagens.</p>
<p><span id="more-339"></span></p>
<p>A classe PHPMailer pode ser baixada em seu <a href="http://phpmailer.worxware.com" title="Link para a página oficial do PHPMailer" onclick="urchinTracker('/outgoing/phpmailer.worxware.com?referer=');">site oficial</a>. O pacote baixado terá, dentre outros arquivos e diretórios, os arquivos <code>class.phpmailer.php</code> e <code>class.smtp.php</code>. O primeiro contém a classe PHPMailer, a qual instanciaremos para o envio da mensagem; o segundo contém a classe para envio de email por SMTP. Esse arquivo é automaticamente inclúido pela classe PHPMailer, caso opte-se por envio via SMTP, ou seja, não é necessário incluir esse arquivo, apenas o <code>class.phpmailer.php</code>.</p>
<p>Vou postar um exemplo simples, com comentário nas principais instruções. Usarei o SMTP do GMail, mas pode ser usado qualquer outro SMTP. Notem que o GMail usa SSL e porta diferente da padrão do SMTP (25).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'phpmailer/class.phpmailer.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$PHPMailer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PHPMailer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// define que será usado SMTP</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">IsSMTP</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// envia email HTML</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isHTML</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// codificação UTF-8, a codificação mais usada recentemente</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Charset</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Configurações do SMTP</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SMTPAuth</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SMTPSecure</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'ssl'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Host</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'smtp.gmail.com'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Port</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">465</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Username</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'seu_login'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Password</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'sua_senha'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// E-Mail do remetente (deve ser o mesmo de quem fez a autenticação</span>
<span style="color: #666666; font-style: italic;">// nesse caso seu_login@gmail.com)</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">From</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'seu_login@gmail.com'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Nome do rementente</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">FromName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Seu Nome'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// assunto da mensagem</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Subject</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Teste'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// corpo da mensagem</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Body</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;p&gt;Mensagem em HTML&lt;/p&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// corpo da mensagem em modo texto</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">AltBody</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Mensagem em texto'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// adiciona destinatário (pode ser chamado inúmeras vezes)</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">AddAddress</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'meu_amigo@dominio.com'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// adiciona um anexo</span>
<span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">AddAttachment</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'arquivo.pdf'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// verifica se enviou corretamente</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Enviado com sucesso&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Erro do PHPMailer: '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$PHPMailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ErrorInfo</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>É muito fácil mexer com o PHPMailer. Até anexar um arquivo é simples! :)</p>
<p><a href="http://phpmailer.worxware.com" title="Link para a página oficial do PHPMailer" onclick="urchinTracker('/outgoing/phpmailer.worxware.com?referer=');">Site oficial do PHPMailer</a><br />
<a href="http://phpmailer.worxware.com/index.php?pg=properties" title="Propriedades da classe PHPMailer" onclick="urchinTracker('/outgoing/phpmailer.worxware.com/index.php?pg=properties&amp;referer=');">Propriedades da classe PHPMailer</a><br />
<a href="http://phpmailer.worxware.com/index.php?pg=methods" title="Métodos da classe PHPMailer" onclick="urchinTracker('/outgoing/phpmailer.worxware.com/index.php?pg=methods&amp;referer=');">Métodos da classe PHPMailer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/enviando-e-mails-com-a-classe-phpmailer/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>C: Por que usar fgets em vez de gets</title>
		<link>http://www.rberaldo.com.br/blog/c-por-que-usar-fgets-em-vez-de-gets/</link>
		<comments>http://www.rberaldo.com.br/blog/c-por-que-usar-fgets-em-vez-de-gets/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 14:51:32 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[buffer]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[fgets]]></category>
		<category><![CDATA[gets]]></category>
		<category><![CDATA[limite]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=316</guid>
		<description><![CDATA[Exemplo de como gets pode gerar erros em programas escritos em C. Solução: usar fgets]]></description>
			<content:encoded><![CDATA[<p>A função gets, da biblioteca padrão do C (<em>stdio</em>) pode gerar um grande problema para o programador que a usa: como essa função não limita o número de caracteres a serem lidos da entrada padrão (<em>stdin</em>), pode haver vazamento de memória, ou até pior, injeção de código malicioso no progreama.</p>
<p>A solução é usar fgets, que limita o <em>buffer</em> de leitura.</p>
<p><span id="more-316"></span></p>
<p>Como a própria <a href="http://en.wikipedia.org/wiki/Man_page" title="Link para o artigo sobre Man Page na Wikiéida" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Man_page?referer=');"><em>manpage</em></a> da função gets informa, é preferível o uso de fgets. Leia o trecho presente na <a href="http://www.linuxmanpages.com/man3/gets.3.php" title="Link para a manpage de gets" onclick="urchinTracker('/outgoing/www.linuxmanpages.com/man3/gets.3.php?referer=');"><strong><em>manpage</em> de gets</strong></a>:</p>
<pre>
BUGS

Never use gets(). Because it is impossible to tell without knowing the data
in advance how many characters gets() will read, and because gets() will
continue to store characters past the end of the buffer, it is extremely
dangerous to use. It has been used to break computer security. Use fgets()
instead.
</pre>
<p>Vejamos um simples exemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define STRSIZE 10</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> str<span style="color: #009900;">&#91;</span> STRSIZE <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	gets<span style="color: #009900;">&#40;</span> str <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> str <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>A própria compilação com o GCC já alerta sobre o problema de gets:</p>
<pre style="overflow: auto;">
$ gcc teste.c
/tmp/ccCUw08x.o: In function `main':
teste.c:(.text+0x1f): warning: the `gets' function is dangerous and should not be used.
</pre>
<p>Dependendo da posição da memória em que o programa for executado, pode ocorrer o seguinte problema durante sua execução:</p>
<pre style="overflow: auto;">
$ ./a.out
oi eu sou o beraldo
oi eu sou o beraldo
*** stack smashing detected ***: ./a.out terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x37)[0x7f8b96f57537]
/lib/libc.so.6(__fortify_fail+0x0)[0x7f8b96f57500]
./a.out[0x4005fc]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7f8b96e76d8e]
./a.out[0x4004f9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 403972                             /tmp/a.out
00600000-00601000 r--p 00000000 08:03 403972                             /tmp/a.out
00601000-00602000 rw-p 00001000 08:03 403972                             /tmp/a.out
00ca3000-00cc4000 rw-p 00000000 00:00 0                                  [heap]
7f8b96c42000-7f8b96c57000 r-xp 00000000 08:03 524368                     /lib/libgcc_s.so.1
7f8b96c57000-7f8b96e56000 ---p 00015000 08:03 524368                     /lib/libgcc_s.so.1
7f8b96e56000-7f8b96e57000 r--p 00014000 08:03 524368                     /lib/libgcc_s.so.1
7f8b96e57000-7f8b96e58000 rw-p 00015000 08:03 524368                     /lib/libgcc_s.so.1
7f8b96e58000-7f8b96fd2000 r-xp 00000000 08:03 546662                     /lib/libc-2.12.1.so
7f8b96fd2000-7f8b971d1000 ---p 0017a000 08:03 546662                     /lib/libc-2.12.1.so
7f8b971d1000-7f8b971d5000 r--p 00179000 08:03 546662                     /lib/libc-2.12.1.so
7f8b971d5000-7f8b971d6000 rw-p 0017d000 08:03 546662                     /lib/libc-2.12.1.so
7f8b971d6000-7f8b971db000 rw-p 00000000 00:00 0
7f8b971db000-7f8b971fb000 r-xp 00000000 08:03 526899                     /lib/ld-2.12.1.so
7f8b973d4000-7f8b973d7000 rw-p 00000000 00:00 0
7f8b973f7000-7f8b973fb000 rw-p 00000000 00:00 0
7f8b973fb000-7f8b973fc000 r--p 00020000 08:03 526899                     /lib/ld-2.12.1.so
7f8b973fc000-7f8b973fd000 rw-p 00021000 08:03 526899                     /lib/ld-2.12.1.so
7f8b973fd000-7f8b973fe000 rw-p 00000000 00:00 0
7fff0445e000-7fff0447f000 rw-p 00000000 00:00 0                          [stack]
7fff0454c000-7fff0454d000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Abortado
</pre>
<p>Isso nem sempre ocorre. Depende dos limites de memória alocados para a execução do programa.</p>
<p>Teoricamente, na string só deveria conter &#8220;oi eu sou &#8220;, que são os dez primeiros caracteres da string lida. Assim, os demais caracteres ficam além dessa última posição de memória, que pode estar em uso por outra aplicação, gerando o erro. Pior que isso, se for injetado um código malicioso, a outra aplicação poderá executá-lo. Essa é uma forma de &#8220;vírus&#8221;.</p>
<p>A solução é usar fgets, lendo de <em>stdin</em>, que é o arquivo que representa a entrada padrão:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define STRSIZE 10</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> str<span style="color: #009900;">&#91;</span> STRSIZE <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	fgets<span style="color: #009900;">&#40;</span> str<span style="color: #339933;">,</span> STRSIZE<span style="color: #339933;">,</span> stdin <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> str <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Compilação e execução:</p>
<pre>
$ gcc teste.c
$ ./a.out
oi eu sou o beraldo
oi eu sou
</pre>
<p>O resultado foi o esperado.</p>
<p>Portanto, excluam gets de suas vidas. =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/c-por-que-usar-fgets-em-vez-de-gets/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP: Conversão de Datas: formato brasileiro e formato ISO</title>
		<link>http://www.rberaldo.com.br/blog/php-conversao-de-datas-formato-brasileiro-e-formato-iso/</link>
		<comments>http://www.rberaldo.com.br/blog/php-conversao-de-datas-formato-brasileiro-e-formato-iso/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 14:51:33 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[converter]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[eficiente]]></category>
		<category><![CDATA[rapido]]></category>
		<category><![CDATA[tempo]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=302</guid>
		<description><![CDATA[Comparação entre quatro maneiras de se converter datas no formato brasileiro para o formato ISO e vice-versa, a fim de encontrar a mais eficiente]]></description>
			<content:encoded><![CDATA[<p>Uma das principais e mais frequentes dúvidas em fóruns é sobre tratamento de datas. O formato brasileiro é dd/mm/yyy, porém os bancos de dados, por exemplo, trabalham com a data no formato <a href="http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm" title="Link, em inglês, sobre a ISO 8601" onclick="urchinTracker('/outgoing/www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm?referer=');">ISO 8601</a>, ou seja, yyyy-mm-dd.</p>
<p>Face a isso, muitos têm dúvidas em como converter do formato brasileiro para o ISO e vice-versa. É possível fazer isso de várias formas, mas pretendo mostrar aqui as principais delas, comparando o tempo de execução de cada uma, a fim de encontrar a mais eficiente.</p>
<p><span id="more-302"></span></p>
<p>Vamos a quatro exemplos.</p>
<p>O primeiro exemplo usa arrays, com as funções implode, explode, e array_reverse. É talvez o mais usado. Pelo menos é o que mais aparece por aí.</p>
<p>date1.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'2011-01-15'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array_reverse</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'-'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$date</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$time</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O segundo exemplo usa ER&#8217;s, utilizando a função preg_replace:</p>
<p>date2.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'2011-01-15'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'/([0-9]+)-([0-9]+)-([0-9]+)/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'$3/$2/$1'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$date</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$time</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O exemplo 3 usa printf e scanf  (e semelhantes), sem usar variáveis auxiliares, ou seja, fazendo sscanf retornar um array, que é lido por vprintf.</p>
<p>date3.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'2011-01-15'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">vprintf</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%d</span>/<span style="color: #009933; font-weight: bold;">%d</span>/<span style="color: #009933; font-weight: bold;">%d</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array_reverse</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">sscanf</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$date</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%d</span>-<span style="color: #009933; font-weight: bold;">%d</span>-<span style="color: #009933; font-weight: bold;">%d</span>&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$time</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O exemplo 4 usa, novamente, printf e scanf (e semelhantes), mas usa variáveis auxiliares, para evitar o uso de array, da forma como é normalmente usada em linguagens como C e C++.</p>
<p>date4.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'2011-01-15'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">sscanf</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$date</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%d</span>-<span style="color: #009933; font-weight: bold;">%d</span>-<span style="color: #009933; font-weight: bold;">%d</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">printf</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%d</span>/<span style="color: #009933; font-weight: bold;">%d</span>/<span style="color: #009933; font-weight: bold;">%d</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$time</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Vamos executar os quatro scripts e analisar as saídas deles. Note que aparecerão a data convertida e o tempo de execução de cada um deles. Perceba que o tempo é um float em notação científica.</p>
<p>Saída:</p>
<pre>
date1.php
15/01/2011
float(4.4107437133789E-5)

date2.php
15/01/2011
float(0.0001068115234375)

date3.php
15/01/2011
float(5.1021575927734E-5)

date4.php
15/01/2011
float(3.9815902709961E-5)
</pre>
<p>Aparentemente, o date2.php foi mais rápido, mas, novamente, note a notação científica. Todos os demais estão multiplicados por 10^-5, enquanto o date2.php não está. Logo, ele é o mais lento, não o mais rápido. O mais rápido no teste acima foi o date4.php.</p>
<p>Ou seja, a melhor função para converter datas seria esta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> converteData<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">strstr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #666666; font-style: italic;">// $data está no formato ISO (yyyy-mm-dd) e deve ser convertida</span>
                <span style="color: #666666; font-style: italic;">// para dd/mm/yyyy</span>
                <span style="color: #990000;">sscanf</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'%d-%d-%d'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'%d/%d/%d'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #666666; font-style: italic;">// $data está no formato brasileiro e deve ser convertida para ISO</span>
                <span style="color: #990000;">sscanf</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'%d/%d/%d'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'%d-%d-%d'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O tempo de execução pode variar de máquina para máquina. Testei em um AMD Phenon X4 9550. Em alguns outros testes, date1.php ficou muito perto de date4.php, às vezes sendo até mais rápido. Porém na maioria das vezes o date4.php foi mais rápido.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/php-conversao-de-datas-formato-brasileiro-e-formato-iso/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Serialização de Dados</title>
		<link>http://www.rberaldo.com.br/blog/serializacao-de-dados/</link>
		<comments>http://www.rberaldo.com.br/blog/serializacao-de-dados/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 01:34:03 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[arquivo]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[lista]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[pickle]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[serialização]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[sessão]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=295</guid>
		<description><![CDATA[A serialização de dados é útil quando é necessário salvar objetos ou arrays em arquivos, cookies, variáveis de sessão ou transmiti-los via sockets.]]></description>
			<content:encoded><![CDATA[<p>Segundo a Wikipédia:</p>
<pre>
Em Ciência da Computação, no contexto de armazenamento e transmissão de dados,
a serialização é o processo de salvar um objeto em um meio de armazenamento
(como um arquivo de computador ou um buffer de memória) ou transmiti-lo por uma
conexão de rede, seja em forma binária ou em formato de texto como o XML. Esta
série de bytes pode ser usada para recriar um objeto com o mesmo estado interno
que o original.
</pre>
<p>Fonte: <a href="http://pt.wikipedia.org/wiki/Serializa%C3%A7%C3%A3o" title="Link para o artigo da Wikipedia sobre Serialização de dados" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Serializa_C3_A7_C3_A3o?referer=');">http://pt.wikipedia.org/wiki/Serializa%C3%A7%C3%A3o</a></p>
<p>Essa técnica é muito útil quando se deseja salvar dados como arrays ou objetos em arquivos, cookies, sessões ou transmiti-los via sockets, por exemplo.<br />
<span id="more-295"></span></p>
<p>Vou dar um exemplo básico de serialização usando PHP e outro usando Python.</p>
<h3>PHP</h3>
<p>O PHP possui as funções <a href="http://php.net/manual/en/function.serialize.php" title="Link para a documentação da função serialize" onclick="urchinTracker('/outgoing/php.net/manual/en/function.serialize.php?referer=');">serialize</a> e <a href="http://php.net/manual/en/function.unserialize.php" title="Link para a documentação da função unserialize" onclick="urchinTracker('/outgoing/php.net/manual/en/function.unserialize.php?referer=');">unserialize</a>, que funcionam de forma muito simples. Um exemplo prático é suficiente para compreender.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'dado 1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dado 2'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$arr</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$serArr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$arr</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$serArr</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$unSerArr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$serArr</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$unSerArr</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Saída:</p>
<pre>
array(2) {
  [0]=>
  string(6) "dado 1"
  [1]=>
  string(6) "dado 2"
}
string(40) "a:2:{i:0;s:6:"dado 1";i:1;s:6:"dado 2";}"
array(2) {
  [0]=>
  string(6) "dado 1"
  [1]=>
  string(6) "dado 2"
}
</pre>
<p>Veja que inicialmente o dado é um array. Após a serialização, vira uma string, que pode ser salva em arquivo, cookie, sessão ou transmitida byte a byte via socket. Após ser desserializada, volta a ser um array, da mesma forma como era antes.</p>
<p>Isso vale para qualquer tipo de dado: arrays, objetos, arrays de objetos, objetos com outros objetis intanciados&#8230;</p>
<h3>Python</h3>
<p>O Python possui o módulo <b><a href="http://docs.python.org/library/pickle.html" title="Link para a documentação do módulo pickle do Python" onclick="urchinTracker('/outgoing/docs.python.org/library/pickle.html?referer=');">pickle</a></b>, que permite salvar a serialização direto num arquivo ou atribuí-la a uma variável. O mesmo vale para a desserialização: pode desserializar um dado direto de um arquivo ou a partir de dados de uma variável.</p>
<p>Vou mostrar um exemplo semelhante ao anterior, usando apenas variáveis:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">pickle</span><span style="color: #66cc66;">;</span>
&nbsp;
arr = <span style="color: black;">&#91;</span> <span style="color: #483d8b;">'dado 1'</span>, <span style="color: #483d8b;">'dado 2'</span> <span style="color: black;">&#93;</span><span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> arr<span style="color: #66cc66;">;</span>
serArr = <span style="color: #dc143c;">pickle</span>.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span> arr <span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> serArr<span style="color: #66cc66;">;</span>
unSerArr = <span style="color: #dc143c;">pickle</span>.<span style="color: black;">loads</span><span style="color: black;">&#40;</span> serArr <span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> unSerArr<span style="color: #66cc66;">;</span></pre></div></div>

<p>Saída:</p>
<pre>
['dado 1', 'dado 2']
(lp0
S'dado 1'
p1
aS'dado 2'
p2
a.
['dado 1', 'dado 2']
</pre>
<p>Novamente, iniciamos com um array (lista para os mais íntimos ao Python :P ), passando a uma string representando a lista serializada. Ao fim, temos a lista original.</p>
<p>Para usar arquivos, basta usar dump e load, em vez de dumps e loads. Mais exemplos podem ser vistos na documentação do módulo pickle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/serializacao-de-dados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Segurança em Sistemas de Login: Proteção Contra SQL Injection</title>
		<link>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-protecao-contra-sql-injection/</link>
		<comments>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-protecao-contra-sql-injection/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 15:45:48 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[escape]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[magic]]></category>
		<category><![CDATA[magic_quotes]]></category>
		<category><![CDATA[mysql_real_escape_string]]></category>
		<category><![CDATA[pg_escape_string]]></category>
		<category><![CDATA[quotes]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[stripslashes]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=269</guid>
		<description><![CDATA[Dando continuação ao artigo sobre Segurança em Sistemas de login, hoje mostrarei como se defender de ataques por SQL Injection. Foco MySQL e PostgreSQL, os principais SGBDs gratuitos da atualidade.]]></description>
			<content:encoded><![CDATA[<p>Dando continuação ao artigo sobre Segurança em Sistemas de login, hoje mostrarei como se defender de ataques por SQL Injection. Foco MySQL e PostgreSQL, os principais SGBDs gratuitos da atualidade.</p>
<p>Caso não tenha visto a primeira parte do artigo, leia-a aqui:<br />
<a href="http://www.rberaldo.com.br/blog/2010/12/22/seguranca-em-sistemas-de-login-senhas-e-cookies/">Segurança em SIstemas de Login: Senhas e Cookies</a></p>
<p><span id="more-269"></span></p>
<h3>Sumário</h3>
<p><a href="#intro">1. Introdução</a><br />
<a href="#magic">2. Magic Quotes</a><br />
<a href="#solucoes">3. Soluções Especificas para cada SGBD</a><br />
<a href="#mysql">3.1. MySQL</a><br />
<a href="#postgre">3.2. PostgreSQL</a><br />
<a href="#exemplos">3.3. Exemplos de códigos para MySQL e PostgreSQL</a><br />
<a href="#apenas">4. Apenas Isso Não Basta</a><br />
<a href="#conclusao">5. Conclusão</a></p>
<h3><a name="intro">1. Introdução</a></h3>
<p>Neste segundo artigo sobre <b>segurança</b> em sistemas de login, abordarei formas de proteção contra <a href="http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Inje_C3_A7_C3_A3o_de_SQL?referer=');">SQL Injection</a>.</p>
<p>Existem muitas discussões na Internet, em listas de discussão e fóruns, sobre qual seria a função perfeita para impedir ataque por SQL Injection SQL Injection. Alguns programadores até criam funções que removem, por segurança, palavras-chave da linguagem SQL, como SELECT, DROP, DELETE. Isso pode até resolver, mas não podemos danificar a informação; se permitirmos que o usuário escreva informações em nosso site, devemos permitir-lhe escrever<br />
SELECT, DROP e DELETE também. Imagine, por exemplo, um fórum sobre programação: como poderíamos postar códigos SQL se o fórum removesse as palavras SELECT, DELETE etc? Logo, não podemos remover essas palavras.</p>
<p>A soluçãoo é muito simples! Sim, é simples, mesmo. Muitos querem complicar à toa, porém é muito simples: <strong>escapar caracteres especiais</strong>.</p>
<p>Esses caracteres especiais podem variar conforme o <a href="http://pt.wikipedia.org/wiki/Sistema_de_gerenciamento_de_banco_de_dados" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Sistema_de_gerenciamento_de_banco_de_dados?referer=');">SGBD</a> que se está utilizando. Normalmente são aspas simples e duplas, as quais delimitam strings em um comando SQL.</p>
<p>Vamos a um exemplo. Considere a SQL abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">$sql <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;SELECT id, nome, sobrenome FROM autores WHERE nome = '&quot;</span> <span style="color: #66cc66;">.</span> $nome <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;'
		AND sobrenome = '&quot;</span> <span style="color: #66cc66;">.</span> $sobrenome <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;'&quot;</span>;</pre></div></div>

<p>Supondo que $nome contenha <b>jo&#8217;sé</b>, e $sobrenome, <b>silva</b>, a SQL ficará assim:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> nome<span style="color: #66cc66;">,</span> sobrenome <span style="color: #993333; font-weight: bold;">FROM</span> autores <span style="color: #993333; font-weight: bold;">WHERE</span> nome <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'jo'</span>se<span style="color: #ff0000;">' AND sobrenome = '</span>silva<span style="color: #ff0000;">';</span></pre></div></div>

<p>Isso gera um erro de sintaxe, sem comprometer o banco de dados. Porém, se mantivermos $sobrenome e definirmos $nome com o valor <b>jo&#8217;; DROP TABLE autores ; &#8211;</b>, teremos:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> nome<span style="color: #66cc66;">,</span> sobrenome <span style="color: #993333; font-weight: bold;">FROM</span> autores <span style="color: #993333; font-weight: bold;">WHERE</span> nome <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'jo'</span>; <span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> autores ;
<span style="color: #808080; font-style: italic;">--'AND sobrenome = 'silva';</span></pre></div></div>

<p>Dessa forma, selecionam-se os registros com nome igual a &#8220;jo&#8221;, remove-se a tabela &#8220;autores&#8221; e considera-se <strong>&#8216; AND sobrenome = &#8216;silva&#8217;;</strong> como comentário. Isso caracteriza um ataque por SQL Injection.</p>
<h3><a name="magic">2. Magic Quotes</a></h3>
<p>Face aos possíveis grandes danos que SQL Injection pode causar, o PHP possui um mecanismo nativo automático para escapar caracteres especiais: o <em>magic quotes</em>. Porém, esse é um mecanismo genérico, que não pode ser aplicado a todos os SGBDs. Logo, não o utilize!</p>
<p>O próprio Manual do PHP não recomenda seu uso:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">There is no reason to use magic quotes because they are no longer a supported
part of PHP. However, they did exist and did help a few beginners blissfully
and unknowingly write better (more secure) code. But, when dealing with code
that relies upon this behavior it's better to update the code instead of
turning magic quotes on. So why did this feature exist? Simple, to help prevent
SQL Injection. Today developers are better aware of security and end up using
database specific escaping mechanisms and/or prepared statements instead of
relying upon features like magical quotes.</pre></div></div>

<p>Fonte: <a href="http://br3.php.net/manual/en/security.magicquotes.why.php" onclick="urchinTracker('/outgoing/br3.php.net/manual/en/security.magicquotes.why.php?referer=');">http://br3.php.net/manual/en/security.magicquotes.why.php</a></p>
<p>Como citado no trecho, é preferível adaptar seus códigos a fim de torná-los seguros e não vulneráveis a SQL Injection a habilitar o magic quotes. Portanto mantenha a diretiva <strong>magic_quotes_gpc</strong>, do , em <strong>off</strong>! Dê preferência a funções específicas para cada SGBD.</p>
<p>Leia o capítulo sobre Magic Quotes, do }Manual do PHP, no link abaixo:<br />
<a href="http://br3.php.net/manual/en/security.magicquotes.php" onclick="urchinTracker('/outgoing/br3.php.net/manual/en/security.magicquotes.php?referer=');">http://br3.php.net/manual/en/security.magicquotes.php</a></p>
<h3><a name="solucoes">3. Soluções Especificas para cada SGBD</a></h3>
<h3><a name="mysql">3.1. MySQL</a></h3>
<p>Vamos ao exemplo mais comum: MySQL: existe uma função específica do PHP para escapar caracteres especiais do MySQL: <a href="http://br3.php.net/manual/pt\_BR/function.mysql-real-escape-string.php" onclick="urchinTracker('/outgoing/br3.php.net/manual/pt_BR/function.mysql-real-escape-string.php?referer=');">mysql_real_escape_string</a>.</p>
<p>Ela deve ser usada com magic_quotes_gpc em off. Caso seu servidor mantenha essa diretiva ativa, <a href="http://php.net/manual/pt_BR/security.magicquotes.disabling.php" onclick="urchinTracker('/outgoing/php.net/manual/pt_BR/security.magicquotes.disabling.php?referer=');">desabilite-a por meio de htaccess</a> ou, caso isso não seja possível, certifique-se de usar <a href="http://php.net/manual/en/function.stripslashes.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.stripslashes.php?referer=');">stripslashes</a> antes de aplicar essa função. Veja o exemplo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">get_magic_quotes_gpc</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$name</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$name</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT * FROM users WHERE name=<span style="color: #006699; font-weight: bold;">$name</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Esse trecho de código e outras dicas sobre prevenção de SQL Injection com MySQL podem ser vistas no link abaixo, do próprio Manual do MySQL:<br />
<a href="http://dev.mysql.com/tech-resources/articles/guide-to-php-security.html" onclick="urchinTracker('/outgoing/dev.mysql.com/tech-resources/articles/guide-to-php-security.html?referer=');">http://dev.mysql.com/tech-resources/articles/guide-to-php-security.html</a></p>
<h3><a name="postgre">3.2. PostgreSQL</a></h3>
<p>O escape de caracteres no PostgreSQL não é feito com barra invertida; é feito com aspas simples. Ou seja, addslashes não funcionaria aqui.</p>
<p>O PHP também tem uma função específica para escape de caracteres especiais para PostgreSQL: <a href="http://php.net/manual/en/function.pg-escape-string.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.pg-escape-string.php?referer=');">pg_escape_string</a>.</p>
<p>Mais informações sobre prevenção de SQL Injection em PostgreSQL podem ser vistas no link abaixo, do Wiki do PostgreSQL:<br />
<a href="http://wiki.postgresql.org/wiki/Sql_injection" onclick="urchinTracker('/outgoing/wiki.postgresql.org/wiki/Sql_injection?referer=');">http://wiki.postgresql.org/wiki/Sql_injection</a></p>
<h3><a name="exemplos">3.3. Exemplos de códigos para MySQL e PostgreSQL</a></h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'usuario'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'senha'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;There's no place like 127.0.0.1, the <span style="color: #000099; font-weight: bold;">\&quot;</span>localhost<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;String:	&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$str</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;MySQL:	&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Postgre:	&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">pg_escape_string</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>* Para usar mysql\_real\_escape\_string, é necessário uma conexão MySQL ativa.\\</p>
<p>Saída:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">String:	There's no place like 127.0.0.1, the &quot;localhost&quot;
MySQL:	There\'s no place like 127.0.0.1, the \&quot;localhost\&quot;
Postgre:	There''s no place like 127.0.0.1, the &quot;localhost&quot;</pre></div></div>

<h3><a name="apenas">4. Apenas Isso Não Basta</a></h3>
<p>Apenas escapar caracteres não é suficiente, uma vez que não existem apenas strings. Também temos dados numéricos, como inteiros, floats e outros tipos de ponto flutuante, que não são envolvidos por aspas em consultas SQL.</p>
<p>Considere a seguinte SQL:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">$sql <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;SELECT id, nome, sobrenome FROM autores WHERE id=&quot;</span> <span style="color: #66cc66;">.</span> $id;</pre></div></div>

<p>Se $id tiver o valor <strong>0; DROP TABLE autores; &#8211;</strong>, a SQL final será:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">SELECT id<span style="color: #339933;">,</span> nome<span style="color: #339933;">,</span> sobrenome FROM autores WHERE id<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> DROP TABLE autores<span style="color: #339933;">;</span> <span style="color: #339933;">--;</span></pre></div></div>

<p>Isso removeria a tabela &#8220;autores&#8221;.</p>
<p>A solução é, novamente, muito simples: basta fazer <a href="http://en.wikipedia.org/wiki/Cast_(computer_science)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Cast_computer_science?referer=');"><em>casting</em></a>, ou coerção, convertendo o parâmetro para um tipo numérico.</p>
<p>No exemplo acima, bastaria isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span></pre></div></div>

<p>O mesmo vale para float, double e os demais tipos de dados.</p>
<h3><a name="conclusao">5. Conclusão</a></h3>
<p>SQL Injection é um problema muito grave, que muitos programadores iniciantes deixam passar despercebido, principalmente por falta de conhecimento.</p>
<p>Apesar disso, sua prevenção é muito simples. Basta entender o funcionamento do ataque para saber como se defender dele.</p>
<p>Abraços,</p>
<p>Beraldo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-protecao-contra-sql-injection/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Segurança em sistemas de login: senhas e cookies</title>
		<link>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-senhas-e-cookies/</link>
		<comments>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-senhas-e-cookies/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 02:00:04 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[automático]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[criptografia]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[md-5]]></category>
		<category><![CDATA[md5]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[senha]]></category>
		<category><![CDATA[sha-1]]></category>
		<category><![CDATA[sha1]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=263</guid>
		<description><![CDATA[Neste tutorial abordarei maneiras de criptografar senhas para serem usadas em sistemas de login. Também mostrarei uma possível forma de salvá-las em cookies, a fim de viabilizar login automático, porém sem salvar a senha ou o hash dela no cookie.]]></description>
			<content:encoded><![CDATA[<p>Neste tutorial abordarei maneiras de criptografar senhas para serem usadas em sistemas de login. Também mostrarei uma possível forma de salvá-las em <em>cookies</em>, a fim de viabilizar login automático, porém sem salvar a senha ou o <em>hash</em> dela no <em>cookie</em>.</p>
<p>Na verdade, &#8220;<b>criptografia</b>&#8221; não é a palavra correta aqui. Na verdade usaremos <em><b>hashes</b></em>, que é uma forma de codificação unidirecional, ou seja, não há como, a partir de um <em><b>hash</b></em>, obter o dado original. Afinal, não temos para que saber a senha do usuário. <b>Criptografia</b> é uma forma de codificação usando chaves, de forma que é possível obter o dado original, desde que tenha-se a chave com a qual o dado foi codificado.</p>
<p><span id="more-263"></span></p>
<h2>Sumário</h2>
<p><a href="#encode">Codificando senhas para salvá-las no banco de dados</a><br />
<a href="#salt">Usando Salt Number</a><br />
<a href="#cookie">Salvando a senha em cookie de forma segura</a><br />
<a href="#conclusao">Conclusão</a></p>
<h3><a name="encode">Codificando senhas para salvá-las no banco de dados</a></h3>
<p>Nos exemplos aqui mostrados usarei a linguagem PHP, mas os conceitos podem ser usados com qualquer linguagem de programação.</p>
<p>Por incrível que possa parecer, há muitas pessoas que salvam senhas puras no banco de dados, sem qualquer tipo de criptografia! Isso é um crime! Se alguém tiver acesso ao banco de dados, todos os usuários do sistemas estarão em risco. As senhas devem ser salvas criptografadas ou, como no nosso caso, em <em><b>hashes</b></em>.</p>
<p>Normalmente usa-se o <a href="http://pt.wikipedia.org/wiki/MD5" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/MD5?referer=');">MD5</a>, que gera uma saída de 32 caracteres. Porém, toda segurança é pouca. Temos o <a href="http://pt.wikipedia.org/wiki/Sha1" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Sha1?referer=');">SHA-1</a>, que gera uma saída de 40 caracteres. A fim de evitar <a href="http://pt.wikipedia.org/wiki/Tabela_de_dispers%C3%A3o#Colis.C3.B5es" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Tabela_de_dispers_C3_A3o_Colis.C3.B5es?referer=');">colisões</a>, devemos dar preferência ao SHA-1, uma vez que ele gera mais possibilidades de saídas.</p>
<p>Mas também podemos unir as duas! Uma possibilidade é esta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> hashPasswd<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A função codifica com MD5 e depois codifica o resultado do MD5 com SHA-1. É uma segurança a mais, já que uma dicionário de senhas codificadas em SHA-1 provavelmente não contém <b>hashes</b> MD5 de senhas para serem testados.</p>
<p>Para ficar ainda mais seguro, você pode usar uma &#8220;<b>chave</b>&#8221; &#8211; não exatamente com o significado de uma chave de criptografia. Na verdade é uma string que concatenamos com a senha, a fim de gerar uma senha mais complexa:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'HASH_KEY'</span><span style="color: #339933;">,</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'chave secreta'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> hashPasswdWithKey<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #339933;">.</span> HASH_KEY <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>HASH_KEY é uma constante com o <em>hash</em> MD5 de uma string. Prefira usar uma string relativamente complexa, com números e caracteres maiúsculos e minúsculos no lugar de &#8220;chave secreta&#8221;.</p>
<p>O <em>hash</em> retornado é o valor que deve ser salvo no banco de dados.</p>
<p>Quando o usuário efetuar login, com nome de usuário e senha, basta pegarmos a senha informada, codificá-la com a nossa função e compará-la com o valor salvo no banco de dados.</p>
<h3><a name="salt">Usando Salt Number</a></h3>
<p>O uso de <a href="http://en.wikipedia.org/wiki/Salt_(cryptography)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Salt_cryptography?referer=');">Salt Number</a> dificulta a realização de ataques por brute force, uma vez que aumenta exponencialmente as possibilidades de hash para uma mesma palavra.</p>
<p>Os links abaixo explicam detalhadamente como funcionam os salt numbers:<br />
<a href="http://www.vivaolinux.com.br/artigo/Armazenamento-de-senhas-no-Linux/?pagina=7" onclick="urchinTracker('/outgoing/www.vivaolinux.com.br/artigo/Armazenamento-de-senhas-no-Linux/?pagina=7&amp;referer=');">http://www.vivaolinux.com.br/artigo/Armazenamento-de-senhas-no-Linux/?pagina=7</a><br />
<a href="http://gravatai.ulbra.tche.br/~elgio/senhas.html" onclick="urchinTracker('/outgoing/gravatai.ulbra.tche.br/_elgio/senhas.html?referer=');">http://gravatai.ulbra.tche.br/~elgio/senhas.html</a></p>
<p>O Salt Numbeer é semelhante à HASH_KEY, que criamos anteriormente. Porém, em vez de usarmos uma constante, criamos um código aleatório para cada usuário. Esse valor fica salvo no banco de dados e é concatenado à senha do usuário, da mesma forma que fizemos com a constante HASH_KEY.</p>
<p>Uma possível forma de gerar códigos aleatórios para o Salt Number em PHP é esta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Número de caracteres do Salt Number</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'SALT_SIZE'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">15</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Array com os 62 caracteres (a-z, A-Z, 0-9)</span>
<span style="color: #000088;">$amostra</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'a'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'z'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'A'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Z'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">9</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Embaralha o array</span>
<span style="color: #990000;">shuffle</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$amostra</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$index</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_rand</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$amostra</span><span style="color: #339933;">,</span> SALT_SIZE <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$salt</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> SALT_SIZE<span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$salt</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$amostra</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Assim, $salt contém o salt number gerado, para que seja usado na autenticação de um novo usuário recém-cadastrado.</p>
<h3><a name="cookie">Salvando a senha em cookie de forma segura</a></h3>
<p>A fim de permitirmos o <strong>login automático</strong>, muito comum em fóruns e lojas virtuais, precisamos usar <a href="http://pt.wikipedia.org/wiki/Cookie" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Cookie?referer=');"><b>cookies</b></a>. Neles devem estar salvos os dados do usuário para autenticação no sistema.</p>
<p>Porém, não podemos colocar a senha do usuário no cookie. Mesmo que seja o hash da senha, pois fornecer acesso à hash salva no banco de dados é uma falha de segurança, já que ter um hash em mãos torna muito mais fácil um ataque por <em>brute force</em>. Por isso, vamos criar outro hash, baseado no hash da senha e no horário em que o usuário fez o último login.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'HASH_KEY'</span><span style="color: #339933;">,</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'chave secreta'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'HASH_PATTERN'</span><span style="color: #339933;">,</span> HASH_KEY <span style="color: #339933;">.</span> <span style="color: #0000ff;">'%d'</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'%s'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> hashForCookie<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$strHash</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span> HASH_PATTERN<span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$strHash</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Novamente temos a HASH_KEY, utilizada anteriormente. Criamos outra constante, a HASH_PATTERN, que é o padrão que será usado no hash. Aqui uso a chave (HASH_KEY), à qual são concatenados um &#8220;%d&#8221; e um &#8220;%s&#8221;, que serão substituídos pelo <em>timestamp</em> corrente e pelo hash da senha, respectivamente, usando sprintf(). A função retorna o SHA-1 da string final. </p>
<p>Essa função deve ser usada quando o usuário efetuar login. Assim que ele logar, salve no banco de dados (num campo diferente do da senha, claro) o hash gerado por <strong>hashForCookie</strong>. Esse é o dado que deverá ser salvo no cookie, além do nome do usuário, evitando salvar o hash da senha na máquina no usuário.</p>
<p>Para autenticar, verifique se o hash lido do cookie é o mesmo do salvo no banco de dados. Se for, autenticado, senão remova o cookie e solicite nome de usuário e senha. Assim que fizer login, gere o novo hash para o cookie, salvando-o no cookie, como citado anteriormente.</p>
<p>Uma forma simples de salvar esses dados num cookie usando PHP:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Beraldo'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hash</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'2f9a922f0401476cd7089c235d76de5bb61150b9'</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$dados</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'user'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'passwd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$hash</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">setcookie</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'nome_do_cookie'</span><span style="color: #339933;">,</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dados</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">86400</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A função <a href="http://php.net/manual/en/function.serialize.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.serialize.php?referer=');">serialize</a> serializa um objeto, retornando uma representação em string do mesmo. O caminho oposto pode ser feito com <a href="http://php.net/manual/en/function.unserialize.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.unserialize.php?referer=');">unserialize</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cookie</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome_do_cookie'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dados</span> <span style="color: #339933;">=</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$cookie</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Assim, $dados é o array que definimos no código anterior.</p>
<h3><a name="conclusao">Conclusão</a></h3>
<p>Essas não são soluções finais para os dois casos apresentados. São apenas sugestões. É possível criar suas próprias funções, próprias criptografias etc.</p>
<p>O importante é procurar formas seguras de desenvolver sistemas.</p>
<p>Abraços,</p>
<p>Beraldo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-senhas-e-cookies/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Links sobre a linguagem Python</title>
		<link>http://www.rberaldo.com.br/blog/links-sobre-a-linguagem-python/</link>
		<comments>http://www.rberaldo.com.br/blog/links-sobre-a-linguagem-python/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 01:16:55 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[linguagem]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=250</guid>
		<description><![CDATA[Alguns dos principais links com tutoriais e dicas sobre a linguagem de programação Python]]></description>
			<content:encoded><![CDATA[<p>Neste semestre, resolvi fazer um dos trabalhos da faculdade usando a linguagem Python. Há tempos eu ouvia que ela era uma linguagem muito poderosa, além de ser fácil de aprender.</p>
<p>Realmente a linguagem é excelente. Passei alguns scripts de PHP para Python e notei um desempenho bem melhor. Foi muito fácil e rápido aprender a linguagem. Apenas um dia de estudo já é suficiente para aprender o essencial, desde que já haja conhecimentos sobre programação, claro.</p>
<p>Encontrei alguns problemas com <em>threads</em> e a interrupção delas, com CTRL+C (SIGINT), mas isso não vem ao caso. =P</p>
<p>Gostaria de deixar aqui alguns links que me foram muito úteis para aprender Python. Espero que sejam úteis para quem quiser aprender a linguagem.</p>
<p>Aprenda Python em 10 minutos (em inglês):<br />
<a href="http://www.korokithakis.net/tutorials/python" target="_blank" onclick="urchinTracker('/outgoing/www.korokithakis.net/tutorials/python?referer=');">http://www.korokithakis.net/tutorials/python</a></p>
<p>Livro Dive Into Python (em inglês):<br />
<a href="http://diveintopython.org/" target="_blank" onclick="urchinTracker('/outgoing/diveintopython.org/?referer=');">http://diveintopython.org/</a></p>
<p>Tutorial do site oficial (em inglês):<br />
<a href="http://docs.python.org/tutorial/" target="_blank" onclick="urchinTracker('/outgoing/docs.python.org/tutorial/?referer=');">http://docs.python.org/tutorial/</a></p>
<p>Diversos links sobre Python no site brasileiro sobre a linuagem:<br />
<a href="http://www.python.org.br/wiki/DocumentacaoPython" onclick="urchinTracker('/outgoing/www.python.org.br/wiki/DocumentacaoPython?referer=');">http://www.python.org.br/wiki/DocumentacaoPython</a></p>
<p>Divirtam-se! =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/links-sobre-a-linguagem-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDML: Gerando PDFs facilmente com PHP</title>
		<link>http://www.rberaldo.com.br/blog/pdml-gerando-pdfs-facilmente-com-php/</link>
		<comments>http://www.rberaldo.com.br/blog/pdml-gerando-pdfs-facilmente-com-php/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 18:51:51 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[fpdf]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[pdml]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=201</guid>
		<description><![CDATA[PDML, gerador de PDFs de forma simples com PHP, formatação semelhante à de um documento HTML ou XML]]></description>
			<content:encoded><![CDATA[<p>A biblioteca FPDF é muito conhecida e muito utilizada. Porém, conheci esses dias uma biblioteca ainda mais simples de se usar para gerar arquivos PDF com PHP: a PDML, uma ferramenta que possibilita gerar PDFs de uma maneira bem simples e familiar para quem conhece HTML ou XML, uma vez que a formatação do PDML é semelhante à do HTML (ou XML).</p>
<p><span id="more-201"></span></p>
<p>Veja um exemplo, retirado do site oficial:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'pdml.php'</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;pdml&gt;
&lt;body&gt;
&lt;font face=&quot;Arial&quot; size=&quot;16pt&quot;&gt;Hello, World&lt;/font&gt;
&lt;/body&gt;
&lt;/pdml&gt;</pre></div></div>

<p>A geração da saída pode ser vista no link abaixo:<br />
<a href="http://www.pdml-pdf.net/demo/index.php?page=create&#038;example=1" target="_blank" onclick="urchinTracker('/outgoing/www.pdml-pdf.net/demo/index.php?page=create_038_example=1&amp;referer=');">http://www.pdml-pdf.net/demo/index.php?page=create&#038;example=1</a></p>
<p>Na documentação oficial há todas as tags que podem ser usadas.</p>
<p>Divirtam-se! =)</p>
<p><a href="http://www.pdml-pdf.net" target="_blank" onclick="urchinTracker('/outgoing/www.pdml-pdf.net?referer=');">Site Oficial do PDML</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/pdml-gerando-pdfs-facilmente-com-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP: Usando a classe nativa DateTime</title>
		<link>http://www.rberaldo.com.br/blog/php-usando-a-classe-nativa-datetime/</link>
		<comments>http://www.rberaldo.com.br/blog/php-usando-a-classe-nativa-datetime/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 18:36:49 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[datetime]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[time]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=154</guid>
		<description><![CDATA[A partir do PHP 5.2.0, há uma maneira nativa e simples de se trabalhar com datas e horários, com ajuda da classe DateTime. Neste artigo, vou mostrar algumas das utilidades dessa classe.]]></description>
			<content:encoded><![CDATA[<p>A partir do PHP 5.2.0, há uma maneira nativa e simples de se trabalhar com datas e horários, com ajuda da classe <a href="http://br.php.net/manual/en/class.datetime.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/en/class.datetime.php?referer=');">DateTime</a>.</p>
<p>Neste artigo, vou mostrar algumas das utilidades dessa classe. Eu nunca a usei antes, estou aprendendo-a agora, enquanto monto o post. Logo, contribuições serão muito bem-vindas.</p>
<p>Vamos iniciar mostrando como funciona o construtor da classe.</p>
<p><span id="more-154"></span></p>
<p>Índice:<br />
<a href="#construct">1. Construtor da classe</a><br />
<a href="#format">2. Formatando datas</a><br />
<a href="#add">3. Adicionando períodos a datas</a><br />
<a href="#sub">4. Subtraindo períodos de uma data</a><br />
<a href="#diff">5. Calculando diferença entre datas</a><br />
<a href="#set">6. Modificando a data e a hora do objeto</a></p>
<h3><a name="construct">1. Construtor da classe</a></h3>
<p>Sintaxe do construtor:</p>
<p> <strong>DateTime::__construct  ([ string $time = "now"  [, DateTimeZone $timezone = NULL  ]] )</strong></p>
<p>Esse método aceita dois parâmetros, ambos opcionais. O primeiro é a data/hora, no mesmo formato aceito pela função <a href="http://br2.php.net/strftime" target="_blank" onclick="urchinTracker('/outgoing/br2.php.net/strftime?referer=');">strftime()</a>. O segundo consiste no <em>timezone</em> que deve ser utilizado. Ele deve ser uma instância da classe <a href="http://br2.php.net/manual/en/class.datetimezone.php" target="_blank" onclick="urchinTracker('/outgoing/br2.php.net/manual/en/class.datetimezone.php?referer=');">DateTimeZone</a>. Outra maneira de definir o <em>timezone</em> é por meio da função <a href="http://br.php.net/date_default_timezone_set" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/date_default_timezone_set?referer=');">date_default_timezone_set()</a>.</p>
<p>Ambas as classes DateTime e DateTimeZone disparam uma exceção se seus construtores receberem parâmetro inválidos. Logo, podemos usar blocos try/catch para instanciar essas classes.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">try
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$DateTime</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'now'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">new</span> DateTimeZone<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'America/Sao_Paulo'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
catch<span style="color: #009900;">&#40;</span> Exception <span style="color: #000088;">$e</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Erro ao instanciar objeto.&lt;br /&gt;'</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Experimente trocar o &#8220;now&#8221; por um valor não aceito pelo método, como uma string qualquer. Uma exceção será disparada.</p>
<h3><a name="format">2. Formatando datas</a></h3>
<p>Para formatar datas, usamos o método <em>format</em>, que aceita um parâmetro, correspondente a uma formatação de data aceita pela função <a href="http://br.php.net/manual/en/function.date.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/en/function.date.php?referer=');">date()</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$DateTime</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y H:i:s&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Y-m-d H:i:s&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Y/m/d H:i:s&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span></pre></div></div>

<h3><a name="add">3. Adicionando períodos a datas</a></h3>
<p>Com o método <em>add()</em>, podemos adicionar períodos à data salva no objeto DateTime. É possível adicionar períodos de dias, períodos de tempo ou ambos, seguindo a formatação aceita pelo método, que recebe um único parâmetro, o qual é uma instância da classe <a href="http://br.php.net/manual/en/class.dateinterval.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/en/class.dateinterval.php?referer=');">DateInterval</a>, responsável por manipular os dados do período especificado. </p>
<p>Os períodos são especificados da seguinte maneira: períodos de dias são precedidos pela letra &#8220;P&#8221;, seguidas de inteiros e seus respectivos identificadores de tempo (&#8220;D&#8221; para dias, &#8220;M&#8221; para meses e &#8220;Y&#8221; para anos). Períodos de tempo são precedidos pela letra &#8220;T&#8221; e seguidos de inteiros e seus respectivos identificadores de unidade (&#8220;H&#8221; para horas, &#8220;M&#8221; para minutos e &#8220;S&#8221; para segundos).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$DateTime</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P30D&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// adiciona 30 dias</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P2M&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// adiciona 2 meses</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P5Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// adiciona 5 anos</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P5Y2M30D&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// adiciona 30 dias, 2 meses e 5 anos</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span></pre></div></div>

<p>Note que cada adição é feita com base na adição anterior, uma vez que cada soma modifica a data armazenada no objeto.</p>
<h3><a name="sub">4. Subtraindo períodos de uma data</a></h3>
<p>O método <em>sub</em> funciona da mesma forma que o <em>add</em>, com a mesma lista de parâmetros, mas, logicamente, em vez de adicionar períodos, ele os subtrai.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$DateTime</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sub</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P30D&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// subtrai 30 dias</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sub</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P2M&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// subtrai 2 meses</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sub</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P5Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// subtrai 5 anos</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sub</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;P5Y2M30D&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// subtrai 30 dias, 2 meses e 5 anos</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span></pre></div></div>

<h3><a name="diff">5. Calculando diferença entre datas</a></h3>
<p>Usando o método <em>diff</em>, podemos calcular o intervalo entre duas datas, com precisão de dias, meses, anos, horas, minutos e segundos. Esse método retorna uma instância da classe DateInterval, já citada anteriormente neste artigo.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$DateTime</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$diff</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">diff</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'2009-02-14'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Diferença de:&lt;br /&gt;
&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$diff</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">d</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; dias&lt;br /&gt;
&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$diff</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">m</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; meses&lt;br /&gt;
&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$diff</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">y</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; anos&lt;br /&gt;
&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$diff</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">h</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; horas&lt;br /&gt;
&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$diff</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">i</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; minutos&lt;br /&gt;
&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$diff</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">s</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; segundos&lt;br /&gt;
&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h3><a name="set">6. Modificando a data e a hora do objeto</a></h3>
<p>Para modificar a data e a hora armazenadas no objeto, utilizamos os métodos <em>setDate</em> e <em>setTime</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$DateTime</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y H:i&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setDate</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">2007</span><span style="color: #339933;">,</span> <span style="color: #208080;">07</span><span style="color: #339933;">,</span> <span style="color: #208080;">07</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTime</span><span style="color: #009900;">&#40;</span> <span style="color: #208080;">07</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">27</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$DateTime</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;d/m/Y H:i&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span></pre></div></div>

<p>Espero que tenha ficado tudo claro para todos. A utilização das classes não é difícil. Mais informações podem ser obtidas na documentação oficial.</p>
<p>Link úteis:<br />
<a href="http://br.php.net/manual/en/class.datetime.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/en/class.datetime.php?referer=');">Documentação da classe DateTime</a><br />
<a href="http://br.php.net/manual/en/class.datetimezone.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/en/class.datetimezone.php?referer=');">Documentação da classe DateTimeZone</a><br />
<a href="http://br.php.net/manual/en/class.dateinterval.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/en/class.dateinterval.php?referer=');">Documentação da classe DateTimeInterval</a><br />
<a href="http://br.php.net/manual/en/ref.datetime.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/en/ref.datetime.php?referer=');">Funções de data e hora do PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/php-usando-a-classe-nativa-datetime/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Criando combos (select&#8217;s) dinâmicos com valores padrões</title>
		<link>http://www.rberaldo.com.br/blog/criando-combos-dinamicos-com-valores-padroes/</link>
		<comments>http://www.rberaldo.com.br/blog/criando-combos-dinamicos-com-valores-padroes/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 19:44:20 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[combo]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[dinâmico]]></category>
		<category><![CDATA[padrão]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=151</guid>
		<description><![CDATA[Uma dúvida muito comum - porém de solução bastante simples - é como criar um combo (select) dinâmico e com um valor padrão. Isso pode ser útil ao montar um formulário para edição de dados.]]></description>
			<content:encoded><![CDATA[<p>Uma dúvida muito comum &#8211; porém de solução bastante simples &#8211; é como criar um combo (select) dinâmico e com um valor padrão. Isso pode ser útil ao montar um formulário para edição de dados. Suponha que você possui um sistema em que o usuário escolhe uma dentre diversas opções, por meio de um combo. Para criar um formulário de edição, você deve exibir o combo, mas mostrando a seleção atual.</p>
<p>Para exemplificar, vou usar um simples array com alguns estados brasileiros e uma variável que armazenará o dado que deve aparecer selecionado.</p>
<p><span id="more-151"></span></p>
<p>A exibição do combo, juntamente com o dado selecionado, será realizada por uma função, que percorre o array de dados e compara se o registro corrente é igual ao que deve ser selecionado. Se a comparação retornar TRUE, insere-se o atributo &#8220;selected&#8221; na tag &#8220;option&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$estados</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'PR'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'SP'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'RJ'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'SC'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'RS'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$padrao</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'PR'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> MontaSelect<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$estados</span><span style="color: #339933;">,</span> <span style="color: #000088;">$padrao</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> MontaSelect<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dados</span><span style="color: #339933;">,</span> <span style="color: #000088;">$selected</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;select name=<span style="color: #000099; font-weight: bold;">\&quot;</span>uf<span style="color: #000099; font-weight: bold;">\&quot;</span> id=<span style="color: #000099; font-weight: bold;">\&quot;</span>uf<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$total</span><span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dados</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$total</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$str</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;option value=<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$dados</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dados</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$selected</span> <span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">&quot; selected=<span style="color: #000099; font-weight: bold;">\&quot;</span>true<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&gt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$dados</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;/option&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$str</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;/select&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$str</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A solução é simples, apesar de ser fonte de dúvida frequente em fóruns pela Internet.</p>
<p>Lembrando que é sempre bom efetuar verificação nos tipos de parâmetros da função. Não inseri isso no código, mas é recomendável usar is_array() para verificar a variável $dados, por exemplo, a fim de evitar geração de erros e warnings.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/criando-combos-dinamicos-com-valores-padroes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problemas com codificação: acentos não interpretados</title>
		<link>http://www.rberaldo.com.br/blog/problemas-com-codificacao-acentos-nao-interpretados/</link>
		<comments>http://www.rberaldo.com.br/blog/problemas-com-codificacao-acentos-nao-interpretados/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:07:38 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[acentos]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[codificação]]></category>
		<category><![CDATA[collation]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=120</guid>
		<description><![CDATA[Um dúvida muito recorrente em fóruns concerne a erros com acentuação, quando palavras como "atenção" são exibidas como "aten??o". A solução é simples: padronizar as codificações de arquivos, do banco de dados e do HTML.]]></description>
			<content:encoded><![CDATA[<p>Um dúvida muito recorrente em fóruns concerne a erros com acentuação, quando palavras como &#8220;atenção&#8221; são exibidas como &#8220;aten??o&#8221;. A solução é simples: padronizar as codificações de arquivos, do banco de dados e do HTML.</p>
<p><span id="more-120"></span><br />
A melhor codificação a ser usada é a <a title="UTF-8" href="http://en.wikipedia.org/wiki/Utf-8" target="_blank" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Utf-8?referer=');">UTF-8</a>, que suporta diversos idiomas, e tem sido adotada como codificação padrão em diversas aplicações.</p>
<p>E importante manter todas as codificações iguais, ou seja, todas em UTF-8. Para um site, é preciso atentar para as seguintes codificações:</p>
<h3>Codificação do arquivo propriamente dito</h3>
<p>É a codificação do arquivo dentro do sistema operacional. Ela pode ser modificada por meio do seu editor de textos. Por exemplo:</p>
<p><em>Exemplo de alteração de codificação no editor Gedit</em><br />
<a href='http://img194.imageshack.us/i/encodegedit.png/' title="Clique para ampliar" onclick="urchinTracker('/outgoing/img194.imageshack.us/i/encodegedit.png/?referer=');"><img src='http://img194.imageshack.us/img194/3156/encodegedit.png' border='0' alt='Clique para ampliar'/></a><br />
</p>
<p><em>Exemplo de alteração de codificação no editor Eclipse</em><br />
<a href='http://img4.imageshack.us/i/encodeeclipse.png/' title="Clique para ampliar" onclick="urchinTracker('/outgoing/img4.imageshack.us/i/encodeeclipse.png/?referer=');"><img src='http://img4.imageshack.us/img4/9705/encodeeclipse.png' border='0' alt='Clique para ampliar'/></a></p>
<h3>Codificação do HTML</h3>
<p>A codificação do HTML é definida por meio de meta tag ou da função <a title="header()" href="http://www.php.net/manual/pt_BR/function.header.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/function.header.php?referer=');">header()</a>, do PHP.</p>
<p>Definição por meio de meta tag:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;</pre></div></div>

<p>Definição por meio da função header(), do PHP:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Content-Type: text/html; charset=utf-8'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>Codificação do banco de dados e das tabelas</h3>
<p>Se a sua aplicação usa um banco de dados, ele precisa, também, estar na codificação usada &#8211; UTF-8 no nosso caso. Ela é definida quando se criam o banco de dados e as tabelas. Por exemplo, com MySQL, podemos definir as codificação assim:</p>
<p>Codificação do banco de dados:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> bancodedados <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;</pre></div></div>

<p>Codificação das tabelas:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> tabela<span style="color: #66cc66;">&#40;</span>
	id <span style="color: #993333; font-weight: bold;">SMALLINT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> auto_incre3ment<span style="color: #66cc66;">,</span>
	nome <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	sobrenome <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;</pre></div></div>

<p>Assim, todos os campos do tipo string estarão na codificação utf8.</p>
<h3>Problemas persistentes</h3>
<p>Se você usava codificações diferentes, e, depois, modificou apenas a codificação do banco de dados, as acentuações, provavelmente, continuarão erradas. Não basta apenas mudar a codificação, nesse caso; será necessário passar os dados para outra tabela, que esteja, inicialmente, na codificação correta. É possível fazer essa transferência de dados por meio de apenas uma consulta. Para MySQWL, por exemplo, é possível usar um <a title="INSERT INTO...SELECT" href="http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-select-into-table.html" target="_blank" onclick="urchinTracker('/outgoing/dev.mysql.com/doc/refman/5.0/en/ansi-diff-select-into-table.html?referer=');">INSERT INTO&#8230; SELECT</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/problemas-com-codificacao-acentos-nao-interpretados/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Dica: Tutorial para iniciantes em Zend Framework</title>
		<link>http://www.rberaldo.com.br/blog/dica-tutorial-para-iniciantes-em-zend-framework/</link>
		<comments>http://www.rberaldo.com.br/blog/dica-tutorial-para-iniciantes-em-zend-framework/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 19:08:49 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Dica]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=109</guid>
		<description><![CDATA[O Zend Framework é um dos frameworks mais conhecidos e utilizados com PHP. Neste post, é indicado um link com um tutorial básico sobre essa ferramenta.]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://framework.zend.com" target="_blank" title="Zend Framework" onclick="urchinTracker('/outgoing/framework.zend.com?referer=');">Zend Framework</a> é um dos frameworks mais conhecidos e utilizados com PHP. Por muito tempo quis começar a estudar essa ferramenta, porém sempre faltava tempo ou apareciam outras coisas para fazer. Nesta semana resolvi começar a estudar essa ferramenta. Já estava mais do que na hora de fazer isso.</p>
<p><span id="more-109"></span><br />
Usei um ótimo tutorial para iniciantes e gostaria de compartilhar o link com vocês. O post é constantemente atualizado, conforme saem novas versões do Zend Framework.</p>
<p><a title="Getting Started With Zend Framework" href="http://akrabat.com/zend-framework-tutorial" target="_blank" onclick="urchinTracker('/outgoing/akrabat.com/zend-framework-tutorial?referer=');">Getting Started With Zend Framework</a></p>
<p>Como o nome diz, é apenas um tutorial para mostrar o funcionamento básico. Mas é o suficiente para desenvolver uma aplicação simples e perder o medo do Zend Framework, que parece complexo logo de cara.</p>
<p>Espero que o link lhes seja útil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/dica-tutorial-para-iniciantes-em-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reduzir imagens mantendo a proporção</title>
		<link>http://www.rberaldo.com.br/blog/reduzir-imagens-mantendo-a-proporcao/</link>
		<comments>http://www.rberaldo.com.br/blog/reduzir-imagens-mantendo-a-proporcao/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 03:46:50 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[GD]]></category>
		<category><![CDATA[miniatura]]></category>
		<category><![CDATA[proporção]]></category>
		<category><![CDATA[thumbnail]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=92</guid>
		<description><![CDATA[Muita gente tem dúvida em como reduzir uma imagem mantendo a proporção entre largura e altura. Neste artigo é exibida uma solução simples para esse problema.]]></description>
			<content:encoded><![CDATA[<p>Muita gente tem dúvida em como reduzir uma imagem mantendo a proporção entre largura e altura. A solução é simples. Lógica pura. Matemática, na verdade. :P</p>
<p><span id="more-92"></span><br />
Vamos a um exemplo simples e explicado.</p>
<p>Definimos o caminho à imagem a ser reduzida:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// imagem a ser reduzida</span>
<span style="color: #000088;">$foto</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'foto2.jpg'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Definimos as dimensões máximas da imagem</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// dimensões máximas da imagem, em pixels (largura e altura)</span>
<span style="color: #000088;">$tamMax</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">200</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">240</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Usando a função getimagesize(), do PHP, obtemos a largura, a altura e o tipo da imagem:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 0 =&gt; largura</span>
<span style="color: #666666; font-style: italic;">// 1 =&gt; Altura</span>
<span style="color: #666666; font-style: italic;">// 2 =&gt; Formato da imagem</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$imgLarg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$imgAlt</span><span style="color: #339933;">,</span> <span style="color: #000088;">$imgTipo</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">getimagesize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$foto</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Esta parte faz o cálculo das novas dimensões da imagem</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// verifica se a imagem é maior que o máximo permitido</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$imgLarg</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$tamMax</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$imgAlt</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$tamMax</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// verifica se a largura é maior que a altura</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$imgLarg</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$imgAlt</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$novaLargura</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tamMax</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$novaAltura</span> <span style="color: #339933;">=</span> <span style="color: #990000;">round</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$novaLargura</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$imgLarg</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$imgAlt</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// se a altura for maior que a largura</span>
	<span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$imgAlt</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$imgLarg</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$novaAltura</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tamMax</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$novaLargura</span> <span style="color: #339933;">=</span> <span style="color: #990000;">round</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$novaAltura</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$imgAlt</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$imgLarg</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// altura == largura</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$novaAltura</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$novaLargura</span> <span style="color: #339933;">=</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tamMax</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;não é necessário redimensionar&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Por fim, criamos as imagens, fazemos o redimensionamento e exibimos a imagem desejada no navegador:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// cria a imagem baseada na imagem original</span>
<span style="color: #000088;">$srcImg</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromjpeg</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$foto</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// cria a nova imagem</span>
<span style="color: #000088;">$destImg</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatetruecolor</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$novaLargura</span><span style="color: #339933;">,</span> <span style="color: #000088;">$novaAltura</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// copia para a imagem de destino a imagem original redimensionada</span>
<span style="color: #990000;">imagecopyresampled</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$destImg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$srcImg</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$novaLargura</span><span style="color: #339933;">,</span> <span style="color: #000088;">$novaAltura</span><span style="color: #339933;">,</span> <span style="color: #000088;">$imgLarg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$imgAlt</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// cabeçalho para exibir a imagem no navegador.</span>
<span style="color: #666666; font-style: italic;">// se for salvar em arquivo, não é necessário</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'content-type: image/jpeg'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// exibe a imagem</span>
<span style="color: #990000;">imagejpeg</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$destImg</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// destrói as imagens geradas</span>
<span style="color: #990000;">imagedestroy</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$destImg</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">imagedestroy</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$srcImg</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Usei funções específicas para jpeg pois, nesse caso, usei uma imagem definida no script. Para criar um script genérico, você pode usar o terceiro elemento do array retornado por getimagesize(), a fim de chamar uma função conforme o tipo da imagem. Isso pode ser feito com o auxílio da função call_user_func.</p>
<p>Post simples. Apenas para sanar uma dúvdia recorrente por aí.<br />
Solução simples. :)</p>
<p>Links úteis:<br />
<a title="Referência das funções da biblioteca GD" href="http://br2.php.net/manual/pt_BR/book.image.php" target="_blank" onclick="urchinTracker('/outgoing/br2.php.net/manual/pt_BR/book.image.php?referer=');"> Referência das funções da biblioteca GD</a><br />
<a title="Documentação da função call_user_func" href="http://br2.php.net/manual/pt_BR/function.call-user-func.php" target="_blank" onclick="urchinTracker('/outgoing/br2.php.net/manual/pt_BR/function.call-user-func.php?referer=');"> Documentação da função call_user_func</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/reduzir-imagens-mantendo-a-proporcao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

