<?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</title>
	<atom:link href="http://rberaldo.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://rberaldo.com.br</link>
	<description>Sempre Berando o Conhecimento</description>
	<lastBuildDate>Fri, 11 May 2012 21:36:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Jogo Chicken Invaders, para iPhone, iPad e iPod Touch</title>
		<link>http://rberaldo.com.br/jogo-chicken-invaders-para-iphone-ipad-e-ipod-touch/</link>
		<comments>http://rberaldo.com.br/jogo-chicken-invaders-para-iphone-ipad-e-ipod-touch/#comments</comments>
		<pubDate>Fri, 11 May 2012 21:36:12 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[aplicativo]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[jogo]]></category>

		<guid isPermaLink="false">http://rberaldo.com.br/?p=571</guid>
		<description><![CDATA[Olá, Pessoal! Há poucos dias foi lançado na App Store o aplicativo (jogo) que desenvolvi recentemente: o Chicken Invaders. Esse jogo é semelhante ao bom e velho Space Invaders, onde o objetivo é matar o maior número de invasores, ou galinhas, nesse caso. :) Vejam o vídeo abaixo: Baixem o jogo no link a seguir: [...]]]></description>
			<content:encoded><![CDATA[<p>Olá, Pessoal!</p>
<p>Há poucos dias foi lançado na App Store o aplicativo (jogo) que desenvolvi recentemente: o Chicken Invaders.</p>
<p>Esse jogo é semelhante ao bom e velho Space Invaders, onde o objetivo é matar o maior número de invasores, ou galinhas, nesse caso. :)</p>
<p>Vejam o vídeo abaixo:<br />
<iframe width="560" height="315" src="http://www.youtube.com/embed/9OCvS1UDdMg" frameborder="0" allowfullscreen></iframe></p>
<p>Baixem o jogo no link a seguir: <a href="http://itunes.apple.com/br/app/chicken-invaders/id516056571?mt=8" target="_blank" title="Link para download do jogo Chicken Invaders" onclick="urchinTracker('/outgoing/itunes.apple.com/br/app/chicken-invaders/id516056571?mt=8&amp;referer=');">http://itunes.apple.com/br/app/chicken-invaders/id516056571?mt=8</a></p>
<p>Abraços e boa diversão! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/jogo-chicken-invaders-para-iphone-ipad-e-ipod-touch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desenvolvimento iOS: como realizar operações multi-thread com NSOperation</title>
		<link>http://rberaldo.com.br/desenvolvimento-ios-como-realizar-operacoes-multi-thread-com-nsoperation/</link>
		<comments>http://rberaldo.com.br/desenvolvimento-ios-como-realizar-operacoes-multi-thread-com-nsoperation/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 03:11:07 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Desenvolvimento iOS]]></category>
		<category><![CDATA[iOS SDK]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[nsoperation]]></category>
		<category><![CDATA[sdk]]></category>
		<category><![CDATA[thread]]></category>

		<guid isPermaLink="false">http://rberaldo.com.br/?p=532</guid>
		<description><![CDATA[Sempre esperamos que nossos dispositivos (principalmente os móveis) sejam rápidos e eficientes, de forma que a execução de uma tarefa A não influa na execução de uma tarefa B. Por exemplo, em um aplicativo altamente ligado à Internet &#8211; como Twitter, Facebook e outros -, esperamos que seja possível atualizar a timeline/feed sem que isso [...]]]></description>
			<content:encoded><![CDATA[<p>Sempre esperamos que nossos dispositivos (principalmente os móveis) sejam rápidos e eficientes, de forma que a execução de uma tarefa A não influa na execução de uma tarefa B. Por exemplo, em um aplicativo altamente ligado à Internet &#8211; como Twitter, Facebook e outros -, esperamos que seja possível atualizar a timeline/feed sem que isso impeça a navegação pelo aplicativo. Para que isso seja possível, as requisições HTTP devem ser realizadas em uma thread diferente da thread principal, que é a responsável pela interface gráfica.</p>
<p>Programação multi-thread é considerada difícil em muitas linguagens, mas a SDK do iOS (do MacOS também) oferece uma forma extremamente simple de executar tarefas em thread distintas. Para isso, usem-se as classes <code>NSOperation</code> e <code>NSOperationQueue</code>.</p>
<p><span id="more-532"></span></p>
<p>Irei mostrar um exemplo simples, onde há duas abas com uma UITableView em cada uma. A primeira, chamada Single Thread, carregará dados para a TableView em apenas uma thread. A segunda, chamada Multi Thread, usará uma thread separada para carregar os mesmos dados. A fonte de dados é <a href="http://rberaldo.com.br/tutoriais/concurrency-test/files.txt" target="_blank">este arquivo texto</a>, que possui 234975 linhas e 3,3 MB de tamanho em disco. Esse arquivo é o resultado de alguns comandos <code>ls</code> no sistema de arquivos.</p>
<p>Os dados são carregados assim que se pressiona o botão &#8220;Load&#8221; no topo da view. Optei por fazer assim para enfatizar o problema de usar só uma thread. Logo entenderão melhor.</p>
<p>A classe <code>NSOperation</code> é uma classe base para outras classes que podem ser inseridas na fila de execução (<code>NSOperationQueue</code>. Ou seja, se quiser executar tarefas em paralelo, você deverá criar uma subclasse de NSOperation. Como faremos um exemplo simples, podemos usar uma subclasse oferecida nativamente pela SDK, a classe <code>NSInvocationOperation</code>.</p>
<p>Vamos à prática!</p>
<p>Crie um novo projeto e adicione duas subclasses de <code>UITableViewController</code>. Nomeie-as como <code>SingleThreadViewController</code> e <code>MultiThreadViewController</code> (ou qualquer outro nome, se preferir).</p>
<p>Na storyboard (ou em XIB&#8217;s, se preferir), crie uma sequência de ViewController&#8217;s conforme mostra a imagem a seguir:</p>
<p><a href="http://rberaldo.com.br/desenvolvimento-ios-como-realizar-operacoes-multi-thread-com-nsoperation/captura-de-tela-2012-03-23-as-23-24-23/" rel="attachment wp-att-558"><img src="http://rberaldo.com.br/wp-content/uploads/2012/03/Captura-de-Tela-2012-03-23-às-23.24.23-300x239.png" alt="storyboard" title="storyboard" width="300" height="239" class="aligncenter size-medium wp-image-558" /></a></p>
<p>A estrutura é basicamente uma view raiz (TabViewController), ligada a duas TableViewController&#8217;s, cada um &#8220;embutido&#8221; em uma NavigationBarController. Em cada NavigationBar, insira o botão &#8220;Load&#8221;, que usaremos para carregar os dados. Não se esqueça de definir as classes das TableViewController&#8217;s e de fazer as conexões do DataSource e do Delegate das TableViews com SingleThreadViewController e MultiThreadViewController.</p>
<p>No arquivo SingleThreadViewController.h, insira um NSArray para armazenar os dados da table view e defina o cabeçalho da IBAction que será chamada ao pressionar o botão Load. O array não precisa ser uma propriedade pois não será acessado de fora da classe.</p>
<p><string>SingleThreadViewController.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> SingleThreadViewController <span style="color: #002200;">:</span> UITableViewController
&lt;UITableViewDelegate, UITableViewDataSource&gt;
<span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// array que será usado como fonte de dados para a UITableView</span>
    <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>arrayData;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// ação a ser executada ao clicar em &quot;Load&quot;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> loadData;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Tendo criado a IBAction, lembre-se de conectá-la ao botão &#8220;Load&#8221;.</p>
<p>No arquivo <code>SingleThreadViewController.m</code>, implemente os métodos do DataSource da tableview e a ação <code>loadData</code>. Vou mostrar o código e explicar logo abaixo o funcionamento do método <code>loadData</code>, que é a única novidade para nós.</p>
<p><string>SingleThreadViewController.m</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;SingleThreadViewController.h&quot;</span>
&nbsp;
&nbsp;
<span style="color: #a61390;">@implementation</span> SingleThreadViewController
&nbsp;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	<span style="color: #11740a; font-style: italic;">// Do any additional setup after loading the view.</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">// aloca espaço para o array que receberá os dados</span>
    arrayData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidUnload
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidUnload<span style="color: #002200;">&#93;</span>;
    <span style="color: #11740a; font-style: italic;">// Release any retained subviews of the main view.</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>shouldAutorotateToInterfaceOrientation<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIInterfaceOrientation<span style="color: #002200;">&#41;</span>interfaceOrientation
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#40;</span>interfaceOrientation <span style="color: #002200;">==</span> UIInterfaceOrientationPortrait<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #6e371a;">#pragma mark - UITableView Data Source Methods</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>section
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>arrayData count<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>cellId <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;bandCell&quot;</span>;
&nbsp;
    UITableViewCell <span style="color: #002200;">*</span>cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>cellId<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithStyle<span style="color: #002200;">:</span>UITableViewCellStyleDefault reuseIdentifier<span style="color: #002200;">:</span>cellId<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    cell.textLabel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>arrayData objectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #6e371a;">#pragma mark - IBActions</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> loadData
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>url <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://rberaldo.com.br/tutoriais/concurrency-test/files.txt&quot;</span>;
    <span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>nsUrl <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span>url<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>strData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithContentsOfURL<span style="color: #002200;">:</span>nsUrl
                                  encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding
                                  error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// remove o útlimo caracter, que é um \n</span>
    strData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>strData substringToIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>strData length<span style="color: #002200;">&#93;</span> <span style="color: #002200;">-</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// divide a string pelo caracter \n</span>
    arrayData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>strData componentsSeparatedByCharactersInSet<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSCharacterSet</span> newlineCharacterSet<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// atualiza a tableview</span>
    <span style="color: #002200;">&#91;</span>self.tableView reloadData<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>No método viewDidLoad, devemos alocar memória para o array. Os métodos do DataSource da UITableView já foram citados em post antigo. Então vamos ao método loadData.</p>
<p>Primeiro, criamos uma string com a URL do arquivo fonte de dados. Em seguida, criamos um objeto NSURL com a URL definida acima. Em seguida, criamos uma string que armazenará o conteúdo total do arquivo. A fim de remover a última quebra de linha, pegamos uma substring da string original. Após isso, basta atribuir a <code>arrayData</code> o conteúdo desse arquivo, dividido pelo caractere &#8220;new line&#8221; (retiramos a última quebra de linha para que não seja criado um elemento vazio na última posição do array). Após isso, basta recarregar a table view, que agora já tem de onde obter os dados.</p>
<p>Neste ponto, já é possível executar o projeto no iOS Simulator e ver o (péssimo) resultado. Note que, ao pressionar &#8220;Load&#8221;, a interface fica travada, não sendo possível mover a table view ou selecionar a segunda aba da TabBar. Isso ocorre pois a requisição HTTP está sendo feita na mesma thread principal do aplicativo.</p>
<p>Vamos resolver esse problema programando a MultiThreadViewController adequadamente.</p>
<p>No arquivo <code>MultiThreadViewController.h</code>, crie o mesmo array da classe anterior e o mesmo cabeçalho da IBAction. Além disso, precisaremos de uma NSOperationQueue, que será usada para gerenciar a fila de operações multi thread.</p>
<p><string>MultiThreadViewController.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> MultiThreadViewController <span style="color: #002200;">:</span> UITableViewController
&lt;UITableViewDelegate, UITableViewDataSource&gt;
<span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// array que será usado como fonte de dados para a UITableView</span>
    <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>arrayData;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// fila de operações executadas em background</span>
    <span style="color: #400080;">NSOperationQueue</span> <span style="color: #002200;">*</span>queue;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">// ação a ser executada ao clicar em &quot;Load&quot;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> loadData;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Lembre-se de, novamente, conectar o botão Load com a IBAction.</p>
<p>O arquivo <code>MultiThreadViewController.m</code> ficará quase igual ao <code>SingleTHreadViewController.m</code>, apenas com algumas diferenças:</p>
<p>1. No método viewDidLoad, devemos alocar memória para nossa NSOperationQueue;<br />
2. O método loadData apenas cria uma NSInvocationOperation, que chama o método que, de fato, carrega os dados no array;<br />
3. O método loadDataInOperation é o método que, de fato, faz a requisição e preenche o array.</p>
<p><string>MultiThreadViewController.m</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;MultiThreadViewController.h&quot;</span>
&nbsp;
&nbsp;
<span style="color: #a61390;">@implementation</span> MultiThreadViewController
&nbsp;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	<span style="color: #11740a; font-style: italic;">// Do any additional setup after loading the view.</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">// aloca espaço para o array que receberá os dados</span>
    arrayData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// aloca espaço para a fila de operações</span>
    queue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSOperationQueue</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidUnload
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidUnload<span style="color: #002200;">&#93;</span>;
    <span style="color: #11740a; font-style: italic;">// Release any retained subviews of the main view.</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>shouldAutorotateToInterfaceOrientation<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIInterfaceOrientation<span style="color: #002200;">&#41;</span>interfaceOrientation
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#40;</span>interfaceOrientation <span style="color: #002200;">==</span> UIInterfaceOrientationPortrait<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span style="color: #6e371a;">#pragma mark - UITableView Data Source Methods</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>section
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>arrayData count<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>cellId <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;bandCell&quot;</span>;
&nbsp;
    UITableViewCell <span style="color: #002200;">*</span>cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>cellId<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithStyle<span style="color: #002200;">:</span>UITableViewCellStyleDefault reuseIdentifier<span style="color: #002200;">:</span>cellId<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    cell.textLabel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>arrayData objectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #6e371a;">#pragma mark - Aux Methods</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// método usado no NSOperation</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> loadDataInOperation
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>url <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://rberaldo.com.br/tutoriais/concurrency-test/files.txt&quot;</span>;
    <span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>nsUrl <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span>url<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>strData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithContentsOfURL<span style="color: #002200;">:</span>nsUrl
                                                 encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding
                                                    error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// remove o útlimo caracter, que é um \n</span>
    strData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>strData substringToIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>strData length<span style="color: #002200;">&#93;</span> <span style="color: #002200;">-</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// divide a string pelo caracter \n</span>
    arrayData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>strData componentsSeparatedByCharactersInSet<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSCharacterSet</span> newlineCharacterSet<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// atualiza a tableview</span>
    <span style="color: #002200;">&#91;</span>self.tableView performSelectorOnMainThread<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>reloadData<span style="color: #002200;">&#41;</span>
                                     withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> waitUntilDone<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #6e371a;">#pragma mark - IBActions</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> loadData
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSInvocationOperation</span> <span style="color: #002200;">*</span>operation <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSInvocationOperation</span> alloc<span style="color: #002200;">&#93;</span>
                                        initWithTarget<span style="color: #002200;">:</span>self
                                        selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>loadDataInOperation<span style="color: #002200;">&#41;</span>
                                        object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>queue addOperation<span style="color: #002200;">:</span>operation<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>No método loadData, criamos um objeto da classe NSInvocationOperation, iniciando-o com uma chamada ao método loadDataInOperation, que está na mesma classe (self), sem lhe passar nenhum objeto como parâmetro (nil). Após criado o objeto, devemos inseri-lo na fila de operações.</p>
<p>O método loadDataInOperation é muito semelhante ao loadData da classe SingleThreadViewController, com apenas uma diferença: ao chamar o método <code>reloadData</code> da table view, devemos especificar que isso deve ser feito na thread principal.</p>
<p>Agora o aplicativo está completo. Pode executá-lo e fazer o carregamento dos dados na segunda aba (Multi Thread). Note que, mesmo após pressionar o botão Load, é possível mexer na view, movendo a table view ou mudando de aba. Isso mostra que a requisição está sendo feita fora da thread principal.</p>
<p>O código-fonte pode ser clonado a partir do GitHub <a href="https://github.com/beraldo/Concurrency-Test" target="_blank" onclick="urchinTracker('/outgoing/github.com/beraldo/Concurrency-Test?referer=');">aqui</a>.</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/desenvolvimento-ios-como-realizar-operacoes-multi-thread-com-nsoperation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desenvolvimento iOS: iniciando com TableView</title>
		<link>http://rberaldo.com.br/desenvolvimento-ios-iniciando-com-tableview/</link>
		<comments>http://rberaldo.com.br/desenvolvimento-ios-iniciando-com-tableview/#comments</comments>
		<pubDate>Sun, 18 Mar 2012 14:16:36 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Desenvolvimento iOS]]></category>
		<category><![CDATA[iOS SDK]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[tableview]]></category>

		<guid isPermaLink="false">http://rberaldo.com.br/?p=535</guid>
		<description><![CDATA[Para iniciar a série de tutoriais sobre Desenvolvimento iOS que pretendo escrever, vou postar um sobre o básico de TableViews. Não pretendo abordar aqui detalhes extremamente básicos sobre o XCode e sobre a SDK do iOS. Essas informações são fáceis de se encontrar pela Internet, inclusive na documentação oficial da Apple. Para informações básicas e [...]]]></description>
			<content:encoded><![CDATA[<p>Para iniciar a série de tutoriais sobre Desenvolvimento iOS que pretendo escrever, vou postar um sobre o básico de TableViews. Não pretendo abordar aqui detalhes extremamente básicos sobre o XCode e sobre a SDK do iOS. Essas informações são fáceis de se encontrar pela Internet, inclusive na documentação oficial da Apple. Para informações básicas e referências iniciais, veja o meu post <a href="http://rberaldo.com.br/links-para-estudos-de-programacao-para-ios/" target="_blank">Desenvolvimento iOS: referências para estudo de programação para iPhone, iPad e iPod Touch</a>.</p>
<p>Neste tutorial, mostrarei como carregar dados em uma TableView. Simplesmente isso, sem transição de telas, apenas exibição de dados e detecção da linha selecionada. O resultado final será o exibido pelas duas imagens abaixo:</p>

<a href='http://rberaldo.com.br/desenvolvimento-ios-iniciando-com-tableview/screenshot_1/' title='Screenshot_1'><img width="65" height="150" src="http://rberaldo.com.br/wp-content/uploads/2012/03/Screenshot_1-65x150.png" class="attachment-thumbnail" alt="Screenshot_1" title="Screenshot_1" /></a>
<a href='http://rberaldo.com.br/desenvolvimento-ios-iniciando-com-tableview/screenshot_2/' title='Screenshot_2'><img width="65" height="150" src="http://rberaldo.com.br/wp-content/uploads/2012/03/Screenshot_2-65x150.png" class="attachment-thumbnail" alt="Screenshot_2" title="Screenshot_2" /></a>

<p><span id="more-535"></span></p>
<p>Ao clicar em uma linha da TableView, será mostrado um alerta (UIAlertView) informando qual linha você selecionou.</p>
<p>Usarei o XCode 4.3.1, iOS SDK 5.1, Storyboards e ativarei o ARC (Automatic Referencing Count), que são as ferramentas mais recentes no momento da escrita deste tutorial, mas a lógica serve para qualquer versão anterior e, provavelmente, posterior.</p>
<p>Vamos colocar a mão na massa!</p>
<p>Crie um novo projeto, com um ViewController (subclasse de UIViewController) e uma storyboard (ou um XIB, caso não esteja usando storyboards). Chamarei a ViewController de ThingsViewController, pois exibirei dados da classe Thing, que criaremos a seguir. Na storyboard, adicione um ViewController e defina a sua classe como sendo a &#8220;ThingsViewController&#8221;, na aba &#8220;Identy Inspector&#8221;. Adicione uma TableView à ViewController adicionada anteriormente.</p>
<p>Crie uma nova classe Objective-C, subclasse de NSObject, chamando-a de Thing. Veja abaixo o cabeçalho e a implementação dessa classe:</p>
<p><strong>Thing.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> Thing <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, copy<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>name;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, copy<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>description;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>Thing <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> initWithName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>n description<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>d;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p><strong>Thing.m</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;Thing.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Thing
&nbsp;
<span style="color: #a61390;">@synthesize</span> name, description;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>Thing <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> initWithName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>n description<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>d
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> <span style="color: #002200;">!</span> <span style="color: #002200;">&#91;</span>self init<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    self.name <span style="color: #002200;">=</span> n;
    self.description <span style="color: #002200;">=</span> d;
&nbsp;
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Criamos duas propriedades: name e description, que armazenarão informações da nossa &#8220;coisa&#8221;. Também criamos um novo inicializador do objeto, que aceita como parâmetro as propriedades da classe.</p>
<p>No arquivo ThingsViewController.h, é necessário importar o arquivo Thing.h, além de criar uma propriedade para a nossa TableView e um array para armazenar as coisas que queremos mostrar na TableView. O array não precisa ser uma propriedades, pois não um IBOutlet e não precisa ser manipulado por outras classes. Lembre-se também de &#8220;adotar&#8221; (<em>adopt</em>) os <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html" target="_blank" onclick="urchinTracker('/outgoing/developer.apple.com/library/mac/_documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html?referer=');">protocolos</a> UITableViewDelegate e UITableViewDataSource. O resultado será este:</p>
<p><strong>ThingsViewController.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
<span style="color: #6e371a;">#import &quot;Thing.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> ThingsViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>thingsArray;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, strong<span style="color: #002200;">&#41;</span> IBOutlet UITableView <span style="color: #002200;">*</span>thingsTableView;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>O maior trabalho agora será no ThingsViewController.m. Lembre-se de fazer um &#8220;@synthsize&#8221; da propriedade thingsTableView:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> ThingsViewController
&nbsp;
<span style="color: #a61390;">@synthesize</span> thingsTableView;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad
<span style="color: #11740a; font-style: italic;">// ...</span></pre></div></div>

<p>Antes de continuar a mexer na implementação da classe, abra novamente o arquivo de interface (o XIB ou a storyboard) e faça as conexões dos objetos:</p>
<p>1. Com a ThingViewController selecionada, no Connections Inspector, conecte o Outlet thingTableView à TableView.<br />
2. Com a TableView selecionada, conecte seu Delegate e seu Data Source com a ThingViewController (ou File&#8217;s Owner, conforme a versão do XCode utilizada).</p>
<p>Agora vamos voltar ao ThingsViewController.m.</p>
<p>No método viewDidLoad, precisamos alocar memória para o array de coisas, criar coisas (instanciar objetos Thing) e adicioná-las ao array. O resultado será isto:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	<span style="color: #11740a; font-style: italic;">// Do any additional setup after loading the view.</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">// aloca espaço para o array de coisas</span>
    thingsArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// cria os objectos da classe Thing e os adicicona ao array</span>
    Thing <span style="color: #002200;">*</span>abacaxi <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Abacaxi&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Fruta amarela&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>abacaxi<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>anta <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Anta&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Um animal inteligente ou uma pessoa burra&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>anta<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>babaca <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Babaca&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Usuário Windows&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>babaca<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>bolovo <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Bolovo&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Bolinho de carne e ovo&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>bolovo<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>cachorra <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Cachorra&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Aquela sua vizinha&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>cachorra<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>cobol <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Cobol&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Linguagem em que seu avô programava&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>cobol<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>coisa <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Coisa&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Tudo o que você imaginar&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>coisa<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>debilMental <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Débil Mental&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Música dos Mamonas Assassinas&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>debilMental<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>estanho <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Estanho&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Metal de número atômico 50&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>estanho<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>estranho <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Estranho&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Você, que está lendo isto&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>estranho<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>feliz <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Feliz&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Você não está se sentindo assi agora&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>feliz<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>girafa <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Girafa&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Um bicho da cor do abacaxi, citado acima&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>girafa<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>google <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Google&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;O Todo Poderoso&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>google<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>horror <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Horror&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;O último programa que você desenvolveu&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>horror<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>idiota <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Idiota&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Seu vizinho&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>idiota<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>java <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Java&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A linguagem mais chata da Galáxia&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>java<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>jegue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Jegue&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Também chamado de jumento&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>jegue<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>jumento <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Jumento&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Também chamado de jegue&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>jumento<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>lontra <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Lontra&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Pteronura brasiliensis&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>lontra<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>objectiveC <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Objective-C&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Sou eu!&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>objectiveC<span style="color: #002200;">&#93;</span>;
&nbsp;
    Thing <span style="color: #002200;">*</span>windows <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Thing alloc<span style="color: #002200;">&#93;</span> initWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Windows&quot;</span> description<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;O vírus mais famoso da Informática&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>thingsArray addObject<span style="color: #002200;">:</span>windows<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Agora que já temos o array cheio de dados, precisamos implementar os métodos dos protocolos UITableViewDataSource, para informar a fonte dos dados e os métodos do protocolo UITableViewDelegate, para manipular a seleção das células.</p>
<p>Do protocolo UITableViewDataSource, precisamos implementar pelo menos estes dois métodos:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>section</pre></div></div>

<p>Esse método informa o número de linhas (células) da TableView.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath</pre></div></div>

<p>Esse método define os dados para cada célula da TableView.</p>
<p>O método numberOfRowsInSection será simples. Como nossa tableview só tem uma seção, basta retornarmos o número de elementos do array de coisas:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>section
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>thingsArray count<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>O método cellForRowAtIndexPath dará um pouco mais de trabalho, mas nada assustador. Precisamos criar a célula (caso ela ainda não exista) e definir os dados exibidos por ela. Vou mostrar o código final desse método e explicar melhor logo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>cellID <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;thingCell&quot;</span>;
&nbsp;
    UITableViewCell <span style="color: #002200;">*</span>cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.thingsTableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>cellID<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">// Com StyleDefault, aparece só o título, sem a descrição</span>
        <span style="color: #11740a; font-style: italic;">//cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];</span>
&nbsp;
        <span style="color: #11740a; font-style: italic;">// Com StyleSubtitle, são mostrados título e descrição</span>
        cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithStyle<span style="color: #002200;">:</span>UITableViewCellStyleSubtitle reuseIdentifier<span style="color: #002200;">:</span>cellID<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    Thing <span style="color: #002200;">*</span>thing <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>thingsArray objectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
    cell.textLabel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>thing name<span style="color: #002200;">&#93;</span>;
    cell.detailTextLabel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>thing description<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// Adiciona imagem à célula</span>
    <span style="color: #11740a; font-style: italic;">//cell.imageView.image = [UIImage imageNamed:@&quot;imagem.png&quot;];</span>
&nbsp;
    <span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>As células têm um identificador, que deve ser sempre o mesmo. Por isso criaremos uma variável &#8220;cellID&#8221; para definir esse valor (ela será definida como <code>static</code> pois só precisa ser inicializada uma vez).</p>
<p>Antes de alocar memória para uma nova célula, usamos o método dequeueReusableCellWithIdentifier, da tableview, para tentarmos pegar uma célula já utilizada pela sistema. Fazemos isso pois, ao rolarmos a tela para baixo, o sistema pode usar as células que foram ocultadas para exibir novos dados. Isso economiza memória. Caso esse método retorne <code>nil</code>, precisamos alocar memória para uma nova célula. Iniciamos a célula com o seu estilo. O estilo Default só mostra o título. O estilo Subtitle mostra título e descrição abaixo. Existem também os estilos Value1 e Value2. Teste-os e veja o resultado. :)</p>
<p>Tendo a célula alocada e pronta para uso, precisamos obter os dados para serem exibidos nela. O parâmetro indexPath contém, dentre outros dados, o número da linha que está sendo exibida. Com esse número, obtemos o indice do array de dados, que é um objeto Thing. Após isso, preenchemos os dados da célula com eles.</p>
<p>Feito isso, você já pode testar o aplicativo. Os dados serão exibidos, mas não acontecerá nada ao selecionar um deles.</p>
<p>Agora vamos implementar a exibição do alerta ao selecionar ma linha. Para isso, devemos implementar um método do protocolo UITableViewDelegate: o método <code>didSelectRowAtIndexPath</code>. Veja sua implementação:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView didSelectRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath
<span style="color: #002200;">&#123;</span>
    Thing <span style="color: #002200;">*</span>thing <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>thingsArray objectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>msg <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Você selecionou: %@&quot;</span>, <span style="color: #002200;">&#91;</span>thing name<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    UIAlertView <span style="color: #002200;">*</span>alert <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIAlertView alloc<span style="color: #002200;">&#93;</span> initWithTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Seleção&quot;</span>
                                              message<span style="color: #002200;">:</span>msg
                                              delegate<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
                                              cancelButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Eu sei disso&quot;</span>
                                              otherButtonTitles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>alert show<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #002200;">&#91;</span>self.thingsTableView deselectRowAtIndexPath<span style="color: #002200;">:</span>indexPath animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>O que fazemos é buscar o objeto da linha selecionada, da mesma forma como fizemos anteriormente, no método cellForRowAtIndexPath. Logo após, criaremos uma string com a mensagem a ser exibida ara o usuário. Em seguida, montamos o alerta (UIAlertView) e o exibimos com seu método <code>show</code>. Por fim, retiramos a seleção da célula, usando o método <code>deselectRowAtIndexPath</code>, da tableview.</p>
<p>Pronto. Basta compilar e testar novamente o aplicativo. Agora é possível selecionar as células e ver o alerta.</p>
<p>Você pode baixar o projeto completo <a href="http://rberaldo.com.br/tutoriais/tableview-example/TableViewExemple.tar.gz">aqui</a> ou cloná-lo a partir do <a href="https://github.com/beraldo/UITableView-Exemple" target="_blank" onclick="urchinTracker('/outgoing/github.com/beraldo/UITableView-Exemple?referer=');">GitHub</a>.</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/desenvolvimento-ios-iniciando-com-tableview/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 5.4 lançado oficialmente</title>
		<link>http://rberaldo.com.br/php-5-4-lancado-oficialmente/</link>
		<comments>http://rberaldo.com.br/php-5-4-lancado-oficialmente/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 11:04:46 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[5.3]]></category>
		<category><![CDATA[5.4]]></category>
		<category><![CDATA[atualização]]></category>
		<category><![CDATA[lançamento]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[verão]]></category>

		<guid isPermaLink="false">http://rberaldo.com.br/?p=525</guid>
		<description><![CDATA[Ontem, dia 1º de março, o lançamento do PHP 5.4 foi anunciado no site oficial. O PHP 5.4 é praticamente o PHP 6 (não foi nomeado PHP 6 devido ao abandono de uma atualização, sobre Unicode, que foi deixada para mais tarde), com muitas novidades e mudanças. O site oficial do PHP disponibiliza o ChangeLog, [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem, dia 1º de março, <a href="http://www.php.net/archive/2012.php#id2012-03-01-1" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/archive/2012.php_id2012-03-01-1?referer=');">o lançamento do PHP 5.4 foi anunciado no site oficial</a>.</p>
<p>O PHP 5.4 é praticamente o PHP 6 (não foi nomeado PHP 6 devido ao abandono de uma atualização, sobre Unicode, que foi deixada para mais tarde), com muitas novidades e mudanças.</p>
<p>O site oficial do PHP disponibiliza o <a href="http://php.net/ChangeLog-5.php" target="_blank" onclick="urchinTracker('/outgoing/php.net/ChangeLog-5.php?referer=');">ChangeLog</a>, além de um <a href="http://ua.php.net/migration54" target="_blank" onclick="urchinTracker('/outgoing/ua.php.net/migration54?referer=');">Guia de Migração do PHP 5.3 para o 5.4</a>, que apresenta as novas funcionalidades, os recursos considerados obsoletos e outros detalhes de migração.</p>
<p>Ainda não testei essa nova versão, por falta de tempo. Mas acredito que tenha sido um ótimo trabalho e que essa nova versão só trará benefícios, por restringir algumas funcionalidades que eram consideradas falhas de segurança, como register_globals e magic_quotes.</p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/php-5-4-lancado-oficialmente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desenvolvimento iOS: referências para estudo de programação para iPhone, iPad e iPod Touch</title>
		<link>http://rberaldo.com.br/links-para-estudos-de-programacao-para-ios/</link>
		<comments>http://rberaldo.com.br/links-para-estudos-de-programacao-para-ios/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 01:32:24 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS SDK]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://rberaldo.com.br/?p=509</guid>
		<description><![CDATA[Os dispositivos móveis (smartphones e tablets, pelo menos por enquanto) estão ganhando espaço no mercado de forma extremamente rápida e intensa. Hoje em dia é difícil conhecer alguém que não possua um desses dispositivos. Junto com esse crescimento, também aumenta o interesse no desenvolvimento de aplicações que rodem nesses dispositivos. Como esse é um mercado [...]]]></description>
			<content:encoded><![CDATA[<p>Os dispositivos móveis (<em>smartphones</em> e <em>tablets</em>, pelo menos por enquanto) estão ganhando espaço no mercado de forma extremamente rápida e intensa. Hoje em dia é difícil conhecer alguém que não possua um desses dispositivos. Junto com esse crescimento, também aumenta o interesse no desenvolvimento de aplicações que rodem nesses dispositivos. </p>
<p>Como esse é um mercado promissor para programadores, resolvi entrar nessa dança. Optei por focar em iOS, inicialmente, pois é o sistema que uso diariamente e com o qual tenho mais contato e afinidade. Porém o Android também é uma plataforma que cresce bastante, com muitas ofertas de trabalho, assim como para iOS. Não entrarei no mérito da discussão de qual é melhor; nenhum é melhor. O usuário é quem deve optar por aquele que satisfaz melhor a suas necessidades.</p>
<p>Neste post, colocarei alguns links que me foram úteis quando eu iniciei meus estudos sobre a SDK do iOS. A maioria é em inglês &#8211; não há muitos materias em português -, mas para quem tem conhecimento intermediário nesse idioma consegue acompanhar até mesmo as vídeo-aulas que indico aqui.</p>
<p><span id="more-509"></span></p>
<p>Para quem ainda não sabe, a linguagem de programação usada no desenvolvimento de aplicativos para iOS (e para Mac OS X também) é Objective-C. No começo você se assusta um pouco com a sintaxe, que herda características do <a href="http://en.wikipedia.org/wiki/Smalltalk" target="_blank" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Smalltalk?referer=');">Smalltalk</a>, mas logo se acostuma. Confesso que prefiro programar em Objective-C à programar em <a href="http://desciclopedia.ws/wiki/Java_(linguagem_de_programa%C3%A7%C3%A3o)" target="_blank" onclick="urchinTracker('/outgoing/desciclopedia.ws/wiki/Java_linguagem_de_programa_C3_A7_C3_A3o?referer=');">Java</a>&#8230; :P</p>
<p>Existem ferramentas que lhe permitem usar outras técnicas para desenvolver aplicativos, como HTML 5. Há frameworks que dizem montar aplicativos que rodam tanto em iOS quanto em Android. A maioria deles cria interfaces WEB, semelhantes às interfaces nativas do sistema. Como o aplicativo final roda no navegador, ele não tem acesso a recursos como Câmera, Acelerômetro etc. Como nunca os usei, não falarei muito deles; apenas citarei que eles existem.</p>
<p>Vale ressaltar que, com a chegada do iOS 5, muitas coisas novas surgiram no desenvolvimento para essa plataforma. Novidades como o ARC (<em>Automatic Reference Couting</em>), que diminui &#8211; quase a zero &#8211; a responsabilidade do programador sobre o gerenciamento de memória, e as <em>Storyboards</em>, que facilitam muito a criação da interface gráfica e a transição entre Views, tornaram a programação para iOS ainda mais robusta e ágil.</p>
<p>Sem muito mais delongas, vamos aos links. Separarei os links em duas seções: links sobre Objective-C e sobre a SDK do iOS, ou Cocoa Touch.</p>
<p>Pretendo atualizar a lista conforme eu for encontrando novas boas referências para estudo. Quem quiser contribuir com outros links, basta adicioná-los nos comentários, que incluo no post.</p>
<p>Alguns links da documentação oficial da Apple talvez só estejam acessíveis para desenvolvedores cadastrados &#8211; o cadastro simples, gratuito, já é suficiente.</p>
<h3>Objective-C</h3>
<p>Documentação oficial da Apple:<br />
<a href="https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html" target="_blank" onclick="urchinTracker('/outgoing/developer.apple.com/library/ios/_documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html?referer=');">https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html</a></p>
<p>Vídeo-aulas de Objective-C, do canal &#8220;MrAppleBR&#8221;, no Youtube (em português)<br />
<a href="http://www.youtube.com/playlist?list=PL6B7343642EE37F97&#038;feature=plcp" target="_blank" onclick="urchinTracker('/outgoing/www.youtube.com/playlist?list=PL6B7343642EE37F97_038_feature=plcp&amp;referer=');">http://www.youtube.com/playlist?list=PL6B7343642EE37F97&#038;feature=plcp</a></p>
<p>Vídeo-aulas da TheNewBoston:<br />
<a href="http://thenewboston.org/list.php?cat=33" target="_blank" onclick="urchinTracker('/outgoing/thenewboston.org/list.php?cat=33&amp;referer=');">http://thenewboston.org/list.php?cat=33</a></p>
<h3>iOS SDK (Cocoa Touch)</h3>
<p>Como criar uma conta de desenvolvedor e publicar aplicativos na App Store<br />
Parte 1: <a href="http://www.raywenderlich.com/8003/how-to-submit-your-app-to-apple-from-no-account-to-app-store-part-1" target="_blank" onclick="urchinTracker('/outgoing/www.raywenderlich.com/8003/how-to-submit-your-app-to-apple-from-no-account-to-app-store-part-1?referer=');">http://www.raywenderlich.com/8003/how-to-submit-your-app-to-apple-from-no-account-to-app-store-part-1</a><br />
Parte 2: <a href="http://www.raywenderlich.com/8045/how-to-submit-your-app-to-apple-from-no-account-to-app-store-part-2" target="_blank" onclick="urchinTracker('/outgoing/www.raywenderlich.com/8045/how-to-submit-your-app-to-apple-from-no-account-to-app-store-part-2?referer=');">http://www.raywenderlich.com/8045/how-to-submit-your-app-to-apple-from-no-account-to-app-store-part-2</a></p>
<p>Lista de tutoriais oficiais da Apple para iniciantes (<em>Getting Started</em>):<br />
<a href="https://developer.apple.com/library/ios/navigation/index.html?section=Resource+Types&#038;topic=Getting+Started" target="_blank" onclick="urchinTracker('/outgoing/developer.apple.com/library/ios/navigation/index.html?section=Resource+Types_038_topic=Getting+Started&amp;referer=');">https://developer.apple.com/library/ios/navigation/index.html?section=Resource+Types&#038;topic=Getting+Started</a></p>
<p>Oficial Apple: Start Developing iOS Apps Today<br />
<a href="https://developer.apple.com/library/ios/#referencelibrary/GettingStarted/RoadMapiOS/Introduction/Introduction.html" target="_blank" onclick="urchinTracker('/outgoing/developer.apple.com/library/ios/_referencelibrary/GettingStarted/RoadMapiOS/Introduction/Introduction.html?referer=');">https://developer.apple.com/library/ios/#referencelibrary/GettingStarted/RoadMapiOS/Introduction/Introduction.html</a></p>
<p>Vídeos oficiais da Apple para iniciantes:<br />
<a href="https://developer.apple.com/videos/ios" target="_blank" onclick="urchinTracker('/outgoing/developer.apple.com/videos/ios?referer=');">https://developer.apple.com/videos/ios</a></p>
<p>Vídeo-aulas da TheNewBoston:<br />
<a href="http://thenewboston.org/list.php?cat=28" target="_blank" onclick="urchinTracker('/outgoing/thenewboston.org/list.php?cat=28&amp;referer=');">http://thenewboston.org/list.php?cat=28</a></p>
<p>Mobile Tutorial (em português):<br />
<a href="http://www.mobiletutorial.com.br" target="_blank" onclick="urchinTracker('/outgoing/www.mobiletutorial.com.br?referer=');">http://www.mobiletutorial.com.br</a></p>
<p>Vídeo-aulas sobre iOS SDK, do canal &#8220;MrAppleBR&#8221;, no Youtube (em português)<br />
<a href="http://www.youtube.com/playlist?list=PL42EBDD0C4102729F&#038;feature=plcp" target="_blank" onclick="urchinTracker('/outgoing/www.youtube.com/playlist?list=PL42EBDD0C4102729F_038_feature=plcp&amp;referer=');">http://www.youtube.com/playlist?list=PL42EBDD0C4102729F&#038;feature=plcp</a></p>
<p>HighOnCoding:<br />
<a href="http://highoncoding.com/Categories/37_Mobile_Development.aspx" target="_blank" onclick="urchinTracker('/outgoing/highoncoding.com/Categories/37_Mobile_Development.aspx?referer=');">http://highoncoding.com/Categories/37_Mobile_Development.aspx</a></p>
<p>Canal &#8220;azamsharp&#8221; no Youtube (o mesmo do HighOnCoding):<br />
<a href="http://www.youtube.com/azamsharp" target="_blank" onclick="urchinTracker('/outgoing/www.youtube.com/azamsharp?referer=');">http://www.youtube.com/azamsharp</a></p>
<p>Ray Wenderlich (Blog com tutoriais sobre programação iOS):<br />
<a href="http://www.raywenderlich.com" target="_blank" onclick="urchinTracker('/outgoing/www.raywenderlich.com?referer=');">http://www.raywenderlich.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/links-para-estudos-de-programacao-para-ios/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CakePHP: Simulando módulos do Zend Framework usando prefixos</title>
		<link>http://rberaldo.com.br/cakephp-simulando-modulos-do-zendframework-usando-prefixos/</link>
		<comments>http://rberaldo.com.br/cakephp-simulando-modulos-do-zendframework-usando-prefixos/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 14:52:31 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[módulo]]></category>
		<category><![CDATA[prefixo]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=504</guid>
		<description><![CDATA[Nunca gostei muito do Zend Framework pois, na minha opinião, ele faz o PHP parecer Java. E como não gosto de Java&#8230; Por isso optei por um framework mais simples, como o CakePHP, que lembra bastante o Rails, para Ruby. Porém, uma coisa muito útil do Zend (e do CodeIgniter também, pelo que li) é [...]]]></description>
			<content:encoded><![CDATA[<p>Nunca gostei muito do Zend Framework pois, na minha opinião, ele faz o PHP parecer Java. E como não gosto de Java&#8230; Por isso optei por um framework mais simples, como o CakePHP, que lembra bastante o Rails, para Ruby.</p>
<p>Porém, uma coisa muito útil do Zend (e do CodeIgniter também, pelo que li) é a possibilidade de usar módulos, os quais permitem você dividir claramente sua aplicação em Área Administrativa, Área do Usuário e a interface pública. Ou seja, você poderia ter URLs como as apresentadas abaixo, podendo, dentro de cada módulo, usar seus controllers e actions:</p>
<p>http://www.seu_site.com/admin</p>
<p>http://www.seu_site.com/usuario</p>
<p>http://www.seu_site.com/</p>
<p>Após um pequeno tempo de pesquisa no Google, vi que o CakePHP não tem módulos. Alguns usam plugins para isso. Porém, existe uma forma de fazer isso nativamente no CakePHP, sem pugins nem outras complicações: prefixos.</p>
<p><span id="more-504"></span></p>
<p>O procedimento é extremamente simples e está descrito na documentação oficial, no link abaixo:</p>
<p><a href="http://book.cakephp.org/1.3/view/950/Prefix-Routing" target="_blank" onclick="urchinTracker('/outgoing/book.cakephp.org/1.3/view/950/Prefix-Routing?referer=');">http://book.cakephp.org/1.3/view/950/Prefix-Routing</a></p>
<p>Em suma, basta editar a configuração &#8220;Routing.prefixes&#8221; em <code>app/Config/core.php</code>, e criar actions e views específicas para cada &#8220;módulo&#8221; (prefixo).</p>
<p>Suponde que queremos os prefixos &#8220;admin&#8221; e &#8220;user&#8221;, precisamos editar a linha citada no arquivo <code>app/Config/core.php</code>, deixando-a assim:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Configure<span style="color: #339933;">::</span><span style="color: #004000;">write</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Routing.prefixes'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user ) );</span></pre></div></div>

<p>Supondo que temos o controller Posts (<code>PostsController.php</code>), se quisermos ter uma ação &#8220;edit&#8221; para usuário e para admin, deveremos criar as actions <code>admin_edit()</code> e <code>user_edit()</code>. E para termos uma view para cada nível de usuário na edição, deveremos criar os arquivos <code>admin_edit.ctp</code> e <code>user_edit.ctp</code>, ambos em <code>app/View/Posts</code>.</p>
<p>Simples, não? :)</p>
<p>Até a próxima!</p>
<p>Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/cakephp-simulando-modulos-do-zendframework-usando-prefixos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Desabafo de um Desenvolvedor WEB</title>
		<link>http://rberaldo.com.br/desabafo-de-um-desenvolvedor-web/</link>
		<comments>http://rberaldo.com.br/desabafo-de-um-desenvolvedor-web/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 19:40:03 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Entretenimento]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[depoimento]]></category>
		<category><![CDATA[desabafo]]></category>
		<category><![CDATA[desenvolvedor]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[programador]]></category>
		<category><![CDATA[vídeo]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=502</guid>
		<description><![CDATA[Depois do famoso Desabafo de um WEB Designer, surgiu o Desabafo de um Desenvolvedor WEB. Garanto que muitos de vocês vão se identificar com o cidadão do vídeo, assim como eu me identifiquei. :)]]></description>
			<content:encoded><![CDATA[<p>Depois do famoso <a href="http://www.rberaldo.com.br/blog/desabafo-de-um-web-designer" onclick="urchinTracker('/outgoing/www.rberaldo.com.br/blog/desabafo-de-um-web-designer?referer=');">Desabafo de um WEB Designer</a>, surgiu o Desabafo de um Desenvolvedor WEB.</p>
<p>Garanto que muitos de vocês vão se identificar com o cidadão do vídeo, assim como eu me identifiquei. :)</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/V-cyaXVmNUQ" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/desabafo-de-um-desenvolvedor-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Formatadores de CSS e JavaScript online</title>
		<link>http://rberaldo.com.br/formatadores-de-css-e-javascript-online/</link>
		<comments>http://rberaldo.com.br/formatadores-de-css-e-javascript-online/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 15:26:44 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[beautifier]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[formatador]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[ilegível]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[legível]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=499</guid>
		<description><![CDATA[Muitas vezes encontramos funcionalidades e estilizações interessantes em alguns sites, que gostaríamos de saber como foram feitas. Aí resolvemos olhar o CSS e o JavaScript deles. É quando nos deparamos com arquivos de uma só linha, sem qualquer condição humana de leitura. Um bom exemplo é a página inicial do Google. Veja um trecho: &#60;!doctype [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes encontramos funcionalidades e estilizações interessantes em alguns sites, que gostaríamos de saber como foram feitas. Aí resolvemos olhar o CSS e o JavaScript deles. É quando nos deparamos com arquivos de uma só linha, sem qualquer condição humana de leitura.</p>
<p>Um bom exemplo é a página inicial do Google. Veja um trecho:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;!doctype html&gt;&lt;html itemscope itemtype=&quot;http://schema.org/WebPage&quot;&gt;&lt;head&gt;&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;&lt;meta itemprop=&quot;image&quot; content=&quot;/images/google_favicon_128.png&quot;&gt;&lt;title&gt;Google&lt;/title&gt;&lt;script&gt;window.google={kEI:&quot;NIQ2T6bFFJS5twfQx53FAg&quot;,getEI:function(a){var d;while(a&amp;&amp;!(a.getAttribute&amp;&amp;(d=a.getAttribute(&quot;eid&quot;))))a=a.parentNode;return d||google.kEI},https:function(){return window.location</pre></div></div>

<p>Isso reduz um pouco o tamanho das páginas, tornando seus carregamentos mais eficientes e rápidos. Mas também incomoda quem queira tirar ideias.</p>
<p>Para isso, existem alguns sites que formatam os códigos HTML, CSS e JavaScript, tornando-os legíveis.</p>
<p><span id="more-499"></span></p>
<p>Os dois que achei mais úteis e fáceis de usar são:</p>
<p>* JavaScript Beautifier (HTML e JavaScript): <a href="http://jsbeautifier.org" title="JavaScript Beautifier" target="_blank" onclick="urchinTracker('/outgoing/jsbeautifier.org?referer=');">http://jsbeautifier.org</a><br />
* Code Beautifier (CSS): <a href="http://www.codebeautifier.com" title="Code Beaultifier" target="_blank" onclick="urchinTracker('/outgoing/www.codebeautifier.com?referer=');">http://www.codebeautifier.com</a></p>
<p>Há outras opções, mas, em uma busca rápida, esses foram os dois que mais me agradaram, por serem simples e fáceis de usar.</p>
<p>Caso conheçam alternativas melhores, postem-nas nos comentários. :)</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/formatadores-de-css-e-javascript-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacbookPro: Usando monitor externo e mantendo o monitor do Mac desligado mesmo com a tampa aberta</title>
		<link>http://rberaldo.com.br/macbookpro-usando-monitor-externo-e-mantendo-o-monitor-desligado-tampa-aberta/</link>
		<comments>http://rberaldo.com.br/macbookpro-usando-monitor-externo-e-mantendo-o-monitor-desligado-tampa-aberta/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 01:49:00 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[aberta]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[externo]]></category>
		<category><![CDATA[gambiarra]]></category>
		<category><![CDATA[imã]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[tampa]]></category>
		<category><![CDATA[truque]]></category>
		<category><![CDATA[tv]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=487</guid>
		<description><![CDATA[Demorou, mas chegou! Primeiro post de 2012! :) Recentemente comprei uma TV Full HD. Obviamente, usarei a TV como monitor para meu Desktop e para meu MacBook Pro. Ao ligar a saída de vídeo do MacBook na TV, eu não obtinha 1080p; em vez disso, ficavam duas faixas pretas laterais, como se não houvesse 1920 [...]]]></description>
			<content:encoded><![CDATA[<p>Demorou, mas chegou! Primeiro post de 2012! :)</p>
<p>Recentemente comprei uma TV Full HD. Obviamente, usarei a TV como monitor para meu Desktop e para meu MacBook Pro. Ao ligar a saída de vídeo do MacBook na TV, eu não obtinha 1080p; em vez disso, ficavam duas faixas pretas laterais, como se não houvesse 1920 pixels de largura. Isso ocorria apenas no modo espelho; no modo estendido, a tela da TV era totalmente preenchida.</p>
<p><a href="http://www.rberaldo.com.br/blog/macbookpro-usando-monitor-externo-e-mantendo-o-monitor-desligado-tampa-aberta/macbookpro_lion/" rel="attachment wp-att-494" onclick="urchinTracker('/outgoing/www.rberaldo.com.br/blog/macbookpro-usando-monitor-externo-e-mantendo-o-monitor-desligado-tampa-aberta/macbookpro_lion/?referer=');"><img src="http://www.rberaldo.com.br/blog/wp-content/uploads/2012/01/MacBookPro_Lion-300x225.jpg" alt="MacBook Pro" title="MacBook Pro" width="300" height="225" class="aligncenter size-medium wp-image-494" /></a></p>
<p>Uma solução que encontrei, buscando na Internet, foi manter a tampa do MacBook fechada e usar mouse e teclado externos, via USB ou Bluetooh. Dois problemas: 1) há risco de super aquecimento; 2) eu não podia usar o teclado nativo, nem o trackpad nativo (que acho um dos pontos mais fortes do MacBook, por ser multitouch), além de prejudicar o som dos alto-falantes e do microfone.</p>
<p>A solução que encontrei foi enganar o Mac, fazendo com que ele pense que a tampa está fechada. O truque é simples: imãs.</p>
<p><span id="more-487"></span></p>
<p>Antes de detalhar o truque, vale ressaltar que essa gambiarra é para usuários do Lion (Mac Os X 10.7). Quem usa o Snow Leopard (10.6) não precisa disso, pois, ao abrir a tampa do MacBook, estando com um monitor externo ligado, o monitor do MacBook continua desligado.</p>
<h3>O Truque</h3>
<p>O MacBook é cheio de imãs, alguns para &#8220;trancar&#8221; a tampa, impedindo que ela se abra sozinha, mas há um especial, responsável por detectar se a tampa está aberta ou fechada. No meu caso (MacBook Pro 13&#8243; de 2011), esse imã está localizado do lado esquerdo e um pouco abaixo da tecla &#8220;fn&#8221;. Essa localização pode variar conforme o modelo do MacBook.</p>
<p>A gambiarra é colocar o imã sobre a localização citada acima e aguardar a tela do MacBook se desligar. Após isso, basta pressionar a tecla Power e a imagem sairá apenas no monitor externo. Após isso, pode retirar o imã, que tudo continua funcionando, inclusive o teclado e o trackpad do MacBook.</p>
<p>Este vídeo ilustra a ideia:</p>
<p><iframe src="http://www.youtube.com/embed/v8s4rex4x0I" frameborder="0" width="560" height="315"></iframe></p>
<p>Essa técnica às vezes falha comigo, mas em poucas vezes. Creio que seja só uma questão de &#8220;pegar o jeito&#8221;. Ainda estou me especializando nessa técnica&#8230; :P</p>
<p>Espero que a dica seja útil a vocês! :)</p>
<p>Abraços </p>
<p>&#8212; Editado</p>
<p>Isso só funcionou para mim no primeiro dia, quando fiz este post. Depois disso, ao retirar o imã, a tela do MacBook volta a ligar, e a TV deixa de exibir em 1080p.</p>
<p>Caso alguém tenha passado por isso e conseguiu resolver, deixe a dica nos comentários. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/macbookpro-usando-monitor-externo-e-mantendo-o-monitor-desligado-tampa-aberta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso de Shell Script &#8211; Módulo #1: Scripts Shell e suas estruturas</title>
		<link>http://rberaldo.com.br/curso-de-shell-script-modulo-1-scripts-shell-estruturas/</link>
		<comments>http://rberaldo.com.br/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/" onclick="urchinTracker('/outgoing/www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/?referer=');">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://rberaldo.com.br/curso-de-shell-script-modulo-1-scripts-shell-estruturas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Você sabe com quem está falando?</title>
		<link>http://rberaldo.com.br/voce-sabe-com-quem-esta-falando/</link>
		<comments>http://rberaldo.com.br/voce-sabe-com-quem-esta-falando/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 14:16:27 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Filosofia]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[cortella]]></category>
		<category><![CDATA[egoísmo]]></category>
		<category><![CDATA[filosofia]]></category>
		<category><![CDATA[mário]]></category>
		<category><![CDATA[palestra]]></category>
		<category><![CDATA[sérgio]]></category>
		<category><![CDATA[universo]]></category>
		<category><![CDATA[vídeo]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=463</guid>
		<description><![CDATA[Enquanto não sobra tempo para escrever mais posts sobre programação (fim de semestre na faculdade é sempre um caos), aqui vai um excelente vídeo sobre quem somos nós e o que representamos.]]></description>
			<content:encoded><![CDATA[<p>Enquanto não sobra tempo para escrever mais posts sobre programação (fim de semestre na faculdade é sempre um caos), aqui vai um excelente vídeo sobre quem somos nós e o que representamos.</p>
<p><iframe width="560" height="349" src="http://www.youtube.com/embed/P3NpHryB-fQ" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/voce-sabe-com-quem-esta-falando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git: controlando versão de seus programas</title>
		<link>http://rberaldo.com.br/git-controlando-versao-de-seus-programas/</link>
		<comments>http://rberaldo.com.br/git-controlando-versao-de-seus-programas/#comments</comments>
		<pubDate>Sun, 15 May 2011 00:35:26 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[CVS]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[controle]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[versão]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=457</guid>
		<description><![CDATA[O Git é um dos sistemas de controle de versão mais utilizados, principalmente em projetos de Software Livre. O SVN (Subversion) também é muito utilizado para controle de versão, mais frequentemente em ambiente Windows. Pretendo mostrar o básico sobre o Git, como criar repositórios, fazer commits, voltar para versão anterior (reverter). Além disso, citarei alguns [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://git-scm.com" target="_blank" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a> é um dos sistemas de controle de versão mais utilizados, principalmente em projetos de Software Livre. O SVN (Subversion) também é muito utilizado para controle de versão, mais frequentemente em ambiente Windows.</p>
<p>Pretendo mostrar o básico sobre o Git, como criar repositórios, fazer commits, voltar para versão anterior (reverter). Além disso, citarei alguns links interessantes com mais conteúdo sobre Git.</p>
<p><span id="more-457"></span></p>
<p>É muito comum trabalhar com repositórios remotos, hospedados em servidores como o GitHub. Outra forma é trabalhar com um repositório local, quando estamos fazendo um trabalho de faculdade, desenvolvendo um software etc.</p>
<p>Vou mostrar como criar repositórios locais. Tutoriais sobre GitHub já existem aos montes pela Internet. O próprio site do GitHub já mostra como proceder para usar repositórios remotos.</p>
<p>Para iniciar um repositório local:</p>

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

<p>Esse comando inicia um repositório no diretório corrente. Um diretório oculto, chamado .git, será criado com as informações do repositório.</p>
<p>A qualquer momento é possível executar o comando abaixo, que exibe o status do repositório, ou seja, mostra se há arquivos modificados, arquivos prontos para serem &#8220;commitados&#8221; etc:</p>

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

<p>Para ver o log de commits, usa-se o comando:</p>

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

<p>Para adicionar arquivos ao controle de versão:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">git</span> add arquivo1.txt arquivo2.txt <span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>Outra possibilidade é adicionar todos os arquivos do diretório atual:</p>

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

<p>Após adicionar um arquivo ao controle de versão, é necessário fazer o commit dele:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">git</span> commit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;mensagem do commit&quot;</span> arquivo1.txt arquivo2.txt <span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>Também é possível usar a opção -a, que faz o commit de todos os arquivos que foram modificados em relação ao último commit:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">git</span> commit <span style="color: #660033;">-a</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;mensagem do commit&quot;</span></pre></div></div>

<p>O Git é um sistema de controle de versão. Logo, é evidente que é possível desfazer mudanças. Se você percebeu que cometeu um erro em um arquivo commitado (ou um cliente odiou a última modificação que você fez no site dele :P ), é possível reverter o repositório para a versão anterior. Para isso, usa-se o comando:</p>

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

<p>Esse comando cria um novo commit, que ignora o último commit realizado, voltando o repositório à versão anterior ao commit problemático.</p>
<p>Para remover um arquivo do controle de versão:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> arquivo1.txt arquivo2.txt <span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>Lembrando que sempre é necessário fazer commit após adição ou remoção de arquivos do controle de versão:</p>
<p>Caso você tenha modificado um arquivo &#8211; sem dar commit nele &#8211; e deseja voltar à versão dele para a versão do commit mais recente, execute:</p>

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

<p>Isso também vale para quando se remove um diretório e se deseja obtê-lo novamente do repositório.</p>
<p>Abaixo estão alguns links muito bons sobre Git, que me auxiliaram bastante quando comecei a mexer com esse sistema de controle de versão.</p>
<p>Git by examples<br />
<a href="http://sysmonblog.co.uk/misc/git_by_example" target="_blank" onclick="urchinTracker('/outgoing/sysmonblog.co.uk/misc/git_by_example?referer=');">http://sysmonblog.co.uk/misc/git_by_example</a></p>
<p>Video-aula sobre git<br />
<a href="http://vimeo.com/20299469" target="_blank" onclick="urchinTracker('/outgoing/vimeo.com/20299469?referer=');">http://vimeo.com/20299469</a></p>
<p>Git para quem conhece SVN<br />
<a href="https://git.wiki.kernel.org/index.php/GitSvnCrashCourse" target="_blank" onclick="urchinTracker('/outgoing/git.wiki.kernel.org/index.php/GitSvnCrashCourse?referer=');">https://git.wiki.kernel.org/index.php/GitSvnCrashCourse</a></p>
<p>Documentação e Tutorial oficial do Git:<br />
<a href="http://git-scm.com/documentation" target="_blank" onclick="urchinTracker('/outgoing/git-scm.com/documentation?referer=');">http://git-scm.com/documentation</a></p>
<p>E para aqueles que insistem em usar um &#8220;Sistema Operacional&#8221; de segunda linha&#8230; :P</p>
<p>Git no Windows<br />
<a href="http://nathanj.github.com/gitguide/tour.html" target="_blank" onclick="urchinTracker('/outgoing/nathanj.github.com/gitguide/tour.html?referer=');">http://nathanj.github.com/gitguide/tour.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/git-controlando-versao-de-seus-programas/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://rberaldo.com.br/curso-shell-script-comandos-basicos-linux/</link>
		<comments>http://rberaldo.com.br/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" onclick="urchinTracker('/outgoing/www.rberaldo.com.br/blog/tutorial-awk?referer=');">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" onclick="urchinTracker('/outgoing/www.rberaldo.com.br/blog/chmod-permissoes-em-sistemas-linux-e-unix-like?referer=');">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/" onclick="urchinTracker('/outgoing/www.rberaldo.com.br/blog/o-comando-sed-do-linux/?referer=');">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" onclick="urchinTracker('/outgoing/www.rberaldo.com.br/blog/usando-o-ssh?referer=');">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://rberaldo.com.br/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://rberaldo.com.br/servidor-web-simples-em-python/</link>
		<comments>http://rberaldo.com.br/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://rberaldo.com.br/servidor-web-simples-em-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Conversão de vídeo AVI em MP4 via linha de comando</title>
		<link>http://rberaldo.com.br/conversao-de-video-avi-em-mp4-via-linha-de-comando/</link>
		<comments>http://rberaldo.com.br/conversao-de-video-avi-em-mp4-via-linha-de-comando/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 20:41:00 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[avi]]></category>
		<category><![CDATA[comando]]></category>
		<category><![CDATA[conversão]]></category>
		<category><![CDATA[mp4]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[terminal]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=436</guid>
		<description><![CDATA[Converter vídeos de AVI para MP4 pode ser útil para muitas coisas, dentre elas, executar os vídeos em iPhones, iPods etc. Em Linux, há programas gráficos para isso, mas a linha de comando é interessante pois permite converter vários arquivos de uma só vez, automaticamente. Por isso mostrarei como executar essa ação via Terminal. Além [...]]]></description>
			<content:encoded><![CDATA[<p>Converter vídeos de AVI para MP4 pode ser útil para muitas coisas, dentre elas, executar os vídeos em iPhones, iPods etc. </p>
<p>Em Linux, há programas gráficos para isso, mas a linha de comando é interessante pois permite converter vários arquivos de uma só vez, automaticamente. Por isso mostrarei como executar essa ação via Terminal. Além disso postarei um Shell Script completo para isso.</p>
<p><span id="more-436"></span></p>
<p>É necessário ter instalados os pacotes <code>mplayer</code> e <code>mencoder</code> para executar os comandos.</p>
<p>Supondo que queremos converter o arquivo <code>video.avi</code> em <code>video.mp4</code>, executaremos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mencoder video.avi <span style="color: #660033;">-o</span> video.mp4 <span style="color: #660033;">-oac</span> copy <span style="color: #660033;">-ovc</span> lavc <span style="color: #660033;">-lavcopts</span> <span style="color: #007800;">vcodec</span>=mpeg1video <span style="color: #660033;">-of</span> mpeg</pre></div></div>

<p>E este é um Shell Script para facilitar a tarefa:</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
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Converte arquivos AVI em MP4</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Sintaxe: avi2mp4.sh arquivo.avi</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Ao fim da execução, será gerado o arquivo arquivo.mp4</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$#</span> <span style="color: #660033;">-ne</span> <span style="color: #000000;">1</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;">&quot;Erro de sintaxe.&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Uso: avi2mp4.sh &lt;video.avi&gt;&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #007800;">FILE</span>=<span style="color: #007800;">$1</span>
<span style="color: #007800;">BASENAME</span>=<span style="color: #800000;">${FILE%.*}</span>
&nbsp;
mencoder <span style="color: #ff0000;">&quot;<span style="color: #007800;">${FILE}</span>&quot;</span> <span style="color: #660033;">-o</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${BASENAME}</span>&quot;</span>.mp4 <span style="color: #660033;">-oac</span> copy <span style="color: #660033;">-ovc</span> lavc <span style="color: #660033;">-lavcopts</span> <span style="color: #007800;">vcodec</span>=mpeg1video <span style="color: #660033;">-of</span> mpeg</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/conversao-de-video-avi-em-mp4-via-linha-de-comando/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A extensão MySQLi do PHP</title>
		<link>http://rberaldo.com.br/a-extensao-mysqli-do-php/</link>
		<comments>http://rberaldo.com.br/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://rberaldo.com.br/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://rberaldo.com.br/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/</link>
		<comments>http://rberaldo.com.br/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://rberaldo.com.br/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://rberaldo.com.br/arquivos-ini-processando-arquivos-de-configuracao-com-php/</link>
		<comments>http://rberaldo.com.br/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://rberaldo.com.br/arquivos-ini-processando-arquivos-de-configuracao-com-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Setlist do primeiro show do Iron Maiden de 2011</title>
		<link>http://rberaldo.com.br/setlist-do-primeiro-show-do-iron-maiden-de-2011/</link>
		<comments>http://rberaldo.com.br/setlist-do-primeiro-show-do-iron-maiden-de-2011/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 21:22:56 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Música]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[heavy]]></category>
		<category><![CDATA[iron]]></category>
		<category><![CDATA[maiden]]></category>
		<category><![CDATA[metal]]></category>
		<category><![CDATA[rússia]]></category>
		<category><![CDATA[show]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=388</guid>
		<description><![CDATA[Setlist do primeiro show do Iron Maiden de 2011, na Rússia]]></description>
			<content:encoded><![CDATA[<p>Hoje o <strong>Iron Maiden</strong> fez o primeiro show da turnê de 2011, em <strong>Olympiski, Moscow, Russia</strong>.</p>
<p>O setlist foi muito bom, mas sempre pensamos &#8220;<strong>Bem que poderia ter tocado aquela&#8230;</strong>&#8220;. História longa, discografia extensa. Difícil agradar a todos.</p>
<p>Sem mais delongas, eis o setlist:</p>
<p>1. Satellite 15&#8230; The Final Frontier<br />
2. El Dorado<br />
3. 2 Minutes to Midnight<br />
4. Coming Home<br />
5. Dance of Death<br />
6. The Trooper<br />
7. The Wicker Man<br />
8. Blood Brothers<br />
9. When the Wild Wind Blows<br />
10. The Evil That Men Do<br />
11. The Talisman<br />
12. Fear of the Dark<br />
13. Iron Maiden </p>
<p>Encore:<br />
14. The Number of the Beast<br />
15. Hallowed Be Thy Name<br />
16. Running Free</p>
<p>Dia <strong>05 de abril</strong> será dia de nós, curitibanos, natos ou não, conferirmos o show do grande <strong>Iron Maiden</strong>, no <strong>Expotrade</strong>!</p>
<p>Vejo vocês lá! =)</p>
<p>Se ainda não comprou ingresso, corra!<br />
<a href="http://www.ingressorapido.com.br/Evento.aspx?ID=13239" target="_blank" onclick="urchinTracker('/outgoing/www.ingressorapido.com.br/Evento.aspx?ID=13239&amp;referer=');">http://www.ingressorapido.com.br/Evento.aspx?ID=13239</a></p>
<p>Fonte: <a href="http://www.setlist.fm/setlist/iron-maiden/2011/olympiski-moscow-russia-bd231fa.html" target="_blank" onclick="urchinTracker('/outgoing/www.setlist.fm/setlist/iron-maiden/2011/olympiski-moscow-russia-bd231fa.html?referer=');">Setlist.fm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/setlist-do-primeiro-show-do-iron-maiden-de-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Print Screen no iPhone</title>
		<link>http://rberaldo.com.br/print-screen-no-iphone/</link>
		<comments>http://rberaldo.com.br/print-screen-no-iphone/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 11:52:19 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[foto]]></category>
		<category><![CDATA[idevice]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[tela]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=384</guid>
		<description><![CDATA[Demonstração de como fazer print screen (foto da tela) no iPhone]]></description>
			<content:encoded><![CDATA[<p>O print screen é muito comum nos desktops. Porém, no iPhone também é possível fazer um print screen.</p>
<p>É uma coisa extremamente simples, mas tem gente que não sabia (eu, por exemplo :P)</p>
<p>Basta pressionar simultaneamente as teclas de <strong>Repouso</strong> e <strong>Início</strong>. O som da câmera será emitido e a foto estará dispoinível no álbum de fotos.</p>
<p><img src="http://www.blogdoiphone.com/wp-content/uploads/2010/10/printscreen.jpg" alt="Imagem ilustrativa do procedimento" /></p>
<p>Fonte<br />
<a href="http://blogdoiphone.com/2010/10/print-screen" target="_blank" onclick="urchinTracker('/outgoing/blogdoiphone.com/2010/10/print-screen?referer=');">http://blogdoiphone.com/2010/10/print-screen</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rberaldo.com.br/print-screen-no-iphone/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

