<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Leandro Nunes]]></title>
  <link href="http://LeandroSNunes.github.com/leandrosnunes/atom.xml" rel="self"/>
  <link href="http://LeandroSNunes.github.com/leandrosnunes/"/>
  <updated>2015-02-10T22:17:55+00:00</updated>
  <id>http://LeandroSNunes.github.com/leandrosnunes/</id>
  <author>
    <name><![CDATA[Leandro Nunes]]></name>
    <email><![CDATA[leandronunes.dev@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Automatização no Processo de Entrega de Software]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2015/02/07/automatizacao-no-processo-de-entrega-de-software/"/>
    <updated>2015-02-07T12:48:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2015/02/07/automatizacao-no-processo-de-entrega-de-software</id>
    <content type="html"><![CDATA[<p>Um grande problema que afeta a qualidade do desenvolvimento é a realização de tarefas importante para a entrega de software que são executadas
manualmente. Este artigo tem o objetivo de mostrar boas práticas de desenvolvimento que vem sendo estudadas ha várias décadas para fornecer ao mundo
uma alternativa às metodologias pesadas e altamente dirigidas por documentação, permitindo aumentar a capacidade de liberar versões do sistema sob
demanda, de gerar releases bem-sucedidos e implantar o sistema em qualquer ambiente simplesmente apertando um botão, sem precisar se preocupar se
funcionará ou não.</p>

<!-- more -->


<blockquote><p>Este artigo foi escrito como requisito da matéria Seminário de Computação e Informática do curso de Ciência da Computação. <a href="https://www.scribd.com/doc/255008188/Automatizac-a-o-no-Processo-de-Entrega-de-Software">Clique aqui para ver o
original</a></p></blockquote>

<h2>1. Introdução</h2>

<p>Com a globalização e o aumento ao acesso a banda larga, o mundo vive uma interação em tempo real. Ideias, tendências, necessidades, informações,
dentre outros, navegam de continente à continente em uma velocidade jamais imaginada, tendo o software como parte fundamental desse processo.
Desenvolver software nesse cenário requer um processo onde uma ideia na mente do cliente vire código funcional e esteja disponível para o usuário
final de maneira rápida e confiável. O tempo para efetuar esse processo, denominado  como tempo de ciclo, pode determinar o rumo dos negócios junto a
concorrência.</p>

<p>Desde 1980, autores como Kent Beck, Martin Fowler, Paul Duvall, Ron Jeffries e Dave Thomas, estudam melhores práticas de desenvolvimento com o
objetivo de poder fornecer ao mundo uma alternativa às metodologias pesadas e altamente dirigidas por documentação que estão em uso até hoje
<a href="#livro5">[5]</a>. Conforme os dos 12 princípios do Manifesto Ágil <a href="#livro6">[6]</a>, o software em funcionamento tem maior valor do que uma
documentação abrangente e software funcional é a medida primária do progresso. Software não gera lucro ou valor até que esteja nas mão de seus
usuários <a href="#livro4">[4]</a>.</p>

<p>Este artigo demonstra boas práticas das metodologias ágil de desenvolvimento para efetuar entrega contínua de software de valor ao cliente, descreve
os passos de como detectar erros mais cedo através da prática da integração contínua, permitindo que se desenvolva software coeso mais rapidamente
<a href="#livro2">[2]</a>. Demonstra o padrão pipeline de entrega, capaz de permitir automatização desde o desenvolvimento do software até sua entrega final.
Conforme Duval <a href="#livro1">[1]</a>, o pipeline de entrega é um processo no qual diversos tipos de tarefas são executadas com base no sucesso da tarefa anterior.</p>

<p>Com a automatização dos processos, a entrega de software se torna confiável, previsível, com riscos quantificáveis e bem entendidos, garantindo que
quando for preciso fazer alguma modificação, o tempo para realizá-las, colocá-las em produção e em uso, seja o menor possível e, que problemas sejam
encontrados cedo o bastante para que sejam fáceis de corrigir.</p>

<p>O pipeline envolve atividades de todos os interessados pela entrega de software, amplia as taxas de implantação e fomenta práticas do movimento
DevOps, criando um relacionamento colaborativo entre as equipes de desenvolvimento, qualidade e de operações. Automatizar os processos de forma que
todos os envolvidos possam executar tarefas (que até então são manuais) de forma assíncrona, melhora produtividade e a quantidade de entregas de valor
dentro de tempo de ciclo, permitindo implantar o sistema para qualquer ambiente instantaneamente, refletindo as mudanças de uma forma eficiente e com
baixo custo.</p>

<h2>2. Metodologias Ágeis de Desenvolvimento</h2>

<p>Os processos das metodologias tradicionais não acompanharam a evolução do tráfico de informações. Conforme Humble e Farley <a href="#livro4">[4]</a>, o principal problema
enfrentado pelos profissionais da área de desenvolvimento de software é como fazer para transformar uma boa ideia em um sistema e entregá-lo aos
usuários o quanto antes.</p>

<p>Em busca de valorizar a importância da interação entre os envolvidos e a entrega de software de valor ao cliente a curto prazo, em 2001, 17 pensadores
de desenvolvimento de software se reuniram e concordaram que, em suas experiências prévias, um pequeno conjunto de princípios sempre parecia ter sido
respeitado quando os projetos davam certo. Esses princípios foram reunidos no Manifesto Ágil <a href="#livro6">[6]</a>.</p>

<p>Kent Beck definiu um conjunto de valores, princípios e práticas que resultou em um trabalho denominado Extreme Programming (XP). Segundo Sato
<a href="#livro9">[9]</a>, a XP foi uma das primeiras metodologias ágeis que revolucionou a forma como os softwares eram desenvolvidos e, além de se basear em
valores para guiar o desenvolvimento, tais como a comunicação clara entre os envolvidos, a simplicidade em fazer o suficiente para atender as
necessidades, o feedback para direcionar o produto e a coragem de efetuar mudanças, trazem uma serie de práticas, como a integração contínua (IC), o
desenvolvimento guiado por testes e a refatoração. Práticas que quando aplicadas, contribuem para uma entrega de qualidade e eficiente de software.</p>

<p>Ken Schwaber definiu o Scrum, um conjunto de práticas como o objetivo de manter o gerenciamento do projeto visível aos usuários. Uma metodologia ágil
para gestão e planejamento de projetos de software, onde o desenvolvimento é dividido em iterações com período de duas a seis semanas, chamadas de Sprints.</p>

<p>Outra metodologia ágil que vem sendo utilizada para dar apoio ao Scrum é o Kanban. Kanban é um termo de origem japonesa e significa literalmente “cartão”,
criado por Taiichi Ohno para indicar o andamento do fluxo de produção em empresas de fabricação em série. Tipicamente usa-se um quadro em branco com
post-its (Quadro Kanban) para mapear o fluxo de valor das atividades relacionadas ao desenvolvimento de software.</p>

<p>A implementação de metodologias ágil proporciona o desenvolvimento cooperativo, onde baseiam-se mais nas pessoas e suas iterações
em vez de grandes esforços de planejamento e processos rígidos. Segundo Pressman <a href="#livro7">[7]</a>, em essência, os métodos ágeis
foram desenvolvidos em um esforço para vencer as fraquezas percebidas e reais da engenharia de software convencional.</p>

<h2>3. Pippeline de Implantação</h2>

<p>O processo de levar a funcionalidade da mente do cliente até o usuário final envolve várias etapas, dentre elas, a etapa de desenvolvimento. O
desenvolvimento é composto de vários processo além da codificação e podem ser mapeados através da modelagem do mapa de fluxo de valor. O mapa de fluxo
de valor possibilita uma visão mais holística, de ponta a ponta do processo de entrega. O objetivo do fluxo de valor é mapear uma solicitação do
cliente, do momento em que ela chega até que ela esteja disponível em produção <a href="#livro8">[8]</a>.</p>

<p>No desenvolvimento, é necessário juntar o código produzido ao código principal, testar esse código para certificar que não foram adicionados defeitos
ao projeto, configurar ambientes para instalação do software e efetuar a implantação nesses ambientes, proporcionando demonstrações, testes
exploratório e a disponibilização para o usuário final. O pipeline de implantação modela esse processo, e sua inversão em uma ferramenta de integração
contínua, de gerência de versões e a utilização da prática de desenvolvimento guiado por teste como o TDD, é o que permite que uma equipe veja e
controle o processo de cada mudança à medida que ela se move em direção a entrega.</p>

<p>Para Humble e Farley <a href="#livro4">[4]</a> o pipeline de implantação é uma manifestação automatizada do processo de levar o software do controle de versão até os
usuários. Cada mudança passa de forma consistente no percurso de entrega através da automatização. A automatização torna passos complexos e
suscetíveis a erros em passos repetíveis e confiáveis. Fowler <a href="#livro3">[3]</a> acrescenta que o pipeline é para detectar quaisquer mudanças que levem os
problemas para produção e para permitir a colaboração entre os envolvidos, possibilitando a visibilidade de todo o fluxo de mudanças juntamente com
uma trilha para uma auditoria completa.</p>

<h2>4. Entrega de software automatizada</h2>

<p>Metodologia ágeis valorizam a entrega de software de valor a curto prazo. Com elas, tem-se um conjunto de boas práticas para o desenvolvimento de
software incremental (ou iterativo), onde o sistema começa a ser implantado logo no início do projeto e vai ganhando novas funcionalidades ao longo do
tempo. Isso exige que os processos de entrega sejam executados diversas vezes no decorrer de uma Sprint.</p>

<p>Para a definição de um pipeline de entrega, é necessário ter uma visão de todos os processos. O quadro Kanban auxilia nessa tarefa. A Figura 01
demonstra um exemplo do fluxo de entrega. Modelar um pipeline de implantação exige entender seus processos de entrega e balancear o nível de feedback
que você quer receber <a href="#livro9">[9]</a>. Projetos anteriores podem servir como base para um novo projeto.</p>

<p>Após a definição das funcionalidades, elas são adicionadas na coluna “Solicitações” e ficam aguardando o planejamento para a próxima Sprint. No
planejamento, as solicitações que irão ser desenvolvidas na Sprint, são movidas para a coluna “A Fazer”. Ao iniciar a codificação da funcionalidade, o
desenvolvedor atualiza o status da funcionalidade movendo-a para a coluna “Fazendo”, até que seja concluída. Até esse momento, o processo se deu de
forma manual.</p>

<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/Quadro-Kanban.png" alt="Movimentação das funcionalidades no quandro Kanban" /></p>

<p><em>Figure 01. Movimentação das funcionalidades no quandro Kanban.</em></p>

<p>A entrada do pipeline inicia-se com o check-in no sistema de controle de versão. Um dos sistemas de controle de versão mais utilizado é o
<a href="http://git-scm.com">Git</a>. Nessa etapa do processo, uma ferramenta de IC como o <a href="http://jenkis-ci.org">Jenkis</a>, o <a href="http://go.thoughworks.com">Go</a>, ou
até um serviço de integração contínua nas nuvens como o <a href="http://travis-ci.org">TravisCI</a>, pode ser configurada para monitorar o repositório a cada
alteração e mover a funcionalidade nas três etapas seguintes.</p>

<p>De acordo com a tecnologia utilizada pela aplicação, é possível fazer uso de ferramentas como o <a href="http://rspec.info">RSpec</a> e o <a href="http://junit.org">JUnit</a>
para escrever os testes automatizados. A alteração que tenha sido validada com sucesso vira uma nova versão do software (uma versão candidata a ir
para produção). Cada estágio de teste avalia a versão candidata de uma perspectiva diferente e a cada teste que ela passa, aumenta a confiança em sua
implementação. O objetivo desse processo é eliminar as versões candidatas que não estejam prontas para produção o quanto antes e obter feedback sobre
a falha o mais rápido possível <a href="#livro4">[4]</a>.</p>

<p>Quando a versão candidata passa pelo estágio de teste de aceitação automatizados, ela se torna algo útil e interessante, não sendo mais prioridade da
equipe de desenvolvimento. É preferível que os estágios de implantação para os ambientes de aceitação e produção não executem automaticamente. Os
testadores devem ser capazes de ver quais versões candidatas passaram com sucesso e implantar o sistema em um ambientes configurado com um simples
apertar de botão. Para a automatização do processo de implantação, ferramentas como a <a href="http://capistranorb.com">Capistrano</a> e a
<a href="http://nadarei.co/mina">Mina</a>, podem ser utilizadas.</p>

<p>Com a adoção dessa abordagem, não é permitido efetuar implantação do sistema em produção sem que a versão seja apropriadamente testada. Regressões são
evitadas ao se fazer correções, elas passam pelo mesmo processo que quaisquer mudança. Um aumento da automação de processos leva a uma maior
eficiência e amplia as taxas de implementação com relação as metodologias tradicionais, conforme a Figura 02.</p>

<p>Para a criação dos ambientes de aceitação e de produção, existem uma série de ferramentas de provisionamento no mercado, delas destacam-se:
<a href="http://www.ansibleworks.com/tech/">Ansible</a>, <a href="http://www.opscode.com/chef">Chef</a>, <a href="http://puppetlabs.com/puppet">Puppet</a> e
<a href="http://saltstack.com/">Salt</a>. O processo de provisionamento é um conjunto de passos executáveis que podem ser aplicados em uma imagem inicial do
sistema operacional para ter tudo configurado corretamente <a href="#livro10">[10]</a>.</p>

<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/cascataxagil.png" alt="Movimentação das funcionalidades no quandro Kanban" /></p>

<p><em>Figure 02. Ciclo de entregas de software</em></p>

<h2>5. Conclusão</h2>

<p>Este trabalho teve como foco demonstrar conjunto de boas práticas de desenvolvimento de software, testadas e validadas por diversos autores. O
objetivo está em permitir efetuar a entrega de software com maior qualidade em um curto período e promover a comunicação com um ciclo de feedback
constante entre todos os interessados.</p>

<p>Com isso, muda-se o conceito de “pronto”, fazendo com que uma funcionalidade só esteja pronta quando ela está em produção, fazendo o que tem que fazer
e entregando valor aos seus usuários. Em Startups, esse ciclo de entrega contínua é constantemente utilizado, geralmente se tem pouco recurso e é
necessário pensar em automatização desde o início. É preciso entregar valor ao usuário para continuar vivo e, esperar a próxima madrugada para subir a
nova funcionalidade pode causar um grande impacto nos negócios.</p>

<p>A qualidade da aplicação está relacionada também com o ambiente onde ela está implantada. Deve-se tratar as configurações da mesma forma que o código
fonte. Ao seguir a política de que nada é modificado em um ambiente a menos que esteja em um script com versão, automatizado e faça parte de um
caminho único para a produção (o pipeline de entrega), é possível determinar melhor a causa raiz dos erros mais rapidamente, acelerando a correção e
diminuindo a probabilidade de que pequenos erros se transformem em grandes dores de cabeça no futuro.</p>

<h2>6. Referências</h2>

<p><a id="livro1">[1]</a> <a href="http://www.ibm.com/developerworks/br/library/a-devops1/">DUVAL, Paul. (2012) &#8220;Agile DevOps: O Achatamento do Processo de Reliase de Software&#8221;</a></p>

<p><a id="livro2">[2]</a> <a href="http://martinfowler.com/articles/continuousIntegration.html">FOWLER, Martin. (2006) “Continuous Integration”</a></p>

<p><a id="livro3">[3]</a> <a href="http://martinfowler.com/bliki/DeploymentPipeline.html">FOWLER, Martin. (2013) “Deployment Pipeline”</a></p>

<p><a id="livro4">[4]</a> <a href="http://www.grupoa.com.br/livros/engenharia-de-software-e-metodos-ageis/entrega-continua/9788582601037">HUMBLE, J.; FARLEY, D. (2014) “Entrega Contínua: Como Entregar Software de Forma Rápida e Confiável”. Porto Alegre: Bookman</a></p>

<p><a id="livro5">[5]</a> <a href="http://www.lcm.com.br/site/#/livros/detalhesLivro/tdd---test-driven-development-na-pratica.html">LOPES, Camilo. (2012) “TDD na Prática. Rio de Janeiro: Ciência Moderna</a></p>

<p><a id="livro6">[6]</a> <a href="http://manifestoagil.com.br/">MANIFESTO ÁGIL. (2001) &#8220;Manifesto Para o Desenvolvimento Ágil de Software&#8221;</a></p>

<p><a id="livro7">[7]</a> <a href="http://www.grupoa.com.br/livros/engenharia-de-software-e-metodos-ageis/engenharia-de-software/9788563308337">PRESSMAN, R. S. (2006) “Engenharia de Software”. São Paulo: McGraw-Hill</a></p>

<p><a id="livro8">[8]</a> <a href="http://www.grupoa.com.br/livros/engenharia-de-software-e-metodos-ageis/implementando-o-desenvolvimento-lean-de-software/9788577807567">POPPENDIECK, Mary; POPPENDIECK, Tom. (2011) “Implementando o Desenvolvimento Lean de Software: Do Conceito ao Dinheiro”. Porto Alegre: Bookman</a></p>

<p><a id="livro9">[9]</a> <a href="http://www.casadocodigo.com.br/products/livro-devops">SATO, Danilo. (2013) “DevOps na Prática: Entrega de Software Confiável e Automatizada”. São Paulo: Casa do Código</a></p>

<p><a id="livro10">[10]</a> <a href="http://www.thoughtworks.com/pt/insights/blog/puppet-and-vagrant-how-provision-machines-your-project">TAVARES, B. (2013)” Puppet e Vagrant: Como provisionar máquinas para seu projeto</a></p>

<p><a id="livro11">[11]</a> <a href="http://novatec.com.br/livros/extreme/">TELES, Vinícius M. (2004) “Extreme Programming. São Paulo: Novatec Editora Ltda</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Padrões para desenvolvimento com Rails]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2013/02/11/padroes-para-desenvolvimento-com-rails/"/>
    <updated>2013-02-11T18:31:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2013/02/11/padroes-para-desenvolvimento-com-rails</id>
    <content type="html"><![CDATA[<p>Todos nós gostamos (ou não) de codar com clareza e organização, dessa forma podemos dar possibilidades à terceiros e a nós mesmos
de efetuar manutenções no programa que desenvolvemos. Quando se trata de equipe de desenvolvimento, algumas regras
deveriam ser explícita e revisadas cotidianamente, pois a curva de entendimento para um novo dev no projeto pode ser
alta e em alguns casos, ficar com um a menos no time resulta na entrega de software mais rápido que ambientar um novo dev.</p>

<!-- more -->


<p>Pensando nesses conceitos, encontrei o artigo <a href="https://github.com/hopsoft/rails_standards/tree/rails-3-2"><em>Rails 3.2 Development Standards Guide</em></a>
do <a href="https://github.com/hopsoft">Nathan Hopkins</a> que baseando-se em princípios como o
<a href="http://en.wikipedia.org/wiki/You_ain't_gonna_need_it">YAGNI</a> e  <a href="http://en.wikipedia.org/wiki/KISS_principle">KISS</a> elaborou alguns
padrões a seguir quando se desenvolve em Rails, achei bastante interessante e resolvir compartilhar. Vejamos:</p>

<h2>Introdução</h2>

<p>Aplicar os princípios <a href="http://en.wikipedia.org/wiki/You_ain't_gonna_need_it">YAGNI</a> e
<a href="http://en.wikipedia.org/wiki/KISS_principle">KISS</a> para:.</p>

<ul>
<li>Arquitetura Geral</li>
<li>Produtos e Recursos da API</li>
<li>Implementações Específicas</li>
</ul>


<h2>Arquivos</h2>

<ul>
<li>Deve ser usado espaços e não tabs</li>
<li>Tabs devem ser iguais a dois espaços</li>
<li>Finais de linha no padrão Unix (\n)</li>
<li>Usar UTF-8 encoding</li>
</ul>


<h2>Documentação</h2>

<p>Faça um esforço para o código ser auto-explicativo.</p>

<ul>
<li>Prefira nomes descritivos em seu código. Por exemplo <code>user_count</code> é um nome melhor do que <code>len</code>.</li>
<li>Use comentários <a href="http://yardoc.org/">YARD</a> quando a documentação do código for considerado necessária.</li>
<li>Evite comentários no método quando ele for muito complexo; <em>refatoração</em> é melhor.</li>
</ul>


<h2>Diretrizes Gerais</h2>

<p>Essas diretrizes são baseadas nas regras de programação de <a href="http://sandimetz.com/">Sandi Metz</a> introduzidas no Ruby Rogues.
As regras são propositalmente agressiva e são projetadas para dar-lhe uma pausa para que o seu app não corra solto.
Espera-se que você vai quebrá-las por razões pragmáticas &#8230; muito. Veja a nota na YAGNI e KISS.</p>

<ul>
<li>Classes não podem ter mais de 100 linhas de código.</li>
<li>Métodos não podem ser maior do que cinco linhas de código.</li>
<li>Os métodos podem ter no máximo 4 parâmetros.</li>
<li>Controllers só devem instanciar um objeto.</li>
<li>Views só devem ter acesso a uma variável de instância.</li>
<li>Nunca diretamente referêncie uma outra classe/módulo de dentro de uma classe. Estas referências devem ser passado por parâmetros.</li>
</ul>


<p><em>Seja atencioso ao aplicar estas regras. Se você está lutando contra o quadro (no caso de Scrum, Kaban, etc..), é hora de ser um pouco mais pragmático.</em></p>

<h2>Models</h2>

<ul>
<li>Nunca use finders dinâmicos. por exemplo <code>find_by_ …</code></li>
<li>Seja atencioso sobre o uso de callbacks e observers que podem levar ao acoplamento indesejado.</li>
</ul>


<p>Todos os modelos devem ser organizadas usando o seguinte formato:</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">MyModel</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="c1"># extends ...................................................................</span>
</span><span class='line'>  <span class="c1"># includes ..................................................................</span>
</span><span class='line'>  <span class="c1"># security (i.e. attr_accessible) ...........................................</span>
</span><span class='line'>  <span class="c1"># relationships .............................................................</span>
</span><span class='line'>  <span class="c1"># validations ...............................................................</span>
</span><span class='line'>  <span class="c1"># callbacks .................................................................</span>
</span><span class='line'>  <span class="c1"># scopes ....................................................................</span>
</span><span class='line'>  <span class="c1"># additional config .........................................................</span>
</span><span class='line'>  <span class="c1"># class methods .............................................................</span>
</span><span class='line'>  <span class="c1"># public instance methods ...................................................</span>
</span><span class='line'>  <span class="c1"># protected instance methods ................................................</span>
</span><span class='line'>  <span class="c1"># private instance methods ..................................................</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>OBS: Os comentários listados acima deve existir no arquivo para servir como um lembrete visual do formato.</em></p>

<h2>Implementação de Models</h2>

<p>É geralmente uma boa idéia isolar diferentes obrigações em módulos separados.
Recomendamos o uso de Concerns como descrito neste <a href="http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns">post do blog</a>.</p>

<figure class='code'><figcaption><span>Project </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>|-project
</span><span class='line'>  |-app
</span><span class='line'>    |-assets
</span><span class='line'>    |-controllers
</span><span class='line'>    |-helpers
</span><span class='line'>    |-mailers
</span><span class='line'>    |-models
</span><span class='line'>      |-concerns &lt;-----
</span><span class='line'>    |-views</span></code></pre></td></tr></table></div></figure>


<h3>Orientações</h3>

<ul>
<li>Operações CRUD que estão limitados a um único modelo deve ser implementada no modelo. Por exemplo, um método <code>full_name</code>
que concatena <code>first_name</code> e <code>last_name</code></li>
<li>Operações CRUD que ultrapassam este modelo devem ser implementadas como uma Concern. Por exemplo, um método <code>status</code> que
precisa olhar para vários outros modelos.</li>
<li>Operações simples não CRUD, devem ser implementadas como uma Concern.</li>
<li>Importante! Concerns devem ser isolados e independentes. Eles não devem fazer suposições sobre como o receiver é composto
em tempo de execução. É inaceitável que uma concern invoque métodos definidos em outras concerns, no entanto, invocando
métodos definidos no receiver pretendido é permitido.</li>
<li>Operações complexas multi-step devem ser implementadas como um processo. Veja abaixo.</li>
</ul>


<h2>Controllers</h2>

<p>Controladores devem higienizar parâmetros antes de realizar qualquer outra lógica. A solução preferida é inspirada por esta
<a href="https://gist.github.com/dhh/1975644">essência do DHH</a>.</p>

<p>Aqui está um exemplo de higienização de parâmetros.</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">ExampleController</span> <span class="o">&lt;</span> <span class="no">ActionController</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>    <span class="no">Example</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">sanitized_params</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">update</span>
</span><span class='line'>    <span class="no">Example</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">update_attributes!</span><span class="p">(</span><span class="n">sanitized_params</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">protected</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">sanitized_params</span>
</span><span class='line'>    <span class="n">params</span><span class="o">[</span><span class="ss">:example</span><span class="o">].</span><span class="n">slice</span><span class="p">(</span><span class="ss">:expected_param</span><span class="p">,</span> <span class="ss">:another_expected_param</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Processos</h2>

<p>Um processo é definido como uma operação multi-step, que inclui qualquer um dos seguintes itens.</p>

<ul>
<li>Uma transação com uma tarefa complexa está sendo realizada.</li>
<li>Uma chamada feita para um serviço externo.</li>
<li>Qualquer interação no nível do sistema operacional é executada.</li>
<li>O envio de e-mails, a exportação de arquivos, etc ..</li>
</ul>


<p>Em uma tentativa de gerir melhor os processos, nós seguimos vagamente alguns princípios de Domain Driven Development (DDD).
Ou seja, nós adicionamos um diretório <code>processes</code> em <code>app</code> para realizar implementações de nossos processos.</p>

<figure class='code'><figcaption><span>Project </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>|-project
</span><span class='line'>  |-app
</span><span class='line'>    |-assets
</span><span class='line'>    |-controllers
</span><span class='line'>    |-helpers
</span><span class='line'>    |-mailers
</span><span class='line'>    |-models
</span><span class='line'>    |-processes &lt;-----
</span><span class='line'>    |-views</span></code></pre></td></tr></table></div></figure>


<p>Recomendamos o uso de uma ferramenta como o <a href="https://github.com/hopsoft/hero">Hero</a> para ajudar
a modelar esses processos.</p>

<p><strong>Importante:</strong> Não use model ou controller callbacks para invocar um processo. Em vez disso, invocar processos diretamente
do controlador.</p>

<h2>Logging</h2>

<p>Nós usamos a gem <a href="https://github.com/rudionrails/yell">Yell</a> para registro. Aqui está um exemplo de configuração.</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># example/config/application.rb</span>
</span><span class='line'><span class="k">module</span> <span class="nn">Example</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Application</span> <span class="o">&lt;</span> <span class="no">Rails</span><span class="o">::</span><span class="no">Application</span>
</span><span class='line'>    <span class="n">log_levels</span> <span class="o">=</span> <span class="o">[</span><span class="ss">:debug</span><span class="p">,</span> <span class="ss">:info</span><span class="p">,</span> <span class="ss">:warn</span><span class="p">,</span> <span class="ss">:error</span><span class="p">,</span> <span class="ss">:fatal</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># %m : The message to be logged</span>
</span><span class='line'>    <span class="c1"># %d : The ISO8601 Timestamp</span>
</span><span class='line'>    <span class="c1"># %L : The log level, e.g INFO, WARN</span>
</span><span class='line'>    <span class="c1"># %l : The log level (short), e.g. I, W</span>
</span><span class='line'>    <span class="c1"># %p : The PID of the process from where the log event occured</span>
</span><span class='line'>    <span class="c1"># %t : The Thread ID from where the log event occured</span>
</span><span class='line'>    <span class="c1"># %h : The hostname of the machine from where the log event occured</span>
</span><span class='line'>    <span class="c1"># %f : The filename from where the log event occured</span>
</span><span class='line'>    <span class="c1"># %n : The line number of the file from where the log event occured</span>
</span><span class='line'>    <span class="c1"># %F : The filename with path from where the log event occured</span>
</span><span class='line'>    <span class="c1"># %M : The method where the log event occured</span>
</span><span class='line'>    <span class="n">log_format</span> <span class="o">=</span> <span class="no">Yell</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="s2">&quot;[%d] [%L] [%h][%p][%t] [%F:%n:%M] %m&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="no">Yell</span><span class="o">.</span><span class="n">new</span> <span class="k">do</span> <span class="o">|</span><span class="n">logger</span><span class="o">|</span>
</span><span class='line'>      <span class="n">logger</span><span class="o">.</span><span class="n">adapter</span> <span class="no">STDOUT</span><span class="p">,</span> <span class="ss">:level</span> <span class="o">=&gt;</span> <span class="n">log_levels</span><span class="p">,</span> <span class="ss">:format</span> <span class="o">=&gt;</span> <span class="n">log_format</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Extensions &amp; Monkey Patches</h2>

<ul>
<li>Seja pensativo sobre monkey patching e procure primeiro soluções alternativas.</li>
<li>Use um inicializador para carregar extensions e monkey patches.</li>
</ul>


<p>Todas as extensions e monkey patches deve estar em um diretório de extensões em lib.</p>

<figure class='code'><figcaption><span>Project </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>|-project
</span><span class='line'>  |-app
</span><span class='line'>  |-config
</span><span class='line'>  |-db
</span><span class='line'>  |-lib
</span><span class='line'>    |-extensions &lt;-----</span></code></pre></td></tr></table></div></figure>


<p>Use módulos para estender objetos ou adicionar monkey patches. Isto fornece alguma consistência quando você precisa
para rastrear bugs.</p>

<p>Aqui está um exemplo:</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">CowboyString</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">downcase</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">upcase</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="o">::</span><span class="nb">String</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="ss">:include</span><span class="p">,</span> <span class="no">CowboyString</span><span class="p">)</span>
</span><span class='line'><span class="nb">String</span><span class="o">.</span><span class="n">ancestors</span> <span class="c1"># =&gt; [String, CowboyString, Enumerable, Comparable, Object, Kernel]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Dependências de Gems</h2>

<p>Dependências de gems deve ser fixadas antes de implantar no aplicativo de produção. Isto vai garantir a estabilidade da aplicação.</p>

<p>Recomendamos o uso de <a href="http://gembundler.com/v1.2/gemfile.html">gerenciadores de dependência</a>. Ao utilizar um gerenciador de
dependência, certifique-se de especificar pelo menos as versões maiores ou menores. Aqui está um exemplo.</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Gemfile</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;rails&#39;</span><span class="p">,</span> <span class="s1">&#39;3.2.11&#39;</span> <span class="c1"># GOOD: exact</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;pg&#39;</span><span class="p">,</span> <span class="s1">&#39;~&gt;0.9&#39;</span>     <span class="c1"># GOOD: tilde</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;yell&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;=1.2&#39;</span>   <span class="c1"># BAD: unspecific</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;nokogiri&#39;</span>        <span class="c1"># BAD: unversioned</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bundler&#8217;s Gemfile.lock resolve o mesmo problema, mas nós descobrimos que as atualizações indevidas do pacote podem causar problemas.
É muito melhor ser explícito no Gemfile para garantir a estabilidade do aplicativo.</p>

<p><strong>This will cause your project to slowy drift away from the bleeding edge</strong>. A estratégia deve ser empregada para garantir que o
projeto não se desvie muito do comportamento da versão da gem. Por exemplo, atualizar as gems regularmente (a cada 3-4 meses) e
ser vigilantes sobre os patches de segurança. Serviços como <a href="https://gemnasium.com/">Gemnasium</a> pode ajudar com isso.</p>

<h2>Uma nota sobre Frameworks frontend</h2>

<p>Coisas interessantes estão acontecendo no mundo dos frameworks frontend.</p>

<ul>
<li><a href="http://backbonejs.org/">Backbone</a></li>
<li><a href="http://emberjs.com/">Ember</a></li>
<li><a href="http://angularjs.org/">Angular</a></li>
<li><a href="http://knockoutjs.com/">Knockout</a></li>
<li>e muitos outros &#8230;</li>
</ul>


<p>Ser cuidadoso sobre a decisão de usar um framework frontend. Pergunte-se se existe complexidade em manter e se a decisão é certa.
Muitas vezes existem soluções melhores e mais simples.</p>

<p>Leia os seguintes artigos antes de decidir. No final, você deve ser capaz de expressar por que sua decisão é a certa.</p>

<p><a href="http://37signals.com/svn/posts/3112-how-basecamp-next-got-to-be-so-damn-fast-without-using-much-client-side-ui">How Basecamp Next got to be so damn fast without using much client-side UI</a>
<a href="http://layervault.tumblr.com/post/30932219739/rails-in-realtime">Rails in Realtime</a>
<a href="http://layervault.tumblr.com/post/31462727280/rails-in-realtime-part-2">Rails in Realtime, Part 2</a>
Em ambos os casos estar atento a &#8220;layout thrashing&#8221;, <a href="http://kellegous.com/j/2013/01/26/layout-performance/">conforme descrito aqui</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Habilitando Apache com Virtual Host no Mac OS X 10.8]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2013/01/20/habilitando-apache-com-virtual-host-no-mac-os-x-10-dot-8/"/>
    <updated>2013-01-20T00:24:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2013/01/20/habilitando-apache-com-virtual-host-no-mac-os-x-10-dot-8</id>
    <content type="html"><![CDATA[<p>Na versão do Mac OS X 10.8 (Mountain Lion) foi <a href="http://support.apple.com/kb/HT5230?viewlocale=pt_BR">removido</a> a opção &#8220;Web Sharing&#8221; do painel de controle &#8220;Sharing&#8221; em System Preferences, dessa forma a configuração se dá
de outra forma, basicamente usando o terminal com <code>sudo</code> ou usuário <code>root</code> e um editor de texto que pode ser o <a href="http://www.vim.org">Vim</a>. Vamos as configurações.</p>

<!-- more -->


<h2>Habilitando o Apache</h2>

<p>Para iniciar:</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apachectl start
</span></code></pre></td></tr></table></div></figure>


<p>Para parar:</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apachectl stop
</span></code></pre></td></tr></table></div></figure>


<p>Para reiniciar:</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apachectl restart
</span></code></pre></td></tr></table></div></figure>


<h2>Adicionando seu domínio</h2>

<p>É necessário adicionar seu domínio no arquivo <code>/etc/hosts</code>, inclua a seguinte linha:</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>127.0.0.1 leandronunes.com
</span></code></pre></td></tr></table></div></figure>


<p> O domínio leandronunes.com é só como exemplo, no lugar pode ser o seu ;-P</p>

<h2>Arquivo httpd.com</h2>

<p>Agora temos de fazer algumas configurações no próprio Apache.</p>

<p>Para habilitar o PHP, descomente a linha 117</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>LoadModule php5_module libexec/apache2/libphp5.so
</span></code></pre></td></tr></table></div></figure>


<p>Configure seu document root na linha 169</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>DocumentRoot <span class="s2">&quot;myPath&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>e na linha 196</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>&lt;Directory <span class="s2">&quot;myPath&quot;</span>&gt;
</span></code></pre></td></tr></table></div></figure>


<p>Informe os arquivos default que o Apache irá ler na linha 231</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>DirectoryIndex index.html index.php
</span></code></pre></td></tr></table></div></figure>


<p>Agora, descomente a linha 477 para incluir o arquivo de hosts virtuais</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Include /private/etc/apache2/extra/httpd-vhosts.conf
</span></code></pre></td></tr></table></div></figure>


<h2>Criando um host virtual</h2>

<p>Vamos adicionar nosso host no arquivo <code>/private/etc/apache2/extra/httpd-vhosts.conf</code>, ficando dessa seguinte forma:</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>NameVirtualHost *:80
</span><span class='line'>
</span><span class='line'>&lt;VirtualHost *:80&gt;
</span><span class='line'>  ServerAdmin seuemail@email.com
</span><span class='line'>  DocumentRoot <span class="s2">&quot;/Users/leandronunes/&quot;</span>
</span><span class='line'>  ErrorLog <span class="s2">&quot;/private/var/log/apache2/error_log&quot;</span>
</span><span class='line'>  CustomLog <span class="s2">&quot;/private/var/log/apache2/access_log&quot;</span> common
</span><span class='line'>&lt;/VirtualHost&gt;
</span><span class='line'>
</span><span class='line'>&lt;VirtualHost *:80&gt;
</span><span class='line'>  ServerAdmin seuemail@email.com
</span><span class='line'>  DocumentRoot <span class="s2">&quot;/Users/leandronunes/blog&quot;</span>
</span><span class='line'>  ServerName leandronunes.com
</span><span class='line'>  ServerAlias www.leandronunes.com
</span><span class='line'>  ErrorLog <span class="s2">&quot;/Users/leandronunes/blog/log/error_log&quot;</span>
</span><span class='line'>  CustomLog <span class="s2">&quot;/Users/leandronunes/blog/log/access_log&quot;</span> common
</span><span class='line'>&lt;/VirtualHost&gt;
</span></code></pre></td></tr></table></div></figure>


<h2>Testando</h2>

<p>Primeiro, dê um restart no Apache, isso já foi mostrado mais acima.
Adicione um arquivo <code>index.php</code> na raíz de seu projeto com o conteúdo.</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span> <span class="nb">phpinfo</span><span class="p">();</span> <span class="cp">?&gt;</span><span class="x"></span>
</span></code></pre></td></tr></table></div></figure>


<p>e acesse pelo browser <code>http://leandronunes.com</code></p>

<p>Pronto, acredito que apareceu alguma coisa nesse momento. :-P</p>

<h2>Conclusão</h2>

<p>Dessa forma simulamos os paths reais da aplicação em produção e eliminamos muitas dores de cabeça, principalmente para quem cria blogs em wordpress. ;-/</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Corrigindo bugs do ambiente de teste de uma Rails Engine Mountable]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/10/27/corrigindo-erros-do-ambiente-de-teste-de-uma-rails-engine-mountable/"/>
    <updated>2012-10-27T10:12:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/10/27/corrigindo-erros-do-ambiente-de-teste-de-uma-rails-engine-mountable</id>
    <content type="html"><![CDATA[<p>Ao tentar executar a suite de testes em uma <a href="http://edgeapi.rubyonrails.org/classes/Rails/Engine.html">Rails Engine</a> fui surpreendido com alguns erros, então partir para campo afim de
descobrir o porquê das coisas não funcionarem convencionalmente como se esperava. Na página <a href="https://github.com/rails/rails/issues?labels=engines&amp;state=open">Issues</a>
 do Rails no <a href="https://github.com/">GitHub</a> vi que se tratava de bugs do Rails mesmo, no meu caso a versão 3.2.8.</p>

<p>Como não era somente um bug para corrigir e não achei um post relacionando todos, depois da garimpada na net, resolvi juntar
tudo e postar aqui.</p>

<p>Vou fazer um exemplo de execução de testes em uma Engine para exemplificar melhor. Nossa mega Engine vai se chamar
Blog (nesse momento estou inspirado), vamos lá então.</p>

<!-- more -->


<blockquote><p>Não vou entrar em detalhes sobre Rails Engine, se você não tem noção nenhuma do que seria isso pode começar aqui: <a href="http://www.akitaonrails.com/2010/05/10/rails-3-introducao-a-engines#.UIqn32lUMzE">http://www.akitaonrails.com/2010/05/10/rails-3-introducao-a-engines#.UIqn32lUMzE</a>  -  (Sto. @AkitaOnRails).</p>

<p>Futuramente (quando a faculdade deixar) pretendo fazer um exemplo para documentar também, ai coloco o link aqui ;)</p></blockquote>

<h2>Criando uma Rails Engine</h2>

<p>Vamos criar nossa app Blog.</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rails plugin new Blog --mountable
</span><span class='line'><span class="nb">cd </span>Blog
</span></code></pre></td></tr></table></div></figure>


<p><em>Vimos que criamos uma Engine isolada, dessa forma nossas classes serão englobadas no namespace Blog e criadas dentro de pastas nomeadas
pelo namespace.</em></p>

<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/bug_engine/estrutura.png" alt="Estrutura de pastas" /></p>

<p>Agora vamos gerar um Scaffold para ter o que testar ;P</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rails g scaffold Post title body:text
</span></code></pre></td></tr></table></div></figure>


<p>Em uma Engine, temos tarefas rake específicas prefixadas com &#8220;app&#8221;, as que nos interessam nesse momento são as relativas ao banco de dados</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake -T db
</span><span class='line'>
</span><span class='line'>rake app:db:create <span class="c"># Create the database from config/database.yml for the current Rails.env (use db:create:all to create all dbs in the config)</span>
</span><span class='line'>rake app:db:drop <span class="c"># Drops the database for the current Rails.env (use db:drop:all to drop all databases)</span>
</span><span class='line'>rake app:db:fixtures:load <span class="c"># Load fixtures into the current environment&#39;s database.</span>
</span><span class='line'>rake app:db:migrate <span class="c"># Migrate the database (options: VERSION=x, VERBOSE=false).</span>
</span><span class='line'>rake app:db:migrate:status <span class="c"># Display status of migrations</span>
</span><span class='line'>rake app:db:rollback <span class="c"># Rolls the schema back to the previous version (specify steps w/ STEP=n).</span>
</span><span class='line'>rake app:db:schema:dump <span class="c"># Create a db/schema.rb file that can be portably used against any DB supported by AR</span>
</span><span class='line'>rake app:db:schema:load <span class="c"># Load a schema.rb file into the database</span>
</span><span class='line'>rake app:db:seed <span class="c"># Load the seed data from db/seeds.rb</span>
</span><span class='line'>rake app:db:setup <span class="c"># Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)</span>
</span><span class='line'>rake app:db:structure:dump <span class="c"># Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql</span>
</span><span class='line'>rake app:db:version <span class="c"># Retrieves the current schema version number</span>
</span><span class='line'>rake db:create <span class="c"># Create the database from config/database.yml for the current Rails.env (use db:create:all to create all dbs in the config)</span>
</span><span class='line'>rake db:drop <span class="c"># Drops the database for the current Rails.env (use db:drop:all to drop all databases)</span>
</span><span class='line'>rake db:fixtures:load <span class="c"># Load fixtures into the current environment&#39;s database.</span>
</span><span class='line'>rake db:migrate <span class="c"># Migrate the database (options: VERSION=x, VERBOSE=false).</span>
</span><span class='line'>rake db:migrate:status <span class="c"># Display status of migrations</span>
</span><span class='line'>rake db:rollback <span class="c"># Rolls the schema back to the previous version (specify steps w/ STEP=n).</span>
</span><span class='line'>rake db:schema:dump <span class="c"># Create a db/schema.rb file that can be portably used against any DB supported by AR</span>
</span><span class='line'>rake db:schema:load <span class="c"># Load a schema.rb file into the database</span>
</span><span class='line'>rake db:seed <span class="c"># Load the seed data from db/seeds.rb</span>
</span><span class='line'>rake db:setup <span class="c"># Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)</span>
</span><span class='line'>rake db:structure:dump <span class="c"># Dump the database structure to an SQL file</span>
</span><span class='line'>rake db:version <span class="c"># Retrieves the current schema version number</span>
</span></code></pre></td></tr></table></div></figure>


<p>Vamos criar nosso DB e executar as migrações</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake app:db:create
</span><span class='line'>rake app:db:migrate
</span><span class='line'>
</span><span class='line'><span class="o">==</span> CreateBlogPosts: <span class="nv">migrating</span> <span class="o">================================================</span>
</span><span class='line'>-- create_table<span class="o">(</span>:blog_posts<span class="o">)</span>
</span><span class='line'>-&gt; 0.0015s
</span><span class='line'><span class="o">==</span> CreateBlogPosts: migrated <span class="o">(</span>0.0016s<span class="o">)</span> <span class="o">=======================================</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Observe que a tabela criada é prefixada pelo nome da Engine.</p>

<p>Com o scaffold criamos toda a estrutura para os testes.</p></blockquote>

<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/bug_engine/teste.png" alt="Estrutura de pastas nos testes" /></p>

<p>Enfim, vamos aos erros.</p>

<h2>ERROS</h2>

<p>O scaffold já cria os testes funcionais para CRUD, veja o arquivo <code>test/functional/blog/posts_controller_test.rb</code>,
dessa forma já podemos executar os testes e ver se está tudo funfando.</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake <span class="nb">test</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p><strong>Ops! deu pau ;(</strong></p></blockquote>

<h3>1) NoMethodError: undefined method `posts&#8217; for #&lt;Blog::PostsControllerTest:0x007f942c045ed0></h3>

<p>Esse error acontece devido nosso controller tentar carregar as fixtures do post que não foram carregadas/criadas, veja:</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Blog</span>
</span><span class='line'>    <span class="k">class</span> <span class="nc">PostsControllerTest</span> <span class="o">&lt;</span> <span class="no">ActionController</span><span class="o">::</span><span class="no">TestCase</span>
</span><span class='line'>        <span class="n">setup</span> <span class="k">do</span>
</span><span class='line'>            <span class="vi">@post</span> <span class="o">=</span> <span class="n">posts</span><span class="p">(</span><span class="ss">:one</span><span class="p">)</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>     <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Você precisa explicitar isso para o <a href="http://api.rubyonrails.org/classes/ActiveSupport/TestCase.html">ActiveSupport::TestCase</a>,
abra o arquivo <code>test/test_helper.rb</code> e adicione: <code>ActiveSupport::TestCase.fixtures :all</code> no contexto onde as fixtures são carregadas.</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Load fixtures from the engine</span>
</span><span class='line'><span class="k">if</span> <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">method_defined?</span><span class="p">(</span><span class="ss">:fixture_path</span><span class="o">=</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">fixture_path</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s2">&quot;../fixtures&quot;</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">fixtures</span> <span class="ss">:all</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Agora rode os testes;</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake <span class="nb">test</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p><strong>Ops! deu pau ;(</strong></p></blockquote>

<h3>2) ActiveRecord::StatementInvalid: Could not find table &#8216;blog_posts&#8217;</h3>

<p>Esse error é devido as convenções não funcionarem aqui, se você reparou o path das fixtures está setado para raiz da pasta fixtures, então vamos alterar.</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Load fixtures from the engine</span>
</span><span class='line'><span class="k">if</span> <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">method_defined?</span><span class="p">(</span><span class="ss">:fixture_path</span><span class="o">=</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">fixture_path</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s2">&quot;../fixtures/blog&quot;</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">fixtures</span> <span class="ss">:all</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Agora rode os testes;</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake <span class="nb">test</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p><strong>Ops! deu pau ;(</strong></p></blockquote>

<h3>3) ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: posts: DELETE FROM &#8220;posts&#8221;</h3>

<p>Como convenção, a fixture post tenta utilizar a tabela post, mais como vimos, estamos &#8220;namespaceados&#8221; pelo nome da engine,
então precisamos novamente explicitar para o ActiveSupport::TestCase que o objeto utilizado pela fixture post é <code>Blog::Post</code>,
dessa forma o <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord</a> referencia a tabela correta.</p>

<p>Então adicione mais uma linha no seu test_helper.rb</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Load fixtures from the engine</span>
</span><span class='line'><span class="k">if</span> <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">method_defined?</span><span class="p">(</span><span class="ss">:fixture_path</span><span class="o">=</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">fixture_path</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s2">&quot;../fixtures/blog&quot;</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">fixtures</span> <span class="ss">:all</span>
</span><span class='line'>    <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span><span class="o">.</span><span class="n">set_fixture_class</span> <span class="ss">:posts</span> <span class="o">=&gt;</span> <span class="no">Blog</span><span class="o">::</span><span class="no">Post</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Agora rode os testes;</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake <span class="nb">test</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p><strong>Ops! deu pau ;(</strong></p></blockquote>

<h3>4) ActionController::RoutingError: No route matches {:id=>&#8221;980190962&#8221;, :post=>{:body=>&#8221;MyText&#8221;, :title=>&#8221;MyString&#8221;}, :controller=>&#8221;blog/posts&#8221;, :action=>&#8221;update&#8221;}</h3>

<p>Vamos observar o arquivo de rotas, <code>config/routes.rb</code></p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">BlogTest</span><span class="o">::</span><span class="no">Engine</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">draw</span> <span class="k">do</span>
</span><span class='line'>   <span class="n">resources</span> <span class="ss">:posts</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Realmente não temos a rota &#8216;blog/posts&#8217; criada e não devemos criar, pois quando montamos nossa Engine em uma App mãe,
essa rota será criada devido nossa Engine ser isolada (&#8211;mountable), então a App precisa diferenciar a requisição ao
controller post da Engine da requisição do controller post dela mesma (caso tenha).</p>

<p>Não sei se expliquei bem, mais é só para justificar o porquê de não alterar esse arquivo.</p>

<p>Para resolver isso, vamos disponibilizar diretamente ao controller_test as rotas.
Em <code>test/functional/blog/posts_controller_test.rb</code> adicione:</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>setup <span class="k">do</span>
</span><span class='line'>    @post <span class="o">=</span> posts<span class="o">(</span>:one<span class="o">)</span>
</span><span class='line'>    @routes <span class="o">=</span> Engine.routes
</span><span class='line'>end
</span></code></pre></td></tr></table></div></figure>


<p>Agora rode os testes;</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake <span class="nb">test</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p><strong>Congratulation!</strong></p></blockquote>

<p>Agora nossa suite de teste esta rodando, já podemos trabalhar. :P</p>

<p>Tentei explicar as correções de forma que quem esteja começando no mundo Rails possa entender o que está acontecendo e não
simplesmente copiar e colar o código para correção. Lembrando que também sou um aspirante Rails e estou aberto para correções
neste post caso cometi alguma gafe.</p>

<h2>Referencias</h2>

<ul>
<li><a href="https://github.com/rails/rails/issues/4971">https://github.com/rails/rails/issues/4971</a></li>
<li><a href="https://github.com/rails/rails/issues/6573">https://github.com/rails/rails/issues/6573</a></li>
</ul>


<h2>Mais sobre Engine</h2>

<ul>
<li><a href="http://edgeguides.rubyonrails.org/engines.html">http://edgeguides.rubyonrails.org/engines.html</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Organizando as Expressões Regulares no Rails]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/09/22/organizando-as-expressoes-regulares-no-rails/"/>
    <updated>2012-09-22T14:55:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/09/22/organizando-as-expressoes-regulares-no-rails</id>
    <content type="html"><![CDATA[<p>No dia a dia sempre necessitamos dos super poderes das Expressões Regulares para validações de formulários, replaces em
textos e tantas outras coisas mais, alguns patterns raramente mudam de um projeto para outro, o pattern para validar e-mails
é um exemplo.</p>

<!-- more -->


<p>Pensando nisso e aproveitando a estrutura do Rails que já possui a pasta <code> /lib </code>  para armazenar nossos códigos customizados,
criei um module &#8220;ER&#8221; para ir colecionando os patterns rotineiros.</p>

<blockquote><p>Neste post estou mostrando uma solução que encontrei pois ainda desconheço se o Rails possui alguma convenção para essa tarefa.</p></blockquote>

<h2>Vamos ver a ideia!</h2>

<p>Na pasta <code> /lib </code> criei um arquivo <code> er.rb </code>  que será nosso &#8220;repositório de ERs&#8221;.</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">ER</span>
</span><span class='line'>  <span class="c1"># Pattern para validação de e-mail</span>
</span><span class='line'>  <span class="no">EMAIL</span> <span class="o">=</span> <span class="sr">/^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i</span>
</span><span class='line'>  <span class="c1"># Pattern para validação de data no padrão 99/99/9999</span>
</span><span class='line'>  <span class="no">DATE</span> <span class="o">=</span> <span class="sr">/^(([012][0-9])|(3[01]))\/(0[1-9]|1[012])\/\d{4}$/</span>
</span><span class='line'>  <span class="c1"># Pattern para validação de data no padrão 9999-99-99</span>
</span><span class='line'>  <span class="no">DATE_DB</span> <span class="o">=</span> <span class="sr">/^\d{4}-(0[1-9]|1[012])-(([012][0-9])|(3[01]))$/</span>
</span><span class='line'>  <span class="c1"># Pattern para validação de horas sem os segungos no padrão 99:99</span>
</span><span class='line'>  <span class="no">TIME_H_M</span> <span class="o">=</span> <span class="sr">/^(([01]\d)|(2[0-3])):([0-5]\d)$/</span>
</span><span class='line'>  <span class="c1"># Pattern para validação de urls, permitido os protocolos http e https</span>
</span><span class='line'>  <span class="no">URL</span> <span class="o">=</span> <span class="sr">/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<h2>Utilizando</h2>


<p>Para exemplificar, vamos validar um model User.</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;er&#39;</span>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">attr_accessible</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:full_name</span>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:email</span><span class="p">,</span> <span class="n">presence</span><span class="ss">:true</span><span class="p">,</span>  <span class="nb">format</span><span class="p">:{</span><span class="n">with</span><span class="p">:</span> <span class="no">ER</span><span class="o">::</span><span class="no">EMAIL</span><span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Perceberam a chamada do pattern? :P</p>

<p>Para validação em front-end utilizando o atributo <code> pattern </code> do HTML5, podemos reaproveitar nossos patterns, só que
precisamos de um passo a mais devido o padrão ser ER crua sem estar contida em &#8220;//&#8221; (barras).</p>

<p>Criei então um Help para fazer essa tarefa e as View continuarem fazendo apenas seu papel.
No arquivo <code> app/helpers/application_helper.rb </code>  incluir:</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">er_for_html</span><span class="p">(</span><span class="n">er</span><span class="p">)</span>
</span><span class='line'>  <span class="k">begin</span>
</span><span class='line'>    <span class="no">ER</span><span class="o">.</span><span class="n">const_get</span><span class="p">(</span><span class="n">er</span><span class="o">.</span><span class="n">upcase</span><span class="o">.</span><span class="n">to_sym</span><span class="p">)</span><span class="o">.</span><span class="n">source</span>
</span><span class='line'>  <span class="k">rescue</span> <span class="no">NameError</span> <span class="o">=&gt;</span> <span class="n">exc</span>
</span><span class='line'>    <span class="s2">&quot;A expressao solicitada nao existe&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notem que usei <code> Module#const_get </code>  para pegar a referência da constante informado e no fim o
<code> Regexp#source </code>  que retorna a string original que está envolvida por &#8220;//&#8221; <br />
Ficando no formulário:</p>

<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">&lt;</span><span class="sx">%= f.text_field(:email, :class =</span><span class="o">&gt;</span> <span class="ss">:span3</span><span class="p">,</span> <span class="ss">:pattern</span> <span class="o">=&gt;</span> <span class="n">er_for_html</span><span class="p">(</span><span class="s2">&quot;email&quot;</span><span class="p">),</span> <span class="ss">:type</span> <span class="o">=&gt;</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:required</span> <span class="o">=&gt;</span> <span class="kp">true</span><span class="p">,</span> <span class="ss">:title</span> <span class="o">=&gt;</span> <span class="s2">&quot;E-mail&quot;</span> <span class="p">)</span> <span class="o">%&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<h2>Concluíndo</h2>


<p>É isso ai, a intenção é só para mostar uma possibilidade de organizar as coisas, claro que deve possuir outras, dessa forma,
aceito sugestões e dicas. :)</p>

<p>Para uma consulta rápida sobre metacaracteres o Aurélio disponibiliza um guia rápido <a href="http://piazinho.com.br/download/expressoes-regulares-3-tabelas.pdf" title="Ir para outra página">http://piazinho.com.br/download/expressoes-regulares-3-tabelas.pdf</a>.<br />
Para se aprofundar, leia o livro <a href="http://piazinho.com.br/" title="Ir para página do livro">Expressões Regulares - Uma abordagem divertida</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Simulando Circuitos com o Digital Works]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/08/26/simulando-circuitos-com-o-digital-works/"/>
    <updated>2012-08-26T01:08:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/08/26/simulando-circuitos-com-o-digital-works</id>
    <content type="html"><![CDATA[<p>Digital Works é uma ferramenta que permite construir circuitos lógicos digitais, Flip-Flops, memórias e analisar o seu comportamento através de simulação em tempo real.
As entradas podem ser implementadas usando chaves, clocks, sequenciadores e dispositivos de entrada iterativos, possui uma interface intuitiva, fácil de usar que o
torna a escolha ideal para aprender ou ensinar eletrônica digital.</p>

<!-- more -->


<p>Durante o curso de Circuitos Digitas, os alunos deverão simular todos os circuitos antes de irem ao laboratório, dessa forma, conhecer
o funcionamento da ferramenta facilitará bastante.</p>

<h3>Download</h3>


<p>A versão atual disponível no site não é livre. É demoware e impede versões de demonstração do software, de abrir arquivos criados
por outras cópias do demo. No entanto, possui uma versão disponível mais antiga que não tem tais limitações e <a href="http://electronics-lab.com/downloads/schematic/002/index.html" target="_blank" title="Ir para http://electronics-lab.com">pode ser baixada aqui.</a></p>

<h3>Tutoriais</h3>


<p>Como encontrei bastante material disponível na net, achei melhor mensioná-los aqui do que criar um novo tutorial.</p>

<ul>
  <li><a href="http://www.clemson.edu/ces/crb/students/dbragan/classes/dworks_tutorial.htm" title="Ir para http://www.clemson.edu">Intro to Digital Works</a> (inglês)</li>
  <li><a href="http://www.scribd.com/doc/66993742/Tutorial-Digital-Works" title="Ir para http://www.scribd.com"> Sistemas Digitais</a>  - <em>Miguel Tavares</em></li>
  <li><a href="http://www-usr.inf.ufsm.br/~leandromc/iac/TutorialDW.pdf" title="Ir para http://www-usr.inf.ufsm.br">Tutorial Digital Works</a>  - <em>Leandro M. Crescencio</em></li>
  <li><a href="http://www.feng.pucrs.br/~jmiguel/_dworks/Tutorial_Digital_Works.pdf" title="http://www.feng.pucrs.br">Digital Works</a> - <em>Anderson Royes Terroso</em></li>
  <li><a href="http://LeandroSNunes.github.com/leandrosnunes/assets/files/tutorial_macros_no_dw_3.04.pdf" title="Baixar arquivo">Macros no Digital Works</a> -   <em>Marcelo Brunoro</em></li>
</ul>


<p>A cada novo material descoberto irei adicionando à lista.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Seminário Computação em Nuvem]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/08/12/seminario-computacao-em-nuvem/"/>
    <updated>2012-08-12T16:15:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/08/12/seminario-computacao-em-nuvem</id>
    <content type="html"><![CDATA[<p>
Quando cursei a disciplina de Introdução a Computação, desenvolvi uma pequena pesquisa sobre Computação em Nuvem <em>(Cloud Computind)</em>
para o trabalho de conclusão de período, assim, pude conhecer um pouco mais sobre um conceito que pretende levar às últimas 
consequências à transferência de processamento, a ideia de que uma hora ou outra não será mais necessário investir em máquinas 
com HD alto para suportar aplicativos pesados, já que a Computação em Nuvem abre de vez os caminhos para um processo de migração 
maciça de softwares alojados em PCs para servidores mais potentes.
</p>




<!-- more -->




<h3>Downloads</h3>


<p>
Se você está interessado também em Computação em Nuvem, conhecer os conceitos básicos sobre virtualização, estou disponibilizando o 
<a href="http://www.scribd.com/doc/95961340/Seminario-Computacao-em-Nuvens" title="Arquivo em formato PDF sobre Computação em Nuvem">Arquivo em PDF</a>
da pesquisa e abaixo o slide da apresentação.
</p>




<iframe src="http://www.slideshare.net/slideshow/embed_code/13201594" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe>


<p> <div style="margin-bottom:5px"> <strong> <a href="http://www.slideshare.net/websites.comunicacao/seminrio-introduo-a-computao" title="Seminário Computação em Nuvem" target="_blank">Seminário Computação em Nuvem</a> </strong> from <strong><a href="http://www.slideshare.net/websites.comunicacao" target="_blank">Leandro Nunes</a></strong> </div></p>

<br />




<p>
É claro que existem muitos outros conceitos por trás dessa tecnologia. Espero que este trabalho desperte a curiosidade e insentive
suas pesquisas.
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Conectando módulo Bluetooth JY-MCU V1.02 + Arduino + Debian]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/06/05/conectando-modulo-bluetooth-jy-mcu-v1-dot-02-plus-arduino-plus-debian/"/>
    <updated>2012-06-05T21:54:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/06/05/conectando-modulo-bluetooth-jy-mcu-v1-dot-02-plus-arduino-plus-debian</id>
    <content type="html"><![CDATA[<p>
Tempo curtissímo neste final de período de faculdade, mais hoje, não pude deixar de compartilhar algumas informações com os que estão junto comigo, descobrindo 
o Arduino. Vamos desenrrolar o assunto&#8230;
</p>


<p>
Recentemente comprei um módulo de Bluetooth para Arduino, o módulo adquirido foi o &#8220;JY-MCU V1.02&#8221; 
<a href="http://dx.com/p/jy-mcu-arduino-bluetooth-wireless-serial-port-module-104299?item=1">Confira aqui!!!</a>, então, fui à luta 
para fazer funfar no Debian (lembrando que sou novato no Debian e Arduino também) ;) , a briga foi boa!!! <br />
Gostaria de agradecer nosso
amigo/professor Marcelo Brunoro por ter mostrado que a placa realmente funciona (utilizando outro OS), antes que eu desistisse heheheh.
</p>


<!-- more -->




<h2>Requisitos para o Debian</h2>


<p>
O Debian 6 é instalado com o pacode de ferramentas <a href="http://packages.debian.org/pt/sid/gnome-bluetooth">gnome-bluetooth</a> para 
manipular dispositivos Bluetooth utilizado inteface gráfica, porém, esse pacote não possibilita o mapeamento de uma porta serial para o
dispositivo, e a comunição com o Arduino se dá via porta serial que, neste caso, utilizaremos como exemplo a biblioteca <a href="http://arduino.cc/hu/Reference/SoftwareSerial">SoftwareSerial</a>.
É preciso então a instalação do pacote <a href="http://blueman-project.org/">Blueman</a>, vamos lá então&#8230;
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install blueman
</span></code></pre></td></tr></table></div></figure>




<p>
Depois da instalação o programa se encontra em <em>System -> Preferences -> Bluetooth Manager</em>
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/blueman.png" width="789" title="&#34;Janela inicial do Blueman&#34;" alt="&#34;Janela inicial do Blueman&#34;"></p>

<p>
Antes de plugar o módulo, é preciso instalar mais um software, o <a href="http://packages.debian.org/unstable/comm/cutecom">&#8220;CuteCom&#8221;</a>, para monitoramento da porta serial, ele será útil para enviar e receber dados da porta destinada ao
módulo de Bluetooth.
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install cutecom
</span></code></pre></td></tr></table></div></figure>




<p>
Para finalizar, é preciso que sua IDE do Arduino seja a 1.0.1 ou superior, caso contrário a biblioteca SoftwareSerial irá bugar, para fazer esse trabalho de atualização 
é só seguir os passos neste post <a href="http://leandronunes.com/blog/2012/05/09/instalando-arduino-no-debian-squeeze/">Instalando Arduino No Debian Squeeze</a> trocando
a versão da IDE.
</p>




<h2>Ligando os componentes</h2>


<p>
O módulo JY-MCU V1.02 possui 4 pinos (RX, TX, GND E VCC) e já vem com um cabo.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/modulo.jpg" width="789" title="&#34;módulo JY-MCU V1.02 por Leandro Nunes&#34;" alt="&#34;módulo JY-MCU V1.02 por Leandro Nunes&#34;"></p>

<p>
A ligação no Arduino se dá da seguinte forma:
</p>


<table width="200px">
    <thead>
        <tr><th>JY-MCU</td><td>Arduino</th></tr>
    </thead>
    <tbody>
        <tr><td>RX</td><td>PINO 3</td></tr>
        <tr><td>TX</td><td>PINO 2</td></tr>
        <tr><td>GND</td><td>GND</td></tr>
        <tr><td>VCC</td><td>5V</td></tr>
    </tbody>
</table>


<br />


<p>
Agora é só plugar o cabo USB no Arduino e no PC, pronto, tudo conectado
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/arduino.jpg" width="789" title="&#34;módulo JY-MCU V1.02 plugado no Arduino, por Leandro Nunes&#34;" alt="&#34;módulo JY-MCU V1.02 plugado no Arduino, por Leandro Nunes&#34;"></p>

<h2>Codando nosso exemplo</h2>


<p>
Na IDE do Arduino existe vário exemplos de códigos para iniciar projetos, vamos utilizar um para testar nossa conexão, vá em <em>File -> Exemples -> SoftwareSerial -> SoftwareSerialExemple </em>
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/exemplos_arduino.jpg" width="789"></p>

<p>
Com algumas modificações o código ficou assim:
</p>




<figure class='code'><figcaption><span>Processing  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#include &lt;SoftwareSerial.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="n">SoftwareSerial</span> <span class="n">mySerial</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// RX, TX</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="nf">setup</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'> <span class="c1">// Open serial communications and wait for port to open:</span>
</span><span class='line'>  <span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">9600</span><span class="p">);</span>
</span><span class='line'>   <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">Serial</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">;</span> <span class="c1">// wait for serial port to connect. Needed for Leonardo only</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>  <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">&quot;Goodnight moon!&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// set the data rate for the SoftwareSerial port</span>
</span><span class='line'>  <span class="n">mySerial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">9600</span><span class="p">);</span>
</span><span class='line'>  <span class="n">mySerial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">&quot;Hello, world?&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="nf">loop</span><span class="p">()</span> <span class="c1">// run over and over</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">mySerial</span><span class="p">.</span><span class="n">available</span><span class="p">())</span>
</span><span class='line'>    <span class="n">Serial</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">mySerial</span><span class="p">.</span><span class="n">read</span><span class="p">());</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">Serial</span><span class="p">.</span><span class="n">available</span><span class="p">())</span>
</span><span class='line'>    <span class="n">mySerial</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">Serial</span><span class="p">.</span><span class="n">read</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<h3>O que foi mudado</h3>


<p>
<ul>
    <li>Os pinos utilizados <code>SoftwareSerial mySerial(2, 3);</code></li>
    <li>A taxa de rate na linha <code>Serial.begin(9600);</code></li>
    <li>A taxa rate do módulo<code>mySerial.begin(9600);</code></li>
</ul>
</p>




<p>
Vá em frente e faça o upload para o Arduino :)
</p>




<h2>Detectando o módulo de Bluetooth no PC</h2>


<p>
Agora abra o Bluetooth Manager, clique em Search e o módulo será listado como &#8220;linvor&#8221;, clicando com o botão direito, selecione &#8220;add Device&#8221;
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/add_device.png" width="789"></p>

<p>
Novamente como botão direito clique em &#8220;Pair&#8221;, será pedido o PIN, no nosso caso digite &#8220;1234&#8221;. <br />
Novamente como botão direito clique em &#8220;Dev B&#8221;, ufa! chega de botão direito, já estar conectado.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/conected.png" width="789"></p>

<p><em>
Em baixo na tarja amarela, visualizamos a porta que está sendo utilizada &#8220;/dev/rfcomm0&#8221;
</em></p>

<h3>Monitorando</h3>


<p>
Abra o CuteCom e no campo &#8220;Device:&#8221;, clique e digite o caminho da porta, depois é so clicar em &#8220;Open device&#8221;
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/cutecom.png" width="789"></p>

<p>
Voltamos na IDE do Arduino e abrimos o Serial Monitor, a mensagem &#8220;Goodnight moon!&#8221; será exibida
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/serial_monitor.png" width="789"></p>

<p>
No CuteCom será exibido &#8220;Hello, world?&#8221;
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/cutecom_mensagem.png" width="789"></p>

<p>
Pronto, agora o que voce digitar no campo &#8220;input&#8221; do CuteCom será exibido no Serial Monitor e vice-versa, neste caso os dispositivos estão pareados.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/arduino_bluetooth/mensagem_ok.png" width="789"></p>

<h2>Então&#8230;</h2>


<p>
Ufa! O módulo de Bluetooth JY-MCU V1.02 está conectado e conversando com o Arduino.<br />
O módulo de Bluetooth não estando pareado ele aceita uma série de comando como descrito por <a href="http://byron76.blogspot.com.br/2011/09/one-board-several-firmwares.html">Byron</a>,
vale a pena dar uma conferida, vou deixar para outro post. <br />
É isso ai, espero ter fornecido informações importantes para a continuação dos estudos. Até a proxima!!!!!
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instalando Arduino no Debian squeeze]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/05/09/instalando-arduino-no-debian-squeeze/"/>
    <updated>2012-05-09T21:39:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/05/09/instalando-arduino-no-debian-squeeze</id>
    <content type="html"><![CDATA[<p>
Ta nóis aqui em pleno carnaval 2012 atrás do bloco dos aficionados por tecnologia com uma boa xícara de café e estudando Arduino. Como usuário do Debian, percebi que instruções sobre instalação em livros não diz muita coisa mais garimpando na web, concluir minha instalação.
</p>


<!-- more -->


<p>
O Arduino esta dividido em dois pacotes:
</p>


<ul>
    <li>Arduino: Que é a IDE em Java para desenvolvimento e contém algumas biblioteca.</li>
    <li>Arquino-Core:  Ferramenta mínima para interagir via linha de comando sem dependências do Java, usando Makefile Martin Oldfield.</li>
</ul>




<p>
Alternativamente se seu arquivo  <em>/etc/apt/sources.list</em>  estiver atualizado você pode faze a instalação dos pacotes executando:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install arduino
</span></code></pre></td></tr></table></div></figure>


<p>ou</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install arduino-core
</span></code></pre></td></tr></table></div></figure>




<p>
Atualize seu arquivo lendo o post Tornando ninja o arquivo sources.list do Debian
</p>


<blockquote><p>Como eu não tinha certeza que a última versão está disponível nos repositórios do Debian e não queria testar, <br/>fiz a instalação baixando o pacote no site oficial <a href="http://arduino.cc/en/Main/Software" >http://arduino.cc/en/Main/Software.</a></p></blockquote>




<h2>Dependencias</h2>


<p>
Usuários do arduino Uno precisam instalar o pacote <em>brxtx-java versão 2.2pre2-3</em> ou superior  Então edite seu arquivo  <em>/etc /apt /sources.list</em> (ou use seu gerenciador de pacotes favorito gui) e adicione:
</p>




<p>
<em>deb http://ftp.us.debian.org/debian/ squeeze main contrib non-free</em><br /> 
Feito isso, execute:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install librxtx-java
</span></code></pre></td></tr></table></div></figure>




<p>
Agora instale todas as dependências
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install gcc-avr avrdude gcc avr-libc libantlr-java libecj-java libjna-java liboro-java openjdk-6-jdk
</span></code></pre></td></tr></table></div></figure>




<p>
Caso queira instalar somentes pacotes instáveis, retire a linha do arquivo source.list antes de executar este último comando.
</p>




<h2>Fazendo o download</h2>


<p>
Baixe o binário para linux de 32 bits (ou 64 bits, se for preciso) clicando no link <a href="http://arduino.cc/en/Main/Software">http://arduino.cc/en/Main/Software</a> e extraia o arquivo .tgz para a pasta de sua preferência.<br />
Vou baixar a versão para 64bits na pasta onde irei efetuar a instalação via linha de comando.
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> /opt/
</span><span class='line'>sudo wget http://arduino.googlecode.com/files/arduino-1.0-linux64.tgz
</span><span class='line'>sudo tar zxvf arduino-1.0-linux64.tgz
</span><span class='line'>sudo rm arduino-1.0-linux64.tgz
</span></code></pre></td></tr></table></div></figure>




<h2>Executando</h2>


<p>
Agora você já pode executar a IDE dando dois clicks no arquivo <em>/opt/arduino-1.0/arduino</em>  ou via linha de comando
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd </span>arduino-1.0
</span><span class='line'>sh arduino
</span></code></pre></td></tr></table></div></figure>




<p>
Caso queira adicionar o Arduino no menu de programas do Debian, leia este post <a href="http://leandronunes.com/blog/2012/05/05/adicionar-programa-no-menu-do-debian/">“Adicionar programa no menu do Debian”.</a>
</p>




<h2>Dando permissão</h2>


<p>
Você vai notar que não pode selecionar uma porta serial no menu ferramentas. Isto é provavelmente porque você precisa adicionar o usuário para alguns grupos. Você também tem que conectar o Arduino UNO para poder selecionar uma porta serial.
</p>




<p>
Para um teste rápido, você pode executar arduino como root com: sudo sh arduino. Você deve ser capaz de selecionar uma porta serial agora.
</p>




<p>
Claro que você não quer estar executando o IDE Arduino como root, então adicionar seu usuário ao grupo <code>tty</code> e <code>dialout</code>   assim:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo usermod -a -G tty yourUserName
</span><span class='line'>sudo usermod -a -G dialout yourUserName
</span></code></pre></td></tr></table></div></figure>




<p>
Faça logoff e logon novamente para que as alterações tenham efeito!
</p>




<h2>Então..</h2>


<p>
Isso é o começo para iniciar os teste com arduino e impressionar os vizinhos.<br />
Para mais detalhes sobre instalação em outros ambiente visite o <a href="http://renatoaloi.blogspot.com/2011/10/instalando-arduino-guia-completo.html">blog do Renato Aloi</a>, uma ótima referência de estudos também!
Mais informações de instação leia o site oficial <a href="http://arduino.cc/playground/Linux/Debian">http://arduino.cc/playground/Linux/Debian</a>
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[adicionar programa no menu do debian]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/05/05/adicionar-programa-no-menu-do-debian/"/>
    <updated>2012-05-05T21:07:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/05/05/adicionar-programa-no-menu-do-debian</id>
    <content type="html"><![CDATA[<p>
Hoje instalando um software via terminal do Debian senti a necessidade de adicioná-lo ao menu de aplicativos para facilitar a utilização e não  ficar passando path para starta via shell.
</p>




<p>
Nesse tutorial vamos instalar o <a href="http://www.scilab.org/">Scilab</a>. Para outros aplicativos somente precisamos trocar o path do executável e do ícone.
</p>


<!-- more -->




<h2>Adicionando…</h2>


<p>
<b>1)</b> Clique com o botão direito na barra de menu e escolha a opção <em>Edit menus</em>
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/menu-debian/step1.jpg" width="789"></p>

<p>
<b>2)</b> Na tela que se abre, ecolha na aba Menus no lado esquerdo onde irá inserir o programa e depois clique em <em>New Item</em>.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/menu-debian/step2.jpg" width="789"></p>

<p>
<b>3)</b> Agora vamos inserir as informações necessárias
</p>


<ul>
    <li>Type:          Application</li>
    <li>Name:          Scilab</li>
    <li>Command:  <code>/opt/scilab-5.3.3/bin/scilab</code></li>
    <li>Comment:  Qualquer coisa</li>
</ul>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/menu-debian/step3.jpg" width="789"></p>

<p>
<b>4)</b> Para trocar o ícone, clique nele e selecione uma imagem em  /opt/scilab-5.3.3/share/scilab/icons
<blockquote><p>Por default o Debian abre na paste de ícones padrão.</p></blockquote>
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/menu-debian/step4.jpg" width="789"></p>

<p>
<b>5)</b> Pronto! está lá nosso atalho para o Scilab inserido no menu. Acesse e confira pois o Debian não deixou eu dar um print screen com o menu aberto. :P
</p>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tornando ninja o arquivo sources.list do Debian]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/04/17/tornando-ninja-o-arquivo-sources-dot-list-do-debian/"/>
    <updated>2012-04-17T22:30:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/04/17/tornando-ninja-o-arquivo-sources-dot-list-do-debian</id>
    <content type="html"><![CDATA[<p>
Para que o uso do computador faça sentido, precisamos instalar softwares que satisfaçam nossas necessidades. Para lidar com esse problema, o Debian possui ferramentas para instalar e atualizar pacotes e suas dependências de maneira rápida e prática. Nossos amigos são o APT e o APTITUDE.
</p>


<!-- more -->


<p>
Quando utilizamos essas ferramentas para instalar pacotes, elas fazem uma consulta no arquivo <em>sources.list</em> que geralmente estar em <em>/etc/apt/</em> e este arquivo possui uma lista de repositórios onde irá ser efetuada a busca atrás do pacote solicitado.
</p>




<p>
Vamos então adicionar mais repositórios neste arquivo para que nossos amigos (APT e APTITUDE) achem o que precisamos com maior facilidade.
</p>




<p>
O Jonhnatha Trigueiro mantem o site <a href="http://goo.gl/L0H76" title="Ir para o site">Debian Sources List</a> Generator que é uma mão na roda para esta tarefa. Vamos ver como tudo funciona.
</p>




<h2>Selecionado repositórios</h2>


<p>
<a href="http://goo.gl/L0H76">Acessem o site clicando aqui..</a> Na página inicial possuímos 5 passos para gerar um arquivo <em>sources.list</em> customizado, vamos seguílos.
</p>




<h3>1 – Select your country</h3>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/source-list/step1.png" width="789"></p>

<p>
Escolhemos de qual país serão nossos repositórios.
</p>




<h3>2 – Select your release</h3>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/source-list/step2.png" width="789"></p>

<p>
Para qual versão do Debian.
</p>




<h3>3 – Debian Branches</h3>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/source-list/step3.png" width="789"></p>

<p>
Repositórios disponíveis. Temos duas opções para cada um sendo que a que possui Sources Repository armazena código fonte para desenvolvedores.
</p>




<h3>4 – Debian Updates</h3>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/source-list/step4.png" width="789"></p>

<p>
O títudo é bem intuitivo!
</p>




<h3>5 – 3rd Parties Repos</h3>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/source-list/step5.png" width="789"></p>

<p>
Repositórios adicionados por terceiros. Esta lista é bem maior e varia de acordo com o release escolhido.
</p>




<h2>Gerando o arquivo</h2>


<p>
Depois das escolhas, clique em <strong>Generate List</strong>
Uma lista com todos os repositórios escolhidos é gerada, então abra o arquivo sources.list e substitua seu conteúdo.
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo vim /etc/apt/sources.list
</span></code></pre></td></tr></table></div></figure>




<p>
Para os repositórios de terceiro é necessário adicionar a chave publica ssh para que seja efetuada a busca, observe a lista que o comando para esta tarefa já está incluído.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/source-list/step6.png" width="789"></p>

<p>
É só copiar e executar no terminal!
</p>




<h2>Atualizando a distro!</h2>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get update
</span><span class='line'>sudo apt-get upgrade
</span><span class='line'>sudo aptitude update
</span></code></pre></td></tr></table></div></figure>




<p>
Espero que estas informações sejam úteis, principalmente para os que como eu, estão começando.
Dêem uma navegada em <a href="http://goo.gl/L0H76" title="Ir para o site">Debian Sources List</a> , temos a possibilidade de adicionar repositórios também e contribuir para a comunidade open source.
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Implementando aplicações Rails com Capistrano]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/04/06/Implementando-aplicacoes-rails-com-capistrano/"/>
    <updated>2012-04-06T17:37:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/04/06/Implementando-aplicacoes-rails-com-capistrano</id>
    <content type="html"><![CDATA[<p>
Chegou a hora de implantar a aplicação para os primeiros testes do cliente?<br />
Vamos ver como a dupla sertaneja <a href="http://rubyonrails.org/" title="Framework em Ruby para desenvolvimento de aplicações web">Rails</a> & <a href="http://capistranorb.com/">Capistrano</a> soam bem nesta tarefa.
</p>


<!-- more -->


<p>
O Capistrano é uma gem para implantar (deploy) aplicações web. Inicialmente desenvolvida para Rails, 
tem a finalidade de enviar seu código fonte para um servidor web e permitir o versionamento, ou seja, 
te dando super poderes para voltar a versão anterior do seu código caso algo dê errado na versão atual. 
Com um pouquinho de configuração o Capistrano pode ser utilizado para outros framework/linguagem. 
</p>




<p>
Vamos adimitir que você já tenha conhecimento em Sistemas de Controle de Versão (<a href="http://github.com/" title="Sistema de controle de versão distribuído">Git</a>, <a href="http://subversion.apache.org/" title="Sistema de controle de versão centralizado" >SVN</a>, etc) e que seu 
ambiente de desenvolvimento esteja funfando com a aplicação.
</p>


<p><em>Hoje foi o meu primeiro contato com o Capistrano, abaixo segue minhas descobertas.</em></p>

<h2>Requisitos</h2>




<p>
Para executar esta tarefa temos que verificar em nossa maleta de ferramentas se está presente:
</p>


<ul>
    <li><a href="http://www.ruby-lang.org/en/">Ruby</a></li>
    <li>Uma aplicação (no meu caso em Rails)</li>
    <li>Servidor Web com suporte a SSH</li>
    <li>Terminal (bash, sh, etc…)</li>
    <li>Um repositório (No meu caso GIT)</li>
</ul>




<h2>Instalação</h2>


<p>
Como citado, o Capistrano é um gem e com isso você pode instalar do jeito tradicional mesmo. <br />
É, aquele fácil! Fazemos assim:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>gem install capistrano
</span></code></pre></td></tr></table></div></figure>




<p>
O capistrano adiciona alguns utilitários de linha de comando, o <code>cap</code> e <code>capify</code> iremos conhecer mais abaixo.
Também é possível adicionar esta gem no arquivo GemFile do seu projeto.
</p>




<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;capistrano&#39;</span>
</span></code></pre></td></tr></table></div></figure>




<p>
e depois executar o <code>bundle install</code> em seu terminal.
</p>




<h2>Iniciando</h2>


<p>
Agora utilizamos o <code>capify</code> , nosso amigo de linha de comando para fazer com que o Capistrano monitore nossa work area e nos dê opções para configurá-lo. Primeiramente temos que estar na raiz do diretório do nosso projeto.
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> /app_rails/
</span></code></pre></td></tr></table></div></figure>




<p>Agora é só executar!</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>capify .
</span></code></pre></td></tr></table></div></figure>




<p>Com isso ganhamos dois arquivos em nosso projeto, são eles:</p>


<ul>
    <li><b>capifile</b> –> Possui referências as bibliotecas usadas pelo Capistrano e é responsável em carregá-las.</li>
    <li><b>config/deploy.rb</b> –> Este possui todas diretrizes para configurar sua implantação, geralmente precisamos editar apenas este.</li>
</ul>




<h2>Confirgurações</h2>


<p>
O Capistrano precisa de algumas informações para que tudo funcione conforme esperamos e isso fazemos editando o arquivo config/deploy.rb. Estou usando um projeto fictício apenas para exemplo, fique atendo as informações que devem ser substituidas conforme as suas configurações.
<br />Vamos lá então!
</p>


<h3>A) Informações do projeto</h3>




<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">set</span> <span class="ss">:application</span><span class="p">,</span> <span class="s2">&quot;app_rails&quot;</span>       <span class="c1"># O nome do projeto</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:keep_releases</span><span class="p">,</span> <span class="mi">5</span>               <span class="c1"># Isso guardar os 5 últimos deploys</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:rails_env</span><span class="p">,</span>     <span class="s2">&quot;production&quot;</span>    <span class="c1"># O ambiente em que o Rails irá atuar</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Toda vez que adicionarmos uma nova funcionalidade ao projeto iremos implementá-la no servidor para que outros tenham acesso e nesse processo, o Capistrano faz o versionamento mantendo seu release anterior. Na linha 2 dizemos que será mantido as 5 últimas atualizações, assim caso algo saia errado neste novo release, podemos usar um comandinho salvador da pátria.
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>cap rollback
</span></code></pre></td></tr></table></div></figure>




<p>com isso voltamos ao release que estava funfando.</p>




<h3>B) SCM (source code manager)</h3>




<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">set</span> <span class="ss">:scm</span><span class="p">,</span> <span class="s1">&#39;git&#39;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:repository</span><span class="p">,</span>  <span class="s2">&quot;git@github.com:LeandroSNunes/app_rails.git&quot;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:branch</span><span class="p">,</span> <span class="s1">&#39;master&#39;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:deploy_via</span><span class="p">,</span> <span class="ss">:remote_cache</span>
</span></code></pre></td></tr></table></div></figure>




<p>
No meu caso uso Git como repositório e informo na linha 1. A linha 4 é informado ao Capistrano que ele não precisa pegar todo repositório toda vez que subirmos um novo release, ele somente irá buscar as modificações.
</p>


<h3>C) Informações do servidor</h3>




<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">default_run_options</span><span class="o">[</span><span class="ss">:pty</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'><span class="n">ssh_options</span><span class="o">[</span><span class="ss">:forward_agent</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:user</span><span class="p">,</span> <span class="s2">&quot;leandro&quot;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:use_sudo</span><span class="p">,</span> <span class="kp">false</span>
</span><span class='line'><span class="n">server</span> <span class="s2">&quot;leandronunes.com.br&quot;</span><span class="p">,</span> <span class="ss">:web</span><span class="p">,</span> <span class="ss">:app</span><span class="p">,</span> <span class="ss">:db</span><span class="p">,</span> <span class="ss">:primary</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:deploy_to</span><span class="p">,</span> <span class="s2">&quot;/www/app_rails.leandronunes.com.br/</span><span class="si">#{</span><span class="n">application</span><span class="si">}</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Na linha 2 permitimos que o SSH carregue nossa chave para o servidor para que de lá seja acessado o github.<br />
O usuário informado precisa ter permissões de escrita no servidor.<br />
Alguns comandos por default são executados com sudo, porém se tiver usando um servidor compartilhado e que não tiver acesso de superusuário, informe para não utilizar o sudo como na linha 4.<br />
O Capistrano entende que sua aplicação irá fazer muito sucesso e que seja preciso distribuí-la em vários servidores, no meu caso estou enviando tudo para o mesmo lugar então a linha 5 é uma forma otimizada de informar isso.
</p>


<p>Caso precise redirecionar serviços para outros servidores, você pode substituir a linha 5 por:</p>




<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">role</span> <span class="ss">:web</span><span class="p">,</span> <span class="s1">&#39;dominio&#39;</span>
</span><span class='line'><span class="n">role</span> <span class="ss">:app</span><span class="p">,</span> <span class="s1">&#39;dominio&#39;</span>
</span><span class='line'><span class="n">role</span> <span class="ss">:db</span><span class="p">,</span>  <span class="s1">&#39;dominio&#39;</span><span class="p">,</span> <span class="ss">:primary</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>




<h2>Ops! Executando.</h2>


<p>Agora é a hora! Vamos implantar nossa aplicação no servidor, começamos verificando se tudo está OK.</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>cap deploy:check
</span></code></pre></td></tr></table></div></figure>




<p>Tudo correndo bem, você será informado. Seguindo, criaremos a estrutura de pastas no servidor.</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>cap deploy:setup
</span></code></pre></td></tr></table></div></figure>




<p>
O que fizemos? Com isso será criado duas pastas (<em>release</em> e <em>shared</em>) e ainda um link simbólico chamado <em>current</em> apontando para o último release. Na pasta releases é criado uma pasta para o deploy efetuado. A pasta shared serve para armazenar arquivos que serão compartilhados entre os releases, como logs, imagens, arquivos de configuração, etc…
</p>


<blockquote><p>Quando trabalhamos com Rails, Git e mais de um desenvolvedor é de prática adicionar nosso arquivo database.yml ao .gitignore, fazendo com que este não seja monitorado e conseguentemente não enviado para o repositório, assim configuramos um único arquivo de banco de dados e colocamos na pasta shared para que todos releases compartilhem a mesma configuração. Mais abaixo vamos adicionar uma tarefa pra fazer isso.</p></blockquote>




<h3>A) Criando tarefas para o Capistrano</h3>




<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">namespace</span> <span class="ss">:deploy</span> <span class="k">do</span>
</span><span class='line'><span class="c1">#   task :start do ; end</span>
</span><span class='line'><span class="c1">#   task :stop do ; end</span>
</span><span class='line'>   <span class="n">task</span> <span class="ss">:restart</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span><span class="p">,</span> <span class="ss">:except</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="ss">:no_release</span> <span class="o">=&gt;</span> <span class="kp">true</span> <span class="p">}</span> <span class="k">do</span>
</span><span class='line'>     <span class="n">run</span> <span class="s2">&quot;touch </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">/tmp/restart.txt&quot;</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'>   <span class="n">task</span> <span class="ss">:database</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>     <span class="n">run</span> <span class="s2">&quot;cp </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">shared_dir</span><span class="si">}</span><span class="s2">/database.yml </span><span class="si">#{</span><span class="n">release_path</span><span class="si">}</span><span class="s2">/config/&quot;</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'>   <span class="n">task</span> <span class="ss">:permission</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="ss">:web</span><span class="p">,</span> <span class="ss">:db</span><span class="p">,</span> <span class="ss">:app</span><span class="o">]</span> <span class="k">do</span>
</span><span class='line'>     <span class="n">run</span> <span class="s2">&quot;chmod 755 </span><span class="si">#{</span><span class="n">release_path</span><span class="si">}</span><span class="s2">/public -R&quot;</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:assets</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">task</span> <span class="ss">:symlink</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">assets</span><span class="o">.</span><span class="n">create_dir</span>
</span><span class='line'>        <span class="n">run</span> <span class="o">&lt;&lt;-</span><span class="no">CMD</span>
</span><span class='line'><span class="sh">         rm -rf  #{release_path}/public/images/upload &amp;&amp;</span>
</span><span class='line'><span class="sh">         ln -nfs #{shared_path}/upload #{release_path}/public/images/upload</span>
</span><span class='line'><span class="no">       CMD</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>      <span class="n">task</span> <span class="ss">:create_dir</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">run</span> <span class="s2">&quot;mkdir -p </span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2">/upload&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">after</span> <span class="s2">&quot;deploy:assets:symlink&quot;</span><span class="p">,</span> <span class="s1">&#39;deploy:database&#39;</span>
</span><span class='line'><span class="n">after</span> <span class="s2">&quot;deploy:update_code&quot;</span><span class="p">,</span> <span class="s1">&#39;deploy:permission&#39;</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Ao concluir o deploy é necessário reiniciar o servidor para que as novas configurações entrem em vigor, podemos fazer isso simplesmente atualizando o arquivos <em>tmp/restart.txt</em>, percebam na tarefa restart.
</p>


<p>
Acima adicionamos nosso arquivo database.yml em nossa pasta shared então precisamos adicioná-la dentro do release corrente após o deploy, a tarefa <em>database</em> faz exatamente isso.
</p>


<p>
Na tarefa permissions setamos as permissões necessárias para pasta public.
</p>


<p>
Depois, resolvemos o problemas de aquivos de imagens adicionados pelos usuários (podemos supor um cadastro de produtos). As tarefas dentro de <em>assets</em> criam uma pasta upload dentro de shared e um link simbólico em <em>public/imagens</em> apontando para esta pasta.
</p>




<p>Por fim vamos executar o tão esperado deploy.</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>cap deploy:cold
</span><span class='line'>cap deploy
</span></code></pre></td></tr></table></div></figure>




<p>
Rodamos o <code>cap deploy:cold</code> primeiro para colocar os arquivos no servido, depois efetuamos o deploy.<br />
A partir da segunda implantação não é necessário rodar <code>cap deploy:cold</code><br />
Se precisar migrar seu banco utilize <code>cap deploy:migrations</code><br />
Alguma coisa fugiu do controle? volte ao release anterior com <code>cap deploy:rollback</code><br />
Para mais informações <code>cap -T</code> para visualizar todas as tarefas do Capistrano.
</p>




<h2>Juntando tudo</h2>




<figure class='code'><figcaption><span>ruby  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Projeto</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:application</span><span class="p">,</span> <span class="s2">&quot;app_rails&quot;</span>       <span class="c1"># O nome do projeto</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:keep_releases</span><span class="p">,</span> <span class="mi">5</span>               <span class="c1"># Isso guardar os 5 últimos deploys</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:rails_env</span><span class="p">,</span>     <span class="s2">&quot;production&quot;</span>    <span class="c1"># O ambiente em que o Rails irá atuar</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># SCM</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:scm</span><span class="p">,</span> <span class="s1">&#39;git&#39;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:repository</span><span class="p">,</span>  <span class="s2">&quot;git@github.com:LeandroSNunes/app_rails.git&quot;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:branch</span><span class="p">,</span> <span class="s1">&#39;master&#39;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:deploy_via</span><span class="p">,</span> <span class="ss">:remote_cache</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Servidor</span>
</span><span class='line'><span class="n">default_run_options</span><span class="o">[</span><span class="ss">:pty</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'><span class="n">ssh_options</span><span class="o">[</span><span class="ss">:forward_agent</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:user</span><span class="p">,</span> <span class="s2">&quot;leandro&quot;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:use_sudo</span><span class="p">,</span> <span class="kp">false</span>
</span><span class='line'><span class="n">server</span> <span class="s2">&quot;leandronunes.com.br&quot;</span><span class="p">,</span> <span class="ss">:web</span><span class="p">,</span> <span class="ss">:app</span><span class="p">,</span> <span class="ss">:db</span><span class="p">,</span> <span class="ss">:primary</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:deploy_to</span><span class="p">,</span> <span class="s2">&quot;/www/app_rails.leandronunes.com.br/</span><span class="si">#{</span><span class="n">application</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#Tarefas</span>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:deploy</span> <span class="k">do</span>
</span><span class='line'><span class="c1">#   task :start do ; end</span>
</span><span class='line'><span class="c1">#   task :stop do ; end</span>
</span><span class='line'>   <span class="n">task</span> <span class="ss">:restart</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span><span class="p">,</span> <span class="ss">:except</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="ss">:no_release</span> <span class="o">=&gt;</span> <span class="kp">true</span> <span class="p">}</span> <span class="k">do</span>
</span><span class='line'>     <span class="n">run</span> <span class="s2">&quot;touch </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">/tmp/restart.txt&quot;</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'>   <span class="n">task</span> <span class="ss">:database</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>     <span class="n">run</span> <span class="s2">&quot;cp </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">shared_dir</span><span class="si">}</span><span class="s2">/database.yml </span><span class="si">#{</span><span class="n">release_path</span><span class="si">}</span><span class="s2">/config/&quot;</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'>   <span class="n">task</span> <span class="ss">:permission</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="ss">:web</span><span class="p">,</span> <span class="ss">:db</span><span class="p">,</span> <span class="ss">:app</span><span class="o">]</span> <span class="k">do</span>
</span><span class='line'>     <span class="n">run</span> <span class="s2">&quot;chmod 755 </span><span class="si">#{</span><span class="n">release_path</span><span class="si">}</span><span class="s2">/public -R&quot;</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:assets</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">task</span> <span class="ss">:symlink</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">assets</span><span class="o">.</span><span class="n">create_dir</span>
</span><span class='line'>        <span class="n">run</span> <span class="o">&lt;&lt;-</span><span class="no">CMD</span>
</span><span class='line'><span class="sh">         rm -rf  #{release_path}/public/images/upload &amp;&amp;</span>
</span><span class='line'><span class="sh">         ln -nfs #{shared_path}/upload #{release_path}/public/images/upload</span>
</span><span class='line'><span class="no">       CMD</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>      <span class="n">task</span> <span class="ss">:create_dir</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">run</span> <span class="s2">&quot;mkdir -p </span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2">/upload&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">after</span> <span class="s2">&quot;deploy:assets:symlink&quot;</span><span class="p">,</span> <span class="s1">&#39;deploy:database&#39;</span>
</span><span class='line'><span class="n">after</span> <span class="s2">&quot;deploy:update_code&quot;</span><span class="p">,</span> <span class="s1">&#39;deploy:permission&#39;</span>
</span></code></pre></td></tr></table></div></figure>




<h2>Então&#8230;</h2>


<p>
Isso foi minha colheita em um dia de deploy aqui na empresa e basicamente quando for efetuar um deploy da sua aplicação você vai estar neste ciclo novamente:
</p>


<ul>
    <li>Adicionar seu último release em um repositório</li>
    <li>Iniciar o monitoramento do Capistrano no diretório de sua aplicação</li>
    <li>Editar o arquivo de configuração do Capistrano</li>
    <li>Fazer um confere das configurações no servidor</li>
    <li>Montar a estrutura de pastas no servidor</li>
    <li>Fazer deploy de sua aplicação</li>
    <li>Configurar o ambiente de produção</li>
    <li>Cruzar os dedos e atualizar seu navegador</li>
</ul>


<p>
Algumas informações tive acesso dando umas googladas e dois blogs que usei de referências foram 
<a href="http://blog.dmitrynix.com/deploy-capistrano/" >Unix and Me</a> e <a href="http://objetiva.co/blog/2008/06/25/capistrano-com-git-tutorial-bsico" >Objetiva</a>, acessem para visualizarem o conteúdo completo.
</p>


<p>
Para mais informações
<a href="https://github.com/capistrano/capistrano/wiki/_pages">https://github.com/capistrano/capistrano/wiki/_pages</a>
</p>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instalando o Scilab no Windows]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/22/instalando-o-scilab-no-windows/"/>
    <updated>2012-02-22T20:40:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/22/instalando-o-scilab-no-windows</id>
    <content type="html"><![CDATA[<p>
Instalar o Scilab no Windows é super simple, acesse o site oficial <a href="http://www.scilab.org" title="Site oficial do Scilab para download da ferramenta e tutoriais">www.scilab.org</a> para baixar a última versão.
</p>




<!-- more -->




<p>
Clique em download para baixar a versão de 32bits ou selecione Other Systems para baixar para a versão de 64bits ou para outro OS.
</p>




<h3>Instalação</h3>


<p>
1) Ao terminar o download, execute o arquivo para iniciar a instalação. Na tela que se abre, clique em Run.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-windows/step2.jpg" width="789"></p>

<p>
2) Agora escolha o idioma que será utilizado durante a instalação.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-windows/step3.jpg" width="789"></p>

<p>
3) Chegamos no assistente, então, clique em avançar.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-windows/step4.jpg" width="789"></p>

<p>
Daqui pra frente, segue-se o modo de instalação padrão do windows: avançar, avançar e avançar. <br />

4) Após a instação o Scilab abrirá o seu Console:
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-windows/console.jpg" width="789"></p>

<blockquote><p>Este iremos estudar no próximo post.</p></blockquote>




<h3>Finalizando</h3>


<p>
Como de costume após uma instação, vamos imprimir a famosa frase “Alô Mundo” e testar se está tudo ok, para isso, no pronpt do 
console <code> –> </code> digite o seguinte comando:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>disp<span class="o">(</span><span class="s2">&quot;Alô Mundo&quot;</span><span class="o">)</span>;
</span></code></pre></td></tr></table></div></figure>




<p>
Agora para encerrar e aguardarmos o próximo post digite:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">exit</span>
</span></code></pre></td></tr></table></div></figure>




<h3>Informações Úteis</h3>


<p><a href="http://leandronunes.com/blog/2012/02/22/instalando-o-scilab-no-linux/">Para saber como instalar o Scilab em ambiente windows clique aqui.</a>
No site  do Scilab existe versões de instalação para MacOSX, Linux e Windows ambas de distribuição <a href="http://www.gnu.org/licenses/license-list.html" title="Ir para outro site" target="_blank">free</a>,
lembrando que seu uso está sobre a licença <a href="http://www.cecill.info/" title="Ir para outro site" target="_blank">CeCILL (GPL compatible)</a>. Você pode usar, modificar e / ou redistribuir o software sob os termos da licença.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instalando o Scilab no Linux]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/22/instalando-o-scilab-no-linux/"/>
    <updated>2012-02-22T20:01:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/22/instalando-o-scilab-no-linux</id>
    <content type="html"><![CDATA[<p>Para instalar o Scilab no Linux vamos fazer uso do nosso terminal, assim fica bem simples. <br />
A minha instalação foi efetuada no Debian 6 squeeze 64bits.</p>

<!-- more -->




<h3>Instalação</h3>


<p>Temos versões do Scilab para 32bits e 64bits. A instalação é igual mudando apenas o link para o download. Fazemos assim:</p>

<p><b>1)</b> Acessando a pasta onde queremos efetuar a instalação, no meu caso  <code> /opt </code></p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> /opt
</span></code></pre></td></tr></table></div></figure>


<p><b>2)</b> Baixando o binário na versão do nosso sistema.</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># 32 bits</span>
</span><span class='line'>wget http://www.scilab.org/download/5.3.3/scilab-5.3.3.bin.linux-i686.tar.gz
</span><span class='line'>
</span><span class='line'><span class="c">#64 bits</span>
</span><span class='line'>wget http://www.scilab.org/download/5.3.3/scilab-5.3.3.bin.linux-x86_64.tar.gz
</span></code></pre></td></tr></table></div></figure>




<blockquote><p>Vou seguir utilizando a verão para 64 bits.</p></blockquote>


<p><b>3)</b> Vamos descompactá-lo então</p>

<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>tar fzxv scilab-5.3.3.bin.linux-x86_64.tar.gz
</span></code></pre></td></tr></table></div></figure>




<p>
Pronto! Scilab instalado.
</p>




<h3>Utilizando</h3>


<p>
Para executá-lo é so digitar
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>/opt/scilab-5.3.3/bin/scilab
</span></code></pre></td></tr></table></div></figure>




<p>
Para facilitar, podemos adicionar o Scilab no menu do Debian, é só dar uma olhada <a href="http://goo.gl/bmTol" title="Ir para o post">aqui</a> para saber como.
<br />
Com o Scilab em execução, vamos imprimir a famosa frase “Alô Mundo” e testar se está tudo ok, para isso, no pronpt do console do Scilab  <code> –> </code> digite o seguinte comando:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>disp<span class="o">(</span><span class="s2">&quot;Alô Mundo&quot;</span><span class="o">)</span>;
</span></code></pre></td></tr></table></div></figure>




<p>
Agora para encerrar e aguardarmos o próximo post digite:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">exit</span>
</span></code></pre></td></tr></table></div></figure>




<h3>Informações Úteis</h3>


<p><a href="http://leandronunes.com/blog/2012/02/22/instalando-o-scilab-no-windows/">Para saber como instalar o Scilab em ambiente windows clique aqui.</a>
No site  do Scilab existe versões de instalação para MacOSX, Linux e Windows ambas de distribuição <a href="http://www.gnu.org/licenses/license-list.html" title="Ir para outro site" target="_blank">free</a>,
lembrando que seu uso está sobre a licença <a href="http://www.cecill.info/" title="Ir para outro site" target="_blank">CeCILL (GPL compatible)</a>. Você pode usar, modificar e / ou redistribuir o software sob os termos da licença.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Scilab, conceitos básicos]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/21/scilab-conceitos-basicos/"/>
    <updated>2012-02-21T23:57:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/21/scilab-conceitos-basicos</id>
    <content type="html"><![CDATA[<p>
A melhor maneira de se aprender algo é colocando a mão na massa. <br />
Vamos conhecer neste post o Console do <a href="http://www.scilab.org/" title="Site oficial do Scilab para download da ferramenta e tutoriais" >Scilab</a> que é o pontapé inicial para entender
 o software. Nele encontra-se o pronpt <code> –> </code> onde podemos executar comandos, instruções, carregar arquivos, configurar o path, iniciar outras janelas, etc…
</p>




<!-- more -->


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-conceitos/janela-console.png" width="789" title="&#34;Janela do console do Scilab&#34;" alt="&#34;Janela do console do Scilab&#34;"></p>

<h2>Conhecendo o console</h2>


<p>
Vamos conhecer alguns itens do menu que poderão ser úteis e a execução de algumas tarefas. Percorrendo o menu temos:
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-conceitos/menu.png" width="789" title="&#34;Imagem do menu do Scilab&#34;" alt="&#34;Imagem do menu do Scilab&#34;"></p>

<p>

<ul>
  <li>File:</li>
    <ul>
      <li>Execute: Executa arquivos de scripts e com instruções de comando</li>
      <li>Open a File: Carrega arquivos de textos criados no ambiente do Scilab (.sce e .sci)</li>
      <li>Change Current Directory: Muda o diretório atual do ambiente para um novo local,  comando: <code> –>chdir(‘novaPasta’); </code> no prompt.</li>
      <li>Display Current Directory: Mostra o diretório atual, <code> –>pwd; </code> no prompt.</li>
    </ul>
  <li>Edit</li>
    <ul>
      <li>No menu editar temos as opções padrão que dispensa comentários.</li>
    </ul>
  <li>Preferences</li>
    <ul>
      <li>Clear Console: Limpa o console mais não apaga os dados da memória, podemos executar esta função de outras duas formas: a) Apertando a tecla F2 ou  b) digitando <code> –>clc; </code> no prompt</li>
    </ul>  
  <li>Control</li>
    <ul>
      <li>Resume: Continua a execução após um pause ou um stop</li>
      <li>Abort: Interromp a execução</li>
      <li>Interrupt: Entra no modo de pause, podemos fazer <code> –>Ctrl+C; </code> no prompt</li>
    </ul>
  <li>Applications</li>
    <ul>
      <li>SciNotes: O editor de textos, podemos chamá-lo via prompt com o comando <code> –>editor; </code></li>
    </ul>
  <li>?</li>
    <ul>
      <li>Scilab help: Abre o componente de ajuda.</li>
      <li>Scilab Demonstrations: Exibe a janela de demonstrações de comandos do Scilab</li>
    </ul>
</ul>
</p>




<h2>Digitando comandos</h2>


<p>
Comandos são palavras-chave do Scilab que executam determinadas tarefas e instruções são um conjunto de 
palavras-chave em ordens digitadas no prompt e finalizadas com <code> <Enter> </code>.
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">y</span><span class="o">=</span>ode<span class="o">(</span>1.e-8*<span class="o">[</span>1;1;1<span class="o">]</span>,0,0:0.005:50,<span class="s1">&#39;loren&#39;</span><span class="o">)</span>;
</span><span class='line'><span class="c"># O console permite várias instruções na mesma linha </span>
</span><span class='line'><span class="c"># separadas por ponto e vírgula.</span>
</span><span class='line'><span class="nv">a</span> <span class="o">=</span> 10; <span class="nv">b</span> <span class="o">=</span> 5; <span class="nv">c</span> <span class="o">=</span> 4+3
</span><span class='line'><span class="c"># O console sempre retorna  o valor do último processamento</span>
</span></code></pre></td></tr></table></div></figure>




<p>
O uso de <code> ; </code> (ponto e vírgura) no final de cada instrução é opcional, a diferença é que se usarmos a saída será omitida.
</p>




<p>
Muitas vezes quando trabalhamos no editor e executamos um script, percebe-se que não aconteceu nada e aparentemente o 
Scilab está travado, na verdade, o console pode estar esperando uma interação sua para continuar a exibir as 
informações, isso ocorre devido que o retorno de algumas funções ultrapassam a area visível do console.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-conceitos/interacao.png" width="789" title="&#34;Janela do console esperando uma interação para continuar a exibir as informações&#34;" alt="&#34;Janela do console esperando uma interação para continuar a exibir as informações&#34;"></p>

<p>
então é sempre bom fazer uso do <code> ; </code> (ponto e virgula) no final de cada instrução.<br />

Caso não lembre o nome do comando, você pode utilizar <code> Ctrl+Espaço </code> que aparece uma lista de comando similares.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-conceitos/auto-complete.jpg" width="789" title="&#34;Pesquisando nome de funções pela funcionalidade do auto-complete&#34;" alt="&#34;Pesquisando nome de funções pela funcionalidade do auto-complete&#34;"></p>

<h2>Conhecendo erros</h2>


<p>
Para os comandos não executados corretamente uma mensagem de erro será exibida. Exemplo:
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>!--error 4
</span><span class='line'>Undefined variable: e
</span></code></pre></td></tr></table></div></figure>




<p>
Podemos exibir a lista de todos os erros gerados pelo Scilab
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">help </span>error_table
</span></code></pre></td></tr></table></div></figure>




<h2>Considerações sobre variáveis</h2>


<p>
<ul>
  <li>O Scilab é case sensitive, isto é, difere maiúscula de minúscula;</li>
  <li>Tem tipagem dinâmica, ou seja, a variável que recebe o tipo de dados numérico poderá posteriormente receber uma string sem problemas;</li>
  <li>Em nomes de variáveis não são permitidos caracteres especiais;</li>
  <li>O nome de uma variável pode ter no máximo 24 caracteres e começar com <code> _ </code> (underline) ou letra;</li>
</ul>
</p>




<h2>Considerações sobre constantes</h2>


<p>
Constantes especiais começam com %
<ul>
  <li>%f – Valor lógico false</li>
  <li>%t – Valor lógico True</li>
  <li>%eps – Precisão da máquina virtual para números reais</li>
  <li>%pi – 3.1415927…</li>
  <li>%e – Base dos logaritmos naturais</li>
  <li>%inf – Infinito</li>
  <li>%nan – not a number (não é número)</li>
  <li>%i – parte imaginária de númeors complexos</li>
</ul>
</p>




<h2>Comandos básicos</h2>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">pwd</span>         <span class="c">#exibe o diretorio atual ,</span>
</span><span class='line'>home        <span class="c">#exibe o diretorio atual</span>
</span><span class='line'>chdir       <span class="c">#muda o diretorio de corrent</span>
</span><span class='line'>mkdir       <span class="c">#cria diretórios</span>
</span><span class='line'>dir         <span class="c">#exibe o nome dos arquivos no diretório corrent</span>
</span><span class='line'>clc         <span class="c">#limpa toda area de trabalho e coloca o cursor no inicio</span>
</span><span class='line'>clc<span class="o">(</span>n<span class="o">)</span>      <span class="c">#limpa n linhas acima da linha atual</span>
</span><span class='line'>clear       <span class="c">#limpa as variáveis da memória</span>
</span><span class='line'>who         <span class="c">#exibe  as constantes especias e as variaveis atuais na memória</span>
</span><span class='line'>whos        <span class="c">#exibe os nomes, os tamanhos e os tipos de dados de todas as variáveis na memória</span>
</span></code></pre></td></tr></table></div></figure>




<h2>É isso ai</h2>


<p>
Conhecemos um pouco do ambiente do Scilab, ficar atento ao “;” pode poupar tempo na execução de scripts.<br /> 
Para saber mais sobre o console você pode acessar a documentação <a href="http://help.scilab.org/docs/5.3.2/pt_BR/console.html" title="Ir para página do console">clicando aqui!</a>
</p>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Scilab Help, torne-se amigo dele!]]></title>
    <link href="http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/20/scilab-help/"/>
    <updated>2012-02-20T22:27:00+00:00</updated>
    <id>http://LeandroSNunes.github.com/leandrosnunes/blog/2012/02/20/scilab-help</id>
    <content type="html"><![CDATA[<p>
O <a href="http://www.scilab.org/" title="Site oficial do Scilab para download da ferramenta e tutoriais">Scilab</a> possui um componente de help (ajuda) que pode ser utilizado como um contato inicial e sempre que houver dúvidas de sintaxe 
de comandos, nomes de funções, etc… Quem está começando a manipular o Scilab, é válido dar uma navegada no help para conhecer seu conteúdo e 
ter uma ideia de onde procurar o que necessitar.
</p>




<!-- more -->




<h2>Meios de acesso ao help</h2>


<p>
Podemos acessar o help de 4 formas:<br /><br />

<b>1)</b> Pelo menu principal:
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-help/menu-help.jpg" width="789" title="'Acessando o help do Scilab pelo menu principal'" ></p>

<p>
2) Pela tecla F1
</p>


<p>
3) Pelo ícone na barra de ferramentas:
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-help/barra-ferramentas.jpg" width="789" title="'Acessando o help do Scilab pelo ícone localizado na barra de ferramenta'" ></p>

<p>
4) Pelo comando help executado no prompt
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">help</span>
</span></code></pre></td></tr></table></div></figure>




<p>
O comando help aceita um termo para pesquisar como parâmetro
</p>




<figure class='code'><figcaption><span>bash  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">help </span>plot2d
</span></code></pre></td></tr></table></div></figure>




<h2>CONHECENDO A INTERFACE</h2>


<p>
Ao abrir a janela de help podemos na coluna da esquerda navegar pela relação de todos os grupos dos elementos, começando com o 
manual da ferramenta e a classificação por assunto dos itens. A cada grupo, o sistema mostra a relação de itens que o compôem.
</p>


<p>
Também temos uma aba para buscas.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-help/help.png" width="789" title="&#34;Janela do help do Scilab para consulta&#34;" alt="&#34;Janela do help do Scilab para consulta&#34;"></p>

<p>
Do lado direito temos a descrição do item selecionado a esquerda.<br />
Reparem na parte dos exemplos, existe dos botões muito úteis.
</p>


<p><img src="http://LeandroSNunes.github.com/leandrosnunes/images/scilab-help/botoes-exemplos.jpg" width="789" title="&#34;Visualizando os exemplos e executando com o botôes de atalho&#34;" alt="&#34;Visualizando os exemplos e executando com o botôes de atalho&#34;"></p>

<p>
O da esquerda executa o código do exemplo direto no console.<br />
O da direitra abre o código no editor (SciNotes)
</p>




<h2>Concluíndo</h2>


<p>
Este post foi uma passada rápida por um dos componentes mais utilizado. ;P
</p>



]]></content>
  </entry>
  
</feed>
