<?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>Profissionais TI - Pra quem respira informação &#187; programação</title>
	<atom:link href="http://www.profissionaisti.com.br/tag/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.profissionaisti.com.br</link>
	<description>Pra quem respira informação</description>
	<lastBuildDate>Fri, 10 Feb 2012 16:02:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Validação de formulários com HTML5</title>
		<link>http://www.profissionaisti.com.br/2012/01/validacao-de-formularios-com-html5/</link>
		<comments>http://www.profissionaisti.com.br/2012/01/validacao-de-formularios-com-html5/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 11:31:22 +0000</pubDate>
		<dc:creator>Carlos Eduardo - Kadunew</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=20777</guid>
		<description><![CDATA[HTML5 evoluiu bastante e tem uma série de novidades entre elementos e atributos para formulários. Nesse artigo mostro um pouco sobre validação dos campos de um formulário. Acredito que em um futuro próximo os desenvolvedores não precisarão escrever o código de validação de formulário em JavaScript, por exemplo, já que os navegadores serão capazes de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">HTML5 evoluiu bastante e tem uma série de novidades entre elementos e atributos para formulários. Nesse artigo mostro um pouco sobre <strong>validação dos campos de um formulário</strong>. Acredito que em um futuro próximo os desenvolvedores não precisarão escrever o código de validação de formulário em JavaScript, por exemplo, já que os navegadores serão capazes de fazer tudo isso para nós.</p>
<h3 style="text-align: justify;">Atributo required</h3>
<p style="text-align: justify;"><strong>Utilizamos esse atributo para informar ao navegador que um elemento do formulário é de preenchimento obrigatório</strong>, ou seja, o usuário não consegue enviar o formulário se não preencher o campo com o atributo required. Seu uso é exclusivo com os elementos input, select e textarea.</p>
<p style="text-align: justify;">Uma mensagem é informada ao usuário em uma tentativa de envio de formulário sem o preenchimento de um campo com required. Esse atributo apenas verifica se o campo foi preenchido ou não. Quero dizer que, qualquer caractere será aceito.</p>
<p style="text-align: justify;">&lt;form method=&#8221;post&#8221; action=&#8221;"&gt;<br />
&lt;label for=&#8221;nome&#8221;&gt;Nome: &lt;/label&gt;&lt;input id=&#8221;nome&#8221; type=text required name=nome/&gt;<br />
&lt;input type=submit value=&#8221;OK&#8221;/&gt;<br />
&lt;/form&gt;</p>
<p style="text-align: justify;">Abaixo mostro as mensagens de alerta nos seguintes navegadores: Google Chrome, Firefox e Opera. Perceba que cada fabricante estiliza a mensagem de forma diferente.</p>
<p style="text-align: justify;"><a href="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-html5.png"><img class="alignnone size-medium wp-image-20778" title="validação HTML5" src="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-html5-170x300.png" alt="" width="170" height="300" /></a></p>
<h3 style="text-align: justify;">type=”email”</h3>
<p style="text-align: justify;">Atributo type de um input com a opção igual a email significa definir o campo para receber um <strong>endereço de e-mail válido</strong>. A forma de validação não verifica se o e-mail digitado realmente existe, mas sim se o formato está correto. Exemplo de um formato de email aceito: teste@teste.com.</p>
<p style="text-align: justify;">&lt;form method=&#8221;post&#8221; action=&#8221;"&gt;<br />
&lt;label for=&#8221;email&#8221;&gt;E-mail: &lt;/label&gt;&lt;input id=&#8221;email&#8221; type=email required name=email/&gt;<br />
&lt;input type=submit value=&#8221;OK&#8221;/&gt;<br />
&lt;/form&gt;</p>
<p style="text-align: justify;">Atente para o seguinte: além de ser um campo onde o usuário deve digitar um endereço de e-mail válido o campo é de preenchimento obrigatório.</p>
<p style="text-align: justify;">Alerta para o usuário caso não seja digitado nada no campo input.</p>
<p style="text-align: justify;"><a href="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-input.png"><img class="alignnone size-full wp-image-20779" title="validação input" src="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-input.png" alt="" width="274" height="172" /></a></p>
<p style="text-align: justify;">Alerta para o usuário caso não seja digitado um formato de e-mail no campo input.</p>
<p style="text-align: justify;"><a href="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-email.png"><img class="alignnone size-medium wp-image-20780" title="Validação E-mail" src="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-email-300x176.png" alt="" width="300" height="176" /></a></p>
<p style="text-align: justify;">Um recurso CSS3 pode ser usado para identificar se o elemento do formulário recebeu ou não um dado válido. Esse recurso é a pseudo classe :valid e :invalid. Assim que o usuário digitar um dado válido, o navegador altera a pseudo classe de :invalid para :valid. No exemplo abaixo o campo inicia com uma cor de fundo avermelhada, assim que o usuário digitar um formato de e-mail o campo é alterado para verde.<strong></strong></p>
<p style="text-align: justify;"><strong>Veja o CSS:</strong></p>
<p style="text-align: justify;">#email:valid {background:#006600;color:#fff }<br />
#email:invalid {background:#990000; color:#fff}</p>
<h3 style="text-align: justify;">type=”url”</h3>
<p style="text-align: justify;">Um campo input com type igual a url recebe apenas url’s no seu formato correto, ou seja, http://www.site.com, http://www.site.com.br etc.</p>
<p style="text-align: justify;">&lt;form method=&#8221;post&#8221; action=&#8221;"&gt;<br />
&lt;label for=&#8221;site&#8221;&gt;Site: &lt;/label&gt;&lt;input id=&#8221;email&#8221; type=url required name=site/&gt;<br />
&lt;input type=submit value=&#8221;OK&#8221;/&gt;<br />
&lt;/form&gt;</p>
<p style="text-align: justify;">Mensagem de alerta do navegador Chrome ao digitarmos uma url em um formato inválido.</p>
<p style="text-align: justify;"><a href="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-url.png"><img class="alignnone size-full wp-image-20781" title="Validação URL" src="http://www.profissionaisti.com.br/wp-content/uploads/2012/01/validacao-url.png" alt="" width="277" height="168" /></a></p>
<h3 style="text-align: justify;">pattern = “Expressão”</h3>
<p style="text-align: justify;">Com uso do atributo pattern você pode exigir que o usuário digite valores em um padrão feito com expressão regular, ou seja, o que for digitado no compo input deverá satisfazer a expressão regular criada pelo desenvolvedor.</p>
<p style="text-align: justify;">Explicarei o atribudo criando uma expressão para entrada de um número de telefone. O valor inserido no campo de input deverá iniciar com (xx) logo terá um espaço em branco com uma sequência de quatro dígitos, um traço, e para terminar mais uma sequência de mais quatro dígitos, ficando assim: (xx) xxxx-xxxx.</p>
<p style="text-align: justify;">Abaixo o código para criar a condição descrita acima.</p>
<p style="text-align: justify;">&lt;form&gt;<br />
&lt;label&gt;Telefone: &lt;input required name=&#8221;tel&#8221; pattern=&#8221;\([0-9]{2}\)[\s][0-9]{4}-[0-9]{4}&#8221;/&gt;&lt;/label&gt; (xx) xxxx-xxxx<br />
&lt;input type=submit value=Enviar/&gt;<br />
&lt;/form&gt;</p>
<p style="text-align: justify;"><strong>\([0-9]{2}\)</strong> usuário deve digitar dois números de 0 até 9 entre parênteses.<br />
<strong>[\s][0-9]{4}-[0-9]{4}</strong> um espaço e duas sequências de números divididas por um traço.</p>
<p style="text-align: justify;">Em HTML5 há um valor para o atributo type que é o tel. Ao utilizar esse valor não há máscara de formatação ou validação, já que não há um padrão para números de telefones. Ele serve apenas para informar que o valor do campo é um número de telefone.</p>
<p style="text-align: justify;">Abaixo outro exemplo utilizando o atributo pattern, agora validando CEP</p>
<p style="text-align: justify;">&lt;form&gt;<br />
&lt;label&gt;CEP: &lt;input required name=&#8221;cep&#8221; pattern=&#8221;[0-9]{5}-[0-9]{3}&#8221;/&gt;&lt;/label&gt; (xx) xxxx-xxxx<br />
&lt;input type=submit value=Enviar/&gt;<br />
&lt;/form&gt;</p>
<h3 style="text-align: justify;">novalidate=”novalidate”</h3>
<p style="text-align: justify;">Quando presente dentro do elemento form, especifica que os elementos do formulário não devem ser validados quando submetidos mesmo que tenham em seu type atributos iguais a email, url, etc.</p>
<p style="text-align: justify;">No exemplo acima mesmo que o usuário clique no botão enviar sem preencher os campos com required o formulário será submetido. Isso porque passamos o valor novalidate=&#8221;novalidate&#8221;.</p>
<h3 style="text-align: justify;">Compatibilidade entre navegadores</h3>
<p style="text-align: justify;">Pelos testes que fiz a validação funcionou perfeitamente nos navegadores Chrome, Opera e Firefox em suas últimas versões. Navegadores como Safari e Internet Explorer não foram capazes de reconhecer tais elementos da HTML5.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2012/01/validacao-de-formularios-com-html5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Processos de Software &#8211; Produtividade e Padronização no Desenvolvimento</title>
		<link>http://www.profissionaisti.com.br/2012/01/processos-de-software-produtividade-e-padronizacao-no-desenvolvimento/</link>
		<comments>http://www.profissionaisti.com.br/2012/01/processos-de-software-produtividade-e-padronizacao-no-desenvolvimento/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 11:43:41 +0000</pubDate>
		<dc:creator>Rafael Amaral</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Metodologias]]></category>
		<category><![CDATA[Produtividade]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=20783</guid>
		<description><![CDATA[No artigo anterior sobre Processos de Software e a Qualidade do Produto, foi dito que ter grandes experiências, excelentes conhecimentos técnicos em programação, modelagem de banco de dados, tendências, etc., não são suficientes para gerar um produto de software de qualidade. Tendo em vista todo este otimismo, muitos projetos falham na entrega de suas funcionalidades [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No artigo anterior sobre <a title="Processo de Software e a Qualidade de Produto" href="http://www.profissionaisti.com.br/2011/11/processo-de-software-e-a-qualidade-de-produto/" target="_blank">Processos de Software e a Qualidade do Produto</a>, foi dito que ter grandes experiências, excelentes conhecimentos técnicos em programação, modelagem de banco de dados, tendências, etc., não são suficientes para gerar um produto de software de qualidade. Tendo em vista todo este otimismo, muitos projetos falham na entrega de suas funcionalidades e até mesmo são interrompidos antes de sua conclusão. Pois extrapolam prazos de entrega, geram custos bem acima do previsto ou cobrado, desmotivação da equipe de desenvolvimento recorrente as correções constantes de falhas, alteração de membros da equipe,  o cliente muda frequentemente de opinião e o principal, a insatisfação dele por ter um produto fora de conformidade.</p>
<p style="text-align: justify;"><strong>Então, o que fazer?</strong></p>
<p style="text-align: justify;">A solução estaria então em adotar um <strong>Processo de Software</strong> bem definido. Muitos são os tipos de <strong>processos</strong> e muitas são as necessidades de equipes e das empresas em ter e utilizar um bom <strong>Processo de Software</strong> a fim de adquirir organização e qualidade em seus produtos, respeitando prazos de cronograma, administrando esforços de equipe, obtendo mais produtividade e padronização de desenvolvimento.</p>
<p style="text-align: justify;">Porém, não acredito que exista um único <strong>processo</strong> perfeito para o desenvolvimento de software, ou seja, para adquirir um bom <strong>processo</strong>, deve ser levado em consideração fatores como:</p>
<ul style="text-align: justify;">
<li>Tipo de software que está desenvolvendo;</li>
<li>Tamanho de equipe (desenvolvedor único, dois desenvolvedores, equipe pequena, equipe com mais de 100 membros);</li>
<li>Infraestrutura;</li>
<li>Capital investido;</li>
<li>Entre outros.</li>
</ul>
<p style="text-align: justify;">Entre diversos tipos de <strong>Processos de Softwares</strong>, destacam-se os modelos em Cascata (CMMI), Espiral, Iterativos (PU – Processo Unificado) e os <strong>modelos Ágeis</strong> (XP, Scrum).</p>
<p style="text-align: justify;">Mas por que utilizar um <strong>Processo de Software</strong>?</p>
<p style="text-align: justify;"><img class="aligncenter" title="Rafael Amaral - Processos de Software" src="http://www.rafaelamaral.com.br/images_gerente/image/rafael-amaral-processos-de-software.jpg" alt="Rafael Amaral - Processos de Software" width="452" height="247" /></p>
<p style="text-align: justify;">Dentre alguns fatores, podemos definir que o <strong>Processo de Software</strong> visa à qualidade do produto como um todo, onde é estabelecida a lógica do domínio da aplicação para o projeto decidindo seu scopo e comprometimento do Patrocinador, levantamento dos requisitos, riscos de projeto, padronização de desenvolvimento, construção do modelo e prototipagem, implementação sistemática de testes, feedback do cliente, revisões técnicas, gerência de configuração, etc. Porém, todo este conjunto (o <strong>Processo</strong>) não basta apenas ser implementado, ou seja, deve-se ter o gerenciamento do <strong>processo</strong> como um todo a fim de garantir que ele esteja sendo executado corretamente por seus envolvidos.</p>
<p style="text-align: justify;">Em outras palavras, o <strong>Processo de Software</strong> não é uma tarefa simples de implementar numa organização. Ele “afeta” diretamente seus envolvidos, no qual em alguns casos, são obrigados a saírem de suas zonas de conforto. O <strong>processo</strong> também confronta a cultura de uma empresa, e todo este conjunto gera uma certa resistência dos envolvidos em colaborar para o sucesso do mesmo.</p>
<p style="text-align: justify;">Meu artigo não é de forma alguma induzir o leitor a optar para um <strong>processo</strong> X ou Y, mas sim avaliar o nível caótico de não se utilizar um <strong>processo</strong> e os benefícios conquistados com sua aplicação.</p>
<p style="text-align: justify;">Particularmente, um dos <strong>modelos</strong> que mais me apego são os <strong>modelos Ágeis</strong>, devido a suas práticas, valores e por serem iterativos.</p>
<p style="text-align: justify;">Os modelos iterativo e evolutivo envolvem a imediata programação e teste de um sistema e considera que o desenvolvimento começa antes que os requisitos tenham sido definidos em detalhes. Evitando assim grandes desgastes e desmotivação na fase inicial.</p>
<p style="text-align: justify;">Nesta abordagem de ciclo de vida, o desenvolvimento é organizado em uma série de mini projetos curtos, de duração fixa chamadas de iterações. O produto de cada um é um sistema parcial, executável, testável e integrável. Cada iteração inclui suas próprias atividades de <a title="A análise de sistemas na construção de softwares" href="http://www.profissionaisti.com.br/2011/10/a-analise-de-sistemas-na-construcao-de-softwares/" target="_blank">análise</a> de requisitos, projeto, implementação e teste. No <strong>modelo Ágil</strong>, os detalhes de requisitos são acrescentados no decorrer do <strong>processo</strong>, utilizando assim, a modelagem na perspectiva de principalmente entender o que foi pedido e não documentar.</p>
<p style="text-align: justify;">Ao contrário, nos <strong>modelos</strong> em cascatas (ou sequencial), há uma tentativa de definir em detalhes todos ou a maioria dos requisitos antes da programação e também de criar um projeto abrangente, antes da programação. Igualmente, há uma tentativa de definir um plano ou cronograma confiável logo no início. Outro ponto a ser avaliado, é que neste <strong>modelo</strong>, modificações tardias de requisitos não são bem vindas. Deve levar-se em conta que custos de operações aqui são bem mais altos e é um modelo muito burocrático.</p>
<p style="text-align: justify;">Apesar do meu apego ao <strong>modelo Ágil</strong>, o ideal é que as equipes criem seu próprio <strong>Processo de Software</strong>, olhando na perspectiva de não diminuir o valor de outros métodos e sim, agregando as boas práticas mais comuns que atendam as suas necessidades dentro da sua realidade, não se esquecendo de manter um contínuo amadurecimento do <strong>processo</strong> como um todo.</p>
<p style="text-align: justify;">Fonte: <a href="http://www.rafaelamaral.com.br/" target="_blank">Blog Rafael Amaral</a><br />
Twitter: <a href="http://twitter.com/#%21/rafaelamaralll" target="_blank">@rafaelamaralll</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2012/01/processos-de-software-produtividade-e-padronizacao-no-desenvolvimento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Análise de Sistemas &#8211; Casos de Uso</title>
		<link>http://www.profissionaisti.com.br/2012/01/analise-de-sistemas-casos-de-uso/</link>
		<comments>http://www.profissionaisti.com.br/2012/01/analise-de-sistemas-casos-de-uso/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 10:40:36 +0000</pubDate>
		<dc:creator>Rafael Amaral</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Gestão]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=20648</guid>
		<description><![CDATA[Desde que iniciei meus estudos em Análise de Sistemas, não consigo imaginar uma situação ao qual não usaria Casos de Uso na construção de software. Pois sem dúvida, podemos defini-los como uma ferramenta essencial na captura de requisitos, no planejamento e no controle de um projeto. Um assunto sempre polêmico, mesmo ainda iniciante nesta área, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Desde que iniciei meus estudos em <a title="Análise de Sistema na Construção de Software" href="http://www.profissionaisti.com.br/2011/10/a-analise-de-sistemas-na-construcao-de-softwares/" target="_blank"><strong>Análise de Sistemas</strong></a>, não consigo imaginar uma situação ao qual não usaria <strong>Casos de Uso</strong> na construção de software. Pois sem dúvida, podemos defini-los como uma ferramenta essencial na captura de <strong>requisitos</strong>, no planejamento e no controle de um projeto.</p>
<p style="text-align: justify;">Um assunto sempre polêmico, mesmo ainda iniciante nesta área, tenho visto algumas definições diversificadas de profissionais (especialistas ou não) sobre o tema.</p>
<p style="text-align: justify;">Alguns definem <strong>Casos de Uso</strong> apenas em sua notação gráfica (os diagramas), porém, <strong>Casos de Uso</strong> vão muito além. <strong>Casos de Uso</strong> são elementos primários no <a href="http://www.profissionaisti.com.br/category/desenvolvimento/">desenvolvimento</a> e planejamento do projeto. Ele facilita o entendimento e a comunicação com o stakeholder, pois <strong>Casos de Uso</strong> representam uma visão externa do sistema e aplicando uma boa técnica na sua utilização, eles são com certeza uma melhor maneira de levantar bons <a href="http://www.profissionaisti.com.br/2011/06/levantamento-de-requisitos-voce-sabe-o-que-e/"><strong>requisitos de sistema</strong></a>. Em outras palavras, <strong>Casos de Uso</strong> descrevem o comportamento do sistema sob diversas condições conforme o sistema responde a uma requisição de um ator primário, no qual este (ator primário) inicia uma interação com o sistema para atingir algum objetivo.</p>
<p style="text-align: justify;">Um formato simples para captura de um <strong>Caso de Uso</strong> consiste na descrição de seu cenário primário como uma sequência de passos numerados e as alternativas como variações naquela sequência.</p>
<p style="text-align: justify;">Existe muita variação no modo como você pode descrever os conteúdos de um <strong>Caso de Uso</strong>, porém, a UML não especifica padrão algum. Mas, acrescente informações sempre que julgar necessárias, principalmente, vendo isto pela perspectiva do risco, ou seja, acrescente detalhes de acordo com o grau de risco, quanto maior o risco, mais detalhes você precisa. Mas, não se desespere em detalhes, ou seja, entre neles aos poucos durante sua elaboração e durante as iterações, vá acrescentando mais detalhes à medida do necessário. Porém, chamo sua atenção para a simplicidade, pois um <strong>Caso de Uso</strong> bem escrito é fácil de ler, porém, aprender a escrever um bom caso de uso é difícil.</p>
<p style="text-align: justify;">Mas, o que é realmente, um<strong> Caso de Uso</strong>?</p>
<p style="text-align: center;"><a href="http://www.rafaelamaral.com.br//images_gerente/image/rafael-amaral-casos-de-uso.jpg"><img class="aligncenter" title="Rafael Amaral - Casos de Uso" src="http://www.rafaelamaral.com.br//images_gerente/image/rafael-amaral-casos-de-uso.jpg" alt="Rafael Amaral - Casos de Uso" width="522" height="314" /></a></p>
<p style="text-align: justify;">Um <strong>Caso de Uso</strong> captura um contrato entre os stakeholders de um sistema sobre o seu comportamento. Um <strong>Caso de Uso</strong> descreve o comportamento do sistema sob diversas condições conforme o sistema responde a uma requisição de um ator primário.</p>
<p style="text-align: right;"><em>Alistair Cockburn</em></p>
<p style="text-align: justify;">Uma outra definição mais compreensiva, explico primeiro o que é um cenário.<br />
<strong>Cenário:</strong> é uma sequência de passos que descreve uma interação entre um usuário e um sistema.</p>
<p style="text-align: justify;"><strong>Caso de Uso</strong>, então, é um conjunto de cenários amarrados por um objetivo comum de um usuário.</p>
<p style="text-align: right;"><em>Martin Folwer</em></p>
<p style="text-align: justify;">Finalizando, <strong>Casos de Uso</strong> têm uma grande importância na construção de projeto e é um assunto para mais de &#8220;Gigas&#8221;. Sobre diversos aspectos, eles são essenciais em uma infinidade de coisas desde o início ao fim das iterações do projeto. Para iniciantes na área, dedicar-se na leitura de <a href="http://www.linuxmall.com.br/categoria/livros_programacao?afl=pti" target="_blank">bons livros</a> sobre o assunto irá fazer toda a diferença na hora de analisar e/ou dirigir um projeto.</p>
<p style="text-align: justify;">Fonte: <a href="http://www.rafaelamaral.com.br/" target="_blank">Blog Rafael Amaral</a><br />
Twitter: <a title="Rafael Amaral no Twitter" href="http://twitter.com/#!/rafaelamaralll" target="_blank">@rafaelamaralll</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2012/01/analise-de-sistemas-casos-de-uso/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rails 3 com RVM, GIT, HAML, SASS, COMPASS e 960gs</title>
		<link>http://www.profissionaisti.com.br/2011/12/rails-3-com-rvm-git-haml-sass-compass-e-960gs/</link>
		<comments>http://www.profissionaisti.com.br/2011/12/rails-3-com-rvm-git-haml-sass-compass-e-960gs/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 15:22:25 +0000</pubDate>
		<dc:creator>Diego Brito</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=20519</guid>
		<description><![CDATA[Para quem desenvolve em Ruby on Rails, sabe que iniciar uma aplicação requer ajustes iniciais que nem sempre são rápidos de serem implementados. Pensando nisso, resolvi criar um screencast para que você, em 5 minutos, consiga criar uma aplicação e configurá-la para utilizar o RVM, GIT, HAML, SASS, COMPASS e o 960gs. Veja o que [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Para quem desenvolve em Ruby on Rails, sabe que iniciar uma aplicação requer ajustes iniciais que nem sempre são rápidos de serem implementados. Pensando nisso, resolvi criar um screencast para que você, em 5 minutos, consiga criar uma aplicação e configurá-la para utilizar o RVM, GIT, HAML, SASS, COMPASS e o 960gs.</p>
<p style="text-align: justify;"><strong>Veja o que irei lhe ensinar nesse screencast:</strong></p>
<ul style="text-align: justify;">
<li>Criar um gemset no RVM e automatizar sua inicialização;</li>
<li>Iniciar um repositório GIT local;</li>
<li>Configurar o Ruby on Rails para utilizar RVM, GIT, HAML, SASS, COMPASS e o 960gs;</li>
<li>Definir a time zone como Brasília;</li>
<li>Criar um controller para páginas estáticas com uma página index.</li>
</ul>
<p style="text-align: justify;"><iframe frameborder="0" height="360" src="http://www.youtube.com/embed/E_8mKgY2m8k" width="480"></iframe></p>
<p style="text-align: justify;">Se você quiser ver os arquivos da aplicação, eu os disponibilizei no Github: <a href="https://github.com/diegobrito/screencasts" target="_blank">https://github.com/diegobrito/screencasts</a></p>
<p>Fonte: <a title="Rails 3 com RVM, GIT, HAML, SASS, COMPASS e 960gs" href="http://www.diegobrito.com.br/rails-3-rvm-git-haml-sass-compass-960gs/" target="_blank">Blog de Diego Brito</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/12/rails-3-com-rvm-git-haml-sass-compass-e-960gs/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://www.profissionaisti.com.br/2011/12/curso-de-shell-script-modulo-1-scripts-shell-e-suas-estruturas/</link>
		<comments>http://www.profissionaisti.com.br/2011/12/curso-de-shell-script-modulo-1-scripts-shell-e-suas-estruturas/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 15:04:09 +0000</pubDate>
		<dc:creator>Roberto Beraldo Chaiben</dc:creator>
				<category><![CDATA[Curso Gratuito]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=20049</guid>
		<description><![CDATA[Caso não tenha lido a primeira parte (módulo #0), veja-a em: http://www.profissionaisti.com.br/2011/05/curso-de-shell-script-modulo-0-comandos-basicos-do-linux/ Inicialmente, eu separaria este texto em vários módulos. Porém, optei por fazer 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 style="text-align: justify;">Caso não tenha lido a primeira parte (módulo #0), veja-a em: <a href="http://www.profissionaisti.com.br/2011/05/curso-de-shell-script-modulo-0-comandos-basicos-do-linux/">http://www.profissionaisti.com.br/2011/05/curso-de-shell-script-modulo-0-comandos-basicos-do-linux/</a></p>
<p style="text-align: justify;">Inicialmente, eu separaria este texto em vários módulos. Porém, optei por fazer 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 style="text-align: justify;">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 style="text-align: justify;">Sem mais delongas, vamos ao que interessa! <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3 style="text-align: justify;">Sumário</h3>
<p style="text-align: justify;"><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 style="text-align: justify;"><a name="scripts"></a>0. Scripts Shell</h3>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">O mesmo vale para outras linguagens interpretadas, como PHP, Python, Ruby, Perl etc.</p>
<p style="text-align: justify;">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
&nbsp;
Feito isso, basta executar o script:</pre></div></div>


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

<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;"><a name="vars"></a>1. Variáveis</h3>
<p style="text-align: justify;">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 style="text-align: justify;">É 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 style="text-align: justify;">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 style="text-align: justify;"><a name="envvars"></a>1.1 Variáveis de Ambiente</h4>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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></pre></div></div>

<p style="text-align: justify;">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> =</pre></div></div>

<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;"><a name="espvars"></a>1.2. Variáveis Especiais</h4>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="fluxo"></a>2. Controle de Fluxo</h3>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="cond"></a>2.1. Condicionais</h4>
<h4 style="text-align: justify;"><a name="if"></a>2.1.1. if</h4>
<p style="text-align: justify;">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;">then</span>
    comandos
<span style="color: #000000; font-weight: bold;">elif</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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">O &#8220;-lt&#8221; significa &#8220;<em>less than</em>&#8220;, ou seja, &#8220;<em>menor que</em>&#8220;, equivalendo ao operador &#8220;&lt; &#8220;.</p>
<p style="text-align: justify;">Outros possíveis operadores são:</p>
<p style="text-align: justify;"><strong>Comparação Numérica<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)</strong></p>
<p style="text-align: justify;"><strong>Comparação de Strings</strong><br />
=: É igual<br />
!=: É diferente<br />
-n: É não nula (não vazia)<br />
-z: É nula (vazia)</p>
<p style="text-align: justify;"><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 style="text-align: justify;"><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 style="text-align: justify;"><a name="case"></a>2.1.2. case</h4>
<p style="text-align: justify;">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;">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 style="text-align: justify;">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 style="text-align: justify;"><a name="select"></a>2.1.3. select</h4>
<p style="text-align: justify;">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;">in</span>   ...
<span style="color: #000000; font-weight: bold;">do</span>
    comandos
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p style="text-align: justify;">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 à.</p>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="repeat"></a>2.2. Estruturas de Repetição (Loops)</h4>
<p style="text-align: justify;">Loops são estruturas que permitem fazer iterações sobre algum dado.</p>
<h4 style="text-align: justify;"><a name="for"></a>2.2.1. for</h4>
<p style="text-align: justify;">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;">do</span> <span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">&lt;/</span>var<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p style="text-align: justify;">&#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 style="text-align: justify;">Exemplos:</p>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;"><a name="while"></a>2.2.2. while</h4>
<p style="text-align: justify;">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;">do</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p style="text-align: justify;">Exemplos:</p>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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;">&amp;</span>lt; arquivo.txt</pre></div></div>

<p style="text-align: justify;">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 style="text-align: justify;">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;">&amp;</span>lt; <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 style="text-align: justify;">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 style="text-align: justify;"><a name="until"></a>2.2.3. until&#8230;do</h4>
<p style="text-align: justify;">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;">do</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p style="text-align: justify;">Nesse loop, a condição é oposta à usada no while. Por exemplo:</p>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">Para fazer a mesma coisa, tivemos que usar expressões diferentes na condição do loop.</p>
<h4 style="text-align: justify;"><a name="break"></a>2.2.4. break</h4>
<p style="text-align: justify;">O comando break encerra um loop imediatamente.</p>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="continue"></a>2.2.5. continue</h4>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="cpattern"></a>3. Padrão C/C++ em Expressões &#8220;(())&#8221;</h3>
<p style="text-align: justify;">É 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 style="text-align: justify;">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;">&amp;</span>lt; <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 style="text-align: justify;">É 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;">&amp;</span>lt; <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 style="text-align: justify;"><a name="es"></a>4. Entrada/Saída</h3>
<p style="text-align: justify;">Existem três dispositivos principais, que sempre estão abertos, que merecem destaque:</p>
<p style="text-align: justify;">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 style="text-align: justify;">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. <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4 style="text-align: justify;"><a name="redir"></a>4.1. Redirecionamento</h4>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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;&gt;&#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;">&amp;</span>gt; 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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">Ao usar &#8220;&gt;&#8221; para redirecionar a saída para um arquivo, estamos realizando um redirecionamento destrutivo, ou seja, o comando &#8220;ls &gt; 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;&gt;&gt;&#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;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; listagem
<span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; listagem
<span style="color: #c20cb9; font-weight: bold;">less</span> listagem</pre></div></div>

<p style="text-align: justify;">O redirecionamento neste exemplo, diferentemente do exemplo anterior, é denominado redirecionamento não-destrutivo.</p>
<h3 style="text-align: justify;"><a name="pipe"></a>4.2. Usando Pipelines</h3>
<p style="text-align: justify;">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;">&amp;</span>gt; 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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">É 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;&gt;&#8221;, &#8220;&lt; &#8221; e &#8220;|&#8221;. 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 style="text-align: justify;"><a name="expansoes"></a>5. Expansões</h3>
<p style="text-align: justify;">Expansões são caracteres, ou uma sequência deles, que expressa outro significado. O intuito disso é facilitar e padronizar comandos.</p>
<p style="text-align: justify;">~: 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 style="text-align: justify;">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 style="text-align: justify;"><a name="varexp"></a>5.1. Expansão de Variáveis</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 style="text-align: justify;"><a name="params"></a>6. Parâmetros de linha de comando</h3>
<p style="text-align: justify;">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 style="text-align: justify;">Exemplo:</p>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;"><a name="funcs"></a>7. Definindo Funções</h3>
<p style="text-align: justify;">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>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;"><a name="return"></a>7.1. Retorno de Funções</h4>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">Para retornar valor (status) numa função, usa-se o comando return.</p>
<p style="text-align: justify;">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 style="text-align: justify;">Ao se executar a função, sua saída será &#8220;sou um valor&#8221;; seu retorno será 42.</p>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="er"></a>8. Expressões Regulares em Bash</h3>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="mathexp"></a>9. Expressões Matemáticas</h3>
<p style="text-align: justify;">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 style="text-align: justify;"><a name="bashrc"></a>10. O Arquivo .bashrc</h3>
<p style="text-align: justify;">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 style="text-align: justify;">É possível usar outros editores, não apenas o vim.</p>
<h3 style="text-align: justify;"><a name="alias"></a>11. Aliases (Apelidos)</h3>
<p style="text-align: justify;">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> =</pre></div></div>

<p style="text-align: justify;">Observe que não pode haver espaços em branco antes ou depois do &#8220;=&#8221;.</p>
<p style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">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 style="text-align: justify;">É possível definir aliases em seu .bashrc, para que eles estejam sempre disponíveis na sua sessão.</p>
<h3 style="text-align: justify;"><a name="refs"></a>12. Referências</h3>
<p style="text-align: justify;">Linux Básico:<br />
<a href="http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico/" target="_blank">http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico/</a> ou <a href="http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico.pdf" target="_blank">http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico.pdf</a></p>
<p style="text-align: justify;">Linux Avançado<br />
<a href="http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxAvancado.pdf" target="_blank">http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxAvancado.pdf</a></p>
<p style="text-align: justify;">Canivete Suiço do Shell (Bash)<br />
<a href="http://aurelio.net/shell/canivete/" target="_blank">http://aurelio.net/shell/canivete/</a></p>
<p style="text-align: justify;">Livro Shell Script Profissional (Livro físico):<br />
<a href="http://www.shellscript.com.br/" target="_blank">http://www.shellscript.com.br/</a></p>
<p style="text-align: justify;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p style="text-align: justify;">Originalmente postado no meu blog, em: <a href="http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas" target="_blank">http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas</a></p>
<p style="text-align: justify;">Siga-me no Twitter: <a href="http://twitter.com/rberaldo" target="_blank">@rberaldo</a><br />
Facebook: <a href="http://www.facebook.com/rberaldo42">http://www.facebook.com/rberaldo42</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/12/curso-de-shell-script-modulo-1-scripts-shell-e-suas-estruturas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O Top 10 das linguages de programação</title>
		<link>http://www.profissionaisti.com.br/2011/12/o-top-10-das-linguages-de-programacao/</link>
		<comments>http://www.profissionaisti.com.br/2011/12/o-top-10-das-linguages-de-programacao/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 17:49:38 +0000</pubDate>
		<dc:creator>gabiifonseca</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Mercado]]></category>
		<category><![CDATA[Pesquisa]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=20394</guid>
		<description><![CDATA[Listar linguagens de programação é fácil &#8211; só o Wikipédia tem mais de 600 entradas, mas ordená-las por popularidade é uma tarefa difícil. Você não pode chegar em cada programador e olhar em qual linguagem ele está desenvolvendo para fazer uma lista. Assim, temos que usar algumas técnicas. O primeiro passo seria realizar uma busca [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Listar linguagens de programação é fácil &#8211; só o Wikipédia tem mais de 600 entradas, mas ordená-las por popularidade é uma tarefa difícil. Você não pode chegar em cada programador e olhar em qual linguagem ele está desenvolvendo para fazer uma lista. Assim, temos que usar algumas técnicas.</p>
<p style="text-align: justify;">O primeiro passo seria realizar uma busca na web para ter como base alguns parâmetros. A partir daí podemos lançar perguntas: Quais são as linguagens mais utilizadas no mercado hoje? Em quais delas os programadores da &#8220;elite&#8221; estão desenvolvendo? Nos chats e fóruns, qual é o tema que está sendo mais destacado? O qual estável é esse linguagem? Nas livrarias é fácil encontrar livros &#8211; ou até artigos, sobre ela?</p>
<p style="text-align: justify;">Os dados apresentados aqui vem em grande parte da <a title="TIOBE" href="http://www.tiobe.com/" target="_blank">TIOBE</a>, uma empresa &#8211; ou comunidade &#8211; especializada em pesquisas sobre <a href="http://www.profissionaisti.com.br/tag/software">softwares</a> e que está localizada na Holanda. Essa comunidade lança dados mensalmente em uma espécie de ranking sobre as linguagens mais populares. Dados da <a title="Langs Pop" href="http://langpop.com/" target="_blank"><em>Welton&#8217;s LangsPop.com</em></a>, que mostram resultados de pesquisas individuais, também foram utilizados.</p>
<p style="text-align: justify;">Como caso geral, as linguagens que tem sem mostrado mais populares pela TIOBE não são necessariamente as mais comentadas online pelo desenvolvedores ou as que tem mais material publicado (o C++ é uma exceção!). Uma das linguagens mais procuradas pelos empregadores é o <a href="http://www.treinaweb.com.br/curso/php-avancado/" target="_blank">PHP</a>, usado no desenvolvimento web, e o SQL, utilizado nas queries dos bancos de dados (sem surpresas até aqui!).</p>
<p style="text-align: justify;">O que é realmente interessante é observar o crescimento do Javascript para a construção de aplicativos baseados em Web que conectam o usuário a bancos de dados &#8211; como o Gmail. Na verdade uma das razões para o crescimento do uso do Javascript é a criação da ferramenta V8 Javascript, pela Google, que é um repositório de código de download para o motor JavaScript do Chrome, programado em C + +.</p>
<p style="text-align: justify;">E temos também o Objective-C, que é base para os aplicativos <a href="http://www.treinaweb.com.br/curso/ios-iphone-ipad-basico/" target="_blank">iOS</a>, mas que mal aparecia no Top 40 da TIOBE em 2008. Mas desde então, sua popularidade deu um salto, já que hoje as pessoas estão consumindo mais aplicativos no iPhone e iPad.</p>
<p style="text-align: center;"><a href="http://eufacoprogramas.com/wp-content/uploads/2011/12/linguagens-de-programa%C3%A7%C3%A3o-mais-populares.jpg"><img class="aligncenter size-full wp-image-1461" title="linguagens de programação mais populares" src="http://eufacoprogramas.com/wp-content/uploads/2011/12/linguagens-de-programa%C3%A7%C3%A3o-mais-populares.jpg" alt="linguagens de programação mais populares" width="573" height="426" /></a></p>
<p style="text-align: right;"><span style="color: #888888;"><em>Com informações da publicação Spectrum.iee.org, Outubro-2011 (Pág. 68).</em></span></p>
<p style="text-align: right;"><em>Publicado originalmente em <a title="O top 10 das linguages de programação" href="http://eufacoprogramas.com/desenvolvimento/o-top-10-das-linguages-de-programacao/" target="_blank">Eu Faço Programas</a></em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/12/o-top-10-das-linguages-de-programacao/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Testes de software &#8211; As principais técnicas e porque realizar</title>
		<link>http://www.profissionaisti.com.br/2011/11/testes-de-software-as-principais-tecnicas-e-porque-realizar/</link>
		<comments>http://www.profissionaisti.com.br/2011/11/testes-de-software-as-principais-tecnicas-e-porque-realizar/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 20:57:54 +0000</pubDate>
		<dc:creator>gabiifonseca</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=20215</guid>
		<description><![CDATA[A etapa de testes no processo de desenvolvimento de software ainda é vista com olhos ruins por muita gente. Na verdade, isso existe pelo conflito de interesses: os desenvolvedores de um lado, querendo mostrar que o seu programa é isento de falhas, e a equipe de QA do outro, buscando a qualquer custo encontrar falhas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A etapa de testes no processo de <a href="http://www.profissionaisti.com.br/category/desenvolvimento/">desenvolvimento</a> de software ainda é vista com olhos ruins por muita gente. Na verdade, isso existe pelo conflito de interesses: os desenvolvedores de um lado, querendo mostrar que o seu programa é isento de falhas, e a equipe de QA do outro, buscando a qualquer custo encontrar falhas no sistema.</p>
<p style="text-align: justify;">Mesmo que de certa forma tenhamos que trabalhar esses conflitos, é importante ter outra equipe que teste o que foi desenvolvido. Como já disseram por aí, &#8220;não existe filho feio para a mãe&#8221;, e o programador tem um tendência natural a achar que tudo que desenvolveu está perfeito.</p>
<p style="text-align: justify;">Contudo trabalhar com somente com uma equipe pode não resolver todos os problemas. Ainda que essa seja boa o suficiente para cumprir o seu papel, o usuário é o verdadeiro <em>tester</em>, já que é quem usará o programa no dia-a-dia. Com a ideia do usuário como <em>tester</em> surgem dois conceitos, chamados de <em>Teste Alfa</em> e <em>Teste Beta</em>.</p>
<p style="text-align: justify;">O<strong><em> Teste Alfa</em>  </strong>é aquele realizado no ambiente do desenvolvedor, mas pelo usuário final do programa. Já o <em><strong>Teste Beta </strong></em>é realizado no ambiente do cliente, sem a presença do desenvolvedor, aonde o próprio cliente relata quais são erros observados que serão posteriormente corrigidos.</p>
<p style="text-align: justify;">Os testes de software podem ainda ser classificados quanto a  técnica utilizada. Dentre eles os principais são:</p>
<ul>
<li style="text-align: justify;"><em><strong>Teste Caixa Branca: </strong></em>São os testes estruturais, baseando-se na estrutura e procedimentos utilizados no programa, analisando os laços, condições de <em>if/else. </em>Através do código (ou algoritmo) são analisados casos a busca de erros.<em><strong><br />
</strong></em></li>
<li style="text-align: justify;"><strong><em>Teste Caixa Preta</em></strong>: O teste caixa preta baseia na especificação de interface do programa, observando-se entradas e saídas, ou seja, se a saída produzida realmente condiz com a saída esperada, em relação ao que foi inserido como dado de entrada.</li>
</ul>
<p style="text-align: justify;">Existe ainda a <em><strong>Técnica Baseada em Erros</strong></em>, que se baseiam na inclusão de erros propositais (artificiais) como forma de revelar erros existentes previamente (naturais).</p>
<p style="text-align: justify;">Por fim, lembre-se: bons testes de <a href="http://www.profissionaisti.com.br/tag/software">software</a> são aqueles que apresentam maior probabilidade de revelar erros ainda não descobertos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/11/testes-de-software-as-principais-tecnicas-e-porque-realizar/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A análise de sistemas na construção de softwares</title>
		<link>http://www.profissionaisti.com.br/2011/10/a-analise-de-sistemas-na-construcao-de-softwares/</link>
		<comments>http://www.profissionaisti.com.br/2011/10/a-analise-de-sistemas-na-construcao-de-softwares/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 10:55:49 +0000</pubDate>
		<dc:creator>Rafael Amaral</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=19893</guid>
		<description><![CDATA[Quando se fala em desenvolvimento de softwares, para quem tem bons conhecimentos de programação (ou não), é simples dizer a palavra &#8220;mágica&#8221; que quase sempre já está na ponta da língua: &#8220;Eu tenho a solução!&#8221;, afirmam. Contudo, isso é um grande equívoco que profissionais/empresas cometem. O que alguns profissionais não entendem é que nem sempre [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Quando se fala em desenvolvimento de softwares, para quem tem bons conhecimentos de programação (ou não), é simples dizer a palavra &#8220;mágica&#8221; que quase sempre já está na ponta da língua: &#8220;Eu tenho a solução!&#8221;, afirmam. Contudo, isso é um grande equívoco que profissionais/empresas cometem.</p>
<p style="text-align: justify;">O que alguns profissionais não entendem é que nem sempre o cliente sabe o que quer ou nem sempre consegue expressar o que pensa. E em muitos casos, expressam totalmente o contrário do que realmente queriam passar. É fácil entender isso, levando em consideração pontos tais como: falta de conhecimento de tendências, falta de sensibilidade, falta de conhecimento técnico, entre outros fatores que podemos enumerar. E, consequentemente, há um gasto excessivo de investimento e mão de obra e frustrações dos dois lados são inevitáveis.</p>
<p style="text-align: justify;">É provável que você já deve ter se deparado com vários casos parecidos. Na prática, é bem comum no início do <a title="Omissão de fases de um projeto de software – A armadilha" href="http://www.profissionaisti.com.br/2011/06/omissao-de-fases-de-um-projeto-de-software-a-armadilha/">projeto</a> uma conversa informal com o cliente e depois de quase tudo pronto ele dizer que não era bem aquilo que se esperava. Outro caso, é a mudança contínua das iterações do projeto para atender ao nível &#8220;alto&#8221; de satisfação do cliente (que nunca está satisfeito).</p>
<p style="text-align: justify;">A verdade sobre esses fatores são muitas. A começar pelo preço de custo/benefício, “tempo” e a pressão dos gestores em sua equipe para construírem softwares com tempo cada vez menor, e, contudo, a falta de planejamento sério e de chegar a um nível maduro de entendimento do que realmente o cliente espera do produto final.</p>
<p style="text-align: justify;">Conseguir bons requisitos não é tarefa fácil, e, nem tão pouco, empresas estão interessadas em investir neste tipo de profissional. Investir neste processo, gasta-se um tempo de planejamento, mas algo necessário, ou seja, levando-se pelo ponto de vista maduro, é algo que se ganha lá na frente da iteração do projeto.</p>
<p style="text-align: justify;">Estudos indicam que <a title="Análise de Sistemas: O Levantamento de Requisitos" href="http://www.profissionaisti.com.br/2011/05/analise-de-sistemas-levantamento-de-requisitos/">requisitos</a> detectados depois do software implementado ou erros em sua análise são até 20 vezes mais caros de se corrigir que qualquer outro tipo de erro. A ilustração abaixo mostra a realidade na construção de softwares e podemos até dizer (desconsiderando alguns passos) que em determinados tipos de serviços mais informais, isso também acontece.</p>
<p style="text-align: justify;"><a title="A análise de sistemas na construção de softwares" href="http://www.rafaelamaral.com.br//images_gerente/image/rafael-amaral-analise-de-sistema.jpg" target="_blank"><img class="aligncenter" title="A análise de sistemas na construção de softwares" src="http://www.rafaelamaral.com.br/images_gerente/image/rafael-amaral-analise-de-sistema.jpg" alt="A análise de sistemas na construção de softwares" width="564" height="423" /></a></p>
<p style="text-align: justify;">Essa é uma realidade não apenas no <a href="http://www.profissionaisti.com.br/category/desenvolvimento/">desenvolvimento</a> de softwares, mas é algo corriqueiro e que acontece em nosso cotidiano. Para isso, basta precisarmos de um serviço específico de uma determinada área que desconhecemos, um tipo de conserto de um aparelho, etc. Nestas situações, recebemos muitas opiniões e “conselhos” do que realmente não  se deve fazer. Mas, em alguns casos, encontramos algum bom profissional que realmente está atento a nossa necessidade e provê uma solução ao problema.</p>
<p style="text-align: justify;">“Um bom profissional sabe comunicar o seu jargão técnico com o jargão informal do seu cliente.”</p>
<p style="text-align: justify;">Outro ponto que alguns profissionais (mesmo os melhores) não entendem, é o fato que o cliente não é obrigado a saber/entender de um determinado assunto ou uma necessidade. Isso eu chamo de visão, ou seja, alguns profissionais têm (e conquistam o cliente), outros não.  Saliento a importância em dar à atenção ao cliente e se dedicar em ouvir sua história de forma a entender o que ele quer e para que ele quer.</p>
<p style="text-align: justify;">Especificamente falando de softwares, a análise é fundamental, pois em sua construção, um dos maiores desafios no desenvolvimento é o da construção do sistema certo, que preencha as necessidades dos usuários a um preço razoável. E para que isso aconteça, é preciso atingir boa comunicação e boa compreensão do mundo dos usuários (é onde entra a Análise de Sistemas). Este artigo é uma abordagem bem superficial de uma análise de softwares, onde há várias iterações, bem como sua documentação, no qual a documentação dos requisitos e de casos de uso é uma forma “contratual” entre a equipe de desenvolvimento e o cliente a respeito do software que será desenvolvido. Mas, o artigo aborda um ponto de vista que se deve ter na hora de construir software de qualidade.</p>
<p style="text-align: justify;">Por outro lado, posso afirmar que o grande desafio do analista não se limita apenas em implementar melhores soluções tecnológicas, mas sim em mudar a cultura de uma empresa. Estudar, se dedicar e se especializar no que faz é parte da vida do profissional, mas, saber lidar com essas situações divergentes é o que faz o grande diferencial do profissional e o sucesso no que se faz.</p>
<p style="text-align: justify;">Fonte: <a title="Rafael Amaral" href="http://www.rafaelamaral.com.br/artigos/a-analise-de-sistemas-na-construcao-de-softwares/" target="_blank">Blog Rafael Amaral</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/10/a-analise-de-sistemas-na-construcao-de-softwares/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Os 4 tipos de bons programadores</title>
		<link>http://www.profissionaisti.com.br/2011/10/os-4-tipos-de-bons-programadores/</link>
		<comments>http://www.profissionaisti.com.br/2011/10/os-4-tipos-de-bons-programadores/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 18:21:10 +0000</pubDate>
		<dc:creator>gabiifonseca</dc:creator>
				<category><![CDATA[(In)utilidades]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Programador]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=19895</guid>
		<description><![CDATA[Você se considera um bom programador? Que critérios você utiliza para definir se alguém é um bom programador ou não? Pensando nesses aspectos de como um programador pode ser bom, resolvi criar um artigo do que considero Os quatro tipos de bons programadores. O filósofo O filósofo adora construir códigos bonitos, bem escritos e bem [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Você se considera um bom programador? Que critérios você utiliza para definir se alguém é um bom programador ou não? Pensando nesses aspectos de como um programador pode ser bom, resolvi criar um artigo do que considero <em>Os quatro tipos de bons programadores</em>.</p>
<hr />
<h3>O filósofo</h3>
<p><a href="http://eufacoprogramas.com/wp-content/uploads/2011/10/programadorfilosofo.png"><img class="alignright" style="margin-left: 5px; margin-right: 5px;" title="programadorfilosofo" src="http://eufacoprogramas.com/wp-content/uploads/2011/10/programadorfilosofo.png" alt="programador filosofo" width="200" height="200" /></a></p>
<p style="text-align: justify;">O filósofo adora construir códigos bonitos, bem escritos e bem estruturados. A energia do filósofo é colocada na robustez, elegância e flexibilidade do código e esse tipo de programador não consegue passar uma semana sem citar <em>&#8220;boas práticas&#8221;.</em></p>
<p style="text-align: justify;"><strong><em>Motiva</em>ção</strong></p>
<p style="text-align: justify;">O filósofo é motivado pela necessidade de proteção e segurança que se manifestam pelo controle severo. Um programa bem ordenado e bem escrito, que siga princípios claros são o &#8220;pedacinho do céu&#8221; desse programador. O caos é seu pesadelo. A beleza se dá pela legilibilidade do código.</p>
<p style="text-align: justify;"><em><strong>Superpoderes</strong></em></p>
<ol>
<li>Constroem códigos tão bons que você poderia apostar sua vida neles!</li>
<li>Podem criar ambientes aonde a base do código permaneça em forma pura, independente das habilidades dos outros membros da equipe</li>
<li>Se eles construíram o sistema, ele será escalável</li>
</ol>
<p><em><strong>O Lado Negro</strong></em></p>
<ol>
<li>Sempre acredita estar certo</li>
<li>Se preocupa mais com os casos de teste do que com os problemas do usuário</li>
<li>Nunca considera o sistema como acabado</li>
</ol>
<p><em><strong>Deixe-os com raiva</strong></em></p>
<ol>
<li>Misture espaços com tabs</li>
<li>Evite dar commit e testar seu código</li>
<li>Escale-os para atividades de improvisação</li>
</ol>
<h3>O inventor</h3>
<p><a href="http://eufacoprogramas.com/wp-content/uploads/2011/10/programador-inventor.png"><img class="alignright" style="margin-left: 5px; margin-right: 5px;" title="programador inventor" src="http://eufacoprogramas.com/wp-content/uploads/2011/10/programador-inventor.png" alt="programador inventor" width="200" height="200" /></a></p>
<p style="text-align: justify;">Algo diferente e legal está sempre saindo do &#8220;laboratório&#8221; do inventor. Ninguém lhe pediu nada, mas ele está sempre criando coisas novas.</p>
<p style="text-align: justify;"><strong><em>Motivação</em></strong></p>
<p style="text-align: justify;">O inventor é movido pela necessidade de explorar e dar vida a algo completamentamente novo e único. A curiosidade do <em>&#8220;E se&#8230;&#8221;</em> o leva a procurar novas soluções.</p>
<p style="text-align: justify;"><strong><em>Superpoderes</em></strong></p>
<ol>
<li>Cria novas soluções de tecnologia que (às vezes) são úteis</li>
<li>Tem um entusiasmo contagiantes</li>
<li>Fazem você dizer: <em>&#8220;Nossa, eu nunca tinha pensado nisso dessa maneira&#8221;</em></li>
</ol>
<p><em><strong>O Lado Negro</strong></em></p>
<ol>
<li>Não foi inventado ainda</li>
</ol>
<p><em><strong>Deixe-os com raiva</strong></em></p>
<ol>
<li>Vá contra as ideias dele dizendo que <em>&#8220;Aquele não é o padrão da indústria&#8221;<strong></strong></em></li>
</ol>
<h3>O conquistador</h3>
<p><a href="http://eufacoprogramas.com/wp-content/uploads/2011/10/programador-conquistador.png"><img class="alignright" style="margin-left: 5px; margin-right: 5px;" title="programador conquistador" src="http://eufacoprogramas.com/wp-content/uploads/2011/10/programador-conquistador.png" alt="programador conquistador" width="200" height="200" /></a><br />
Nenhum problema é difícil demais para o conquistador. Para eles, programar é estar em uma odisséia com cada vez mais desafios a superar. O conquistador é esforçado e competitivo, mas não necessariamente competitivo com outras pessoas.</p>
<p><strong><em>Motivação</em></strong></p>
<p>Quando maior o desafio, maior será sua empolgação.</p>
<p><strong><em>Superpoderes</em></strong></p>
<ol>
<li>Consegue resolver problemas que você pensava ser impossíveis</li>
<li>Têm foco mais nítido do que um laser e são mais resistentes do que um corredor de maratona</li>
<li>São uma enciclopédia ambulante de algoritmos</li>
</ol>
<p><em><strong>O Lado Negro</strong></em></p>
<ol>
<li>Vão fazer problemas triviais se tornarem complexos somente pelo prazer de resolve-los<em><strong></strong></em></li>
<li>Estão sempre entediados e aborrecidos</li>
</ol>
<p><em><strong>Deixe-os com raiva</strong></em></p>
<ol>
<li><em><strong></strong></em>Escale-os para atividades simples do tipo CRUD</li>
<li>Force-os a usar linguagens imperativas</li>
<li>Presentei-os com livros de Sudoku Nível Iniciante</li>
</ol>
<h3>O resolvedor de problemas<strong></strong></h3>
<p><strong><a href="http://eufacoprogramas.com/wp-content/uploads/2011/10/programador-resolvedor-de-problemas.png"><img class="alignright" style="margin-left: 5px; margin-right: 5px;" title="programador resolvedor de problemas" src="http://eufacoprogramas.com/wp-content/uploads/2011/10/programador-resolvedor-de-problemas.png" alt="programador resolvedor de problemas" width="200" height="200" /></a></strong><br />
O resolvedor de problemas é uma pessoa determinada e pragmática. Um problema bem definido será resolvido, e resolvidos rapidamente por todos os meios necessários.</p>
<p><em><strong>Motivação</strong></em></p>
<p>Esse programador é focado na agregação de valor. Assim, deixa de lado o processo criativo a fim de entregar exatamente o que lhe foi pedido.</p>
<p><em><strong>SuperPoderes</strong></em></p>
<ol>
<li>Escuta</li>
<li>Resolve</li>
<li>Usa a tecnologia para resolver os problemas do negócio e não para trazer mais problemas</li>
</ol>
<p><strong><em>Lado Negro</em></strong></p>
<ol>
<li>Irrita os programadores<strong><em></em></strong> puristas</li>
<li>Podem ser oportunistas</li>
</ol>
<p><em><strong>Deixe-os com raiva</strong></em></p>
<ol>
<li>Dê a eles muito trabalho</li>
<li>Atribua-lhes tarefas de programação sem qualquer contexto, em que tenham que apenas &#8220;digitar código&#8221;</li>
</ol>
<hr />
<p>E você, se encaixa em alguma dessas classificações? Comente!</p>
<p style="text-align: right;"><em>Postado originalmente em <a title="Quatro Tipos de Programadores" href="http://eufacoprogramas.com/humor/os-quatro-tipos-de-bons-programadores/" target="_blank">Eu Faço Programas</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/10/os-4-tipos-de-bons-programadores/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>O que é Programação Orientada a Aspectos (POA)?</title>
		<link>http://www.profissionaisti.com.br/2011/09/o-que-e-programacao-orientada-a-aspectos-poa/</link>
		<comments>http://www.profissionaisti.com.br/2011/09/o-que-e-programacao-orientada-a-aspectos-poa/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 16:22:49 +0000</pubDate>
		<dc:creator>Luís Gustavo Fabbro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[POA]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=15585</guid>
		<description><![CDATA[As ferramentas de modelagem de sistemas disponíveis para os Arquitetos de Software evoluem em paralelo com as técnicas de programação &#8211; quando um conceito é introduzido numa ferramenta, linguagens de programação rapidamente o incorporam também. Nos tempos em que o DFD (Diagrama de Fluxo de Dados) reinava, a programação de computadores era majoritariamente procedural. Isto [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">As ferramentas de modelagem de sistemas disponíveis para os Arquitetos de Software evoluem em paralelo com as técnicas de programação &#8211; quando um conceito é introduzido numa ferramenta, linguagens de programação rapidamente o incorporam também. Nos tempos em que o <a href="http://pt.wikipedia.org/wiki/Diagrama_de_Fluxos_de_Dados" target="_blank">DFD</a> (Diagrama de Fluxo de Dados) reinava, a programação de computadores era majoritariamente procedural. Isto é, os programas eram construídos com instruções sequenciais que emulavam o fluxo de dados definido pelo Diagrama, utilizando linguagens como o <a href="http://www.treinaweb.com.br/curso/cobol" target="_blank">COBOL</a>, Clipper ou Pascal. Hoje, as linguagems de programação comerciais mais usadas são calcadas no conceito de classes &#8211; <a href="http://www.treinaweb.com.br/curso/java-basico-jse" target="_blank">Java</a>, .Net, Delphi, etc. &#8211; e os sistemas são modelados frequentemente usando Diagramas de Classes e outras ferramentas que constituem a <a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language" target="_blank">UML</a> (Unified Modeling Language).</p>
<p style="text-align: justify;">Essa forma de trabalho, no entanto, obriga o projetista a estabelecer relações entre certas classes que possuem pouco ou nada em comum, resultando em modelagens por vezes confusas e complicadas de se dar manutenção. Para ilustrar essa questão, imagine que você está modelando um sistema com operações que serão tratadas como <a href="http://pt.wikipedia.org/wiki/Banco_de_dados#Transa.C3.A7.C3.A3o" target="_blank">transações</a> no banco de dados.</p>
<p style="text-align: justify;">Neste sistema, haverá operações para movimentação de estoque (com saída de quantidade de um depósito e a respectiva entrada no depósito destino), para registrar contabilizações (envolvendo uma ou mais contas contábeis para débito e crédito) e para efetuar pagamentos a fornecedores. Distingue-se neste cenário a necessidade de modelagem de diversas classes de objetos: item de estoque, conta contábil, movimento de estoque, contabilização, fornecedor, entre outros. Há ainda claramente uma entidade que deve controlar as transações no banco de dados para garantir que as alterações comandadas numa operação sejam tratadas como um bloco único. Embora nada tenham em comum, tanto movimentos de estoque quanto pagamentos a fornecedores devem ser contabilizados. Um diagrama de classes que ilustre essas relações ficará confuso por misturar conceitos de movimentação de itens e de pagamentos. A situação tende a piorar se surgirem outras operações que precisem ser contabilizadas. E do ponto de vista da programação, modificações na classe de contabilização afetarão todas as outras classes, exigindo que estas também sejam revisadas.</p>
<p style="text-align: justify;">Recursos que permeiam várias classes de um sistema, vinculando mesmo aquelas que implementam regras conceitualmente distantes, são chamados de <strong>cross-cutting</strong>. Outros exemplos de recursos assim: criação de logs de operações, auditoria em alteração de dados, níveis de permissão de acesso a dados, autorização para executar operações, tratamento de exceções, etc. Melhorar a solução para esse tipo de recurso é a proposta da <strong>Programação Orientada a Aspectos</strong> (POA), onde o código que implementa os recursos <strong>cross-cutting</strong> são retirados das classes de negócio e inseridos em módulos próprios &#8211; os Aspectos. O código das regras de negócio fica mais limpo e alterações no funcionamento dos recursos <strong>cross-cutting</strong> passam a ser centralizadas no <strong>Aspecto</strong>.</p>
<p style="text-align: justify;">A <strong>POA</strong> depende ainda de um mecanismo que permita vincular a execução dos códigos do <strong>Aspecto</strong> à execução das regras de negócio. A solução proposta pela <strong>POA</strong> é centrado no modelo de pontos de ligação (Join Points). Tal modelo é definido por 3 características: o momento em que o código poderá ser executado &#8211; chamado de <strong>join point</strong> -, uma forma de especificar esses momentos e uma forma de especificar o código que deve ser executado em cada momento.</p>
<p style="text-align: justify;">Um <strong>ponto de ligação</strong> pode ser encarado como um evento que ocorre no código da regra de negócio &#8211; marcado pela execução de um determinado método ou pela alteração no valor de uma propriedade, por exemplo. Criar pontos de ligação significa, portanto, indicar quais desses eventos devem ser monitorados pelo <strong>Aspecto</strong>, usando para isso estruturas chamadas de <strong>pointcuts</strong>. Os <strong>pointcuts</strong> se valem de uma sintaxe especial para possibilitar a indicação de quais métodos e propriedades dispararão a execução do código relativo a um ponto de ligação. Ao código que será executado pelo <strong>Aspecto</strong> quando um ponto de ligação é encontrado dá-se o nome de <strong>Advice</strong>.</p>
<p style="text-align: justify;">Assim como as Classes, Aspectos também podem conter variáveis internas (membros) e ter heranças para especializar seu comportamento, adequando-o a uma função mais específica. Voltando ao exemplo das operações dado no início deste <em>post</em>, uma solução usando Aspectos seria criar um <strong>Aspecto</strong> base para tratar transações com o banco de dados. Isso implica a criação de um ponto de ligação para apontar o início da função que realiza a operação, momento em que o <strong>advice</strong> desse ponto de ligação deve tomar providências para garantir a existência de uma transação no banco de dados. Outro ponto, ao final da operação, deve encerrar a transação. Para cuidar das transações que precisem ser contabilizadas faríamos uma herança desse <strong>Aspecto</strong> e introduziríamos o código necessário num dos pontos de ligação já estabelecidos. Nesta herança, indicaríamos como <strong>pointcuts</strong> apenas as classes expressando regras passíveis de serem contabilizadas.</p>
<p style="text-align: justify;">A experiência mais bem sucedida para popularização da <strong>POA</strong> por enquanto é uma extensão da linguagem Java criada pelo <a href="http://en.wikipedia.org/wiki/PARC_(company)" target="_blank">Centro de Pesquisas da Xerox</a> que tem o nome de <a href="http://en.wikipedia.org/wiki/AspectJ">AspectJ</a>. Trata-se de um projeto <em>open source</em> disponível na <a href="http://www.eclipse.org/" target="_blank">Fundação Eclipse</a>. Há ainda algumas bibliotecas voltadas para C#, <a href="http://csharp-source.net/open-source/aspect-oriented-frameworks" target="_blank">disponíveis na forma de frameworks</a>. O <a href="http://www.embarcadero.com/products/delphi-prism">Delphi Prism</a> &#8211; IDE para programação na plataforma .NET usando a linguagem Delphi &#8211; incorporou uma implementação para uso de <strong>POA</strong> em sua versão 2010 usando para isso recursos do próprio .NET. Veja <a href="http://edn.embarcadero.com/article/40345#27AspectOrientedProgrammingAOP">aqui</a> um exemplo de uso com a sintaxe do Delphi.</p>
<p style="text-align: justify;">Tudo o que foi apresentado aqui não poderia ser resolvido apenas com uso de classes? Sim, poderia. Poderíamos até mesmo implementar tudo em uma solução exclusivamente procedural, se desejássemos. O ponto aqui é que as ferramentas até então existentes podem ser melhoradas para resolverem de forma mais eficiente determinados problemas. Uma nova filosofia está sendo amadurecida no campo da análise de sistemas e da programação e, mais cedo ou mais tarde, as linguagens também terão que evoluir para acompanhá-la consistentemente.</p>
<p style="text-align: justify;"><em>Fonte: <a href="http://balaiotecnologico.blogspot.com/2010/10/um-novo-paradigma-programacao-orientada.html" target="_blank">Balaio Tecnológico</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/09/o-que-e-programacao-orientada-a-aspectos-poa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

