<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;Dk4BQHo5fCp7ImA9WhBVGEk.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386</id><updated>2013-04-24T16:09:11.424-07:00</updated><category term="Off-Topic" /><category term="Jboss Seam" /><category term="Opinião" /><category term="JSF" /><category term="Java" /><category term="Ruby e Rails" /><category term="Acessibilidade" /><category term="Noticias" /><title>Casa Open</title><subtitle type="html">O Casa Open é um blog sobre tecnologia, tendo seu maior foco na linguagem de programação Ruby e no framework Ruby on Rails</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.casaopen.com.br/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/casaopen" /><feedburner:info uri="casaopen" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A04DSXc-cCp7ImA9WhBTF0g.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-7256300284799642700</id><published>2013-02-07T15:49:00.000-08:00</published><updated>2013-02-13T04:52:58.958-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-13T04:52:58.958-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><category scheme="http://www.blogger.com/atom/ns#" term="Jboss Seam" /><title>O que ganho usando Jboss Seam?</title><content type="html">&lt;i&gt;&lt;b&gt;Texto direcionado a usuários do JSF 1.2 tratando do uso do Jboss Seam 2.x.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para quem não conhece, o Seam é um&amp;nbsp;framework destinado ao desenvolvimento WEB criado pelo mesmo criador do Hibernate, Gavin King, e que tem como um de seus principais objetivos facilitar a integração entre&amp;nbsp;JSF e EJB3.&lt;br /&gt;
&lt;br /&gt;
Muitos são os ganhos obtidos pelo uso do Seam, dentre estes irei me ater aos seguintes:&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Menos XMLs&lt;/li&gt;
&lt;li&gt;Requisições por GET&lt;/li&gt;
&lt;li&gt;Facilidade na utilização de ComboBox&lt;/li&gt;
&lt;li&gt;Injeção de Dependências via anotações&lt;/li&gt;
&lt;li&gt;Facilidade no envio de e-mails&lt;/li&gt;
&lt;li&gt;Agendamento de tarefas&lt;/li&gt;
&lt;li&gt;URL user friendly&lt;/li&gt;
&lt;li&gt;Suporte a transações&lt;/li&gt;
&lt;li&gt;Integração com Groovy, Hibernate, Spring, entre outros&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para não estender muito, neste post irei falar dos três primeiros. Falarei dos demais em posts futuros.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;1. Menos XMLs&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
O Seam diminui a utilização de XML em vários aspectos, como por exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1.1. Navegação&lt;/b&gt;&lt;br /&gt;
Usando apenas o JSF 1.2, a navegação entre páginas deve ser definida via XML, no arquivo&amp;nbsp;faces-config.xml, e usada por meio de um método no Managed Bean que retorne um String de saída configurada no faces-config.xml. Conforme o exemplo abaixo:&lt;br /&gt;
&lt;br /&gt;
faces-config.xml:&lt;br /&gt;
&lt;pre class="brush: xml; gutter: false;  toolbar: false;"&gt;&amp;lt;navegation-rule&amp;gt;
&amp;nbsp; &amp;lt;from-view-id&amp;gt;/person/people.xhtml&amp;lt;/from-view-id&amp;gt; 
&amp;nbsp; &amp;lt;navegation-case&amp;gt; 
&amp;nbsp; &amp;nbsp; &amp;lt;from-outcome&amp;gt;edit&amp;lt;/from-outcome&amp;gt; 
&amp;nbsp; &amp;nbsp; &amp;lt;to-view-id&amp;gt;/person/edit.xhtml&amp;lt;/to-view-id&amp;gt; 
&amp;nbsp; &amp;lt;/navegation-case&amp;gt; 
&amp;lt;/navegation-rule&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
Managed Bean:&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;public String editPeople() {
&amp;nbsp; return "edit";
}
&lt;/pre&gt;
&lt;br /&gt;
Com o Seam, isso pode ser feito de forma mais simples, apenas retornando o nome da página no&amp;nbsp;método do Managed Bean.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;public String editPeople() {
&amp;nbsp;&amp;nbsp; return "/person/edit.xhtml";
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;1.2 Registro de Managed Beans&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para que cada Managed Bean seja utilizado nas views do JSF é necessário que este esteja registrado no faces-config.xml, como mostrado abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: xml; gutter: false;  toolbar: false;  highlight: [6, 7,8,9,10]"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
  &amp;lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="htt      p://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&amp;gt;

  &amp;lt;managed-bean&amp;gt;
    &amp;lt;managed-bean-name&amp;gt;people&amp;lt;/managed-bean-name&amp;gt;
    &amp;lt;managed-bean-class&amp;gt;br.com.People&amp;lt;/managed-bean-class&amp;gt;
    &amp;lt;managed-bean-scope&amp;gt;request&amp;lt;/managed-bean-scope&amp;gt;
  &amp;lt;/managed-bean&amp;gt;

&amp;lt;/faces-config&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
Com o Seam, basta que o bean seja declarado como um componente do Seam, por meio da anotação @Name. Deste modo, o bean passar a ser gerenciado pelo Seam. Ou seja, além de ser um Managed Bean, também é um Seam Component.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;@Name("people")
public class&amp;nbsp;People {
&amp;nbsp; //...
}&lt;/pre&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;2.&amp;nbsp;Requisições por GET&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; O JSF 1.2 não lida bem com parâmetros GET. Não que seja impossível "capturar" tais parâmetros, mas é trabalhoso e não natural. Veja o seguinte exemplo que apresenta uma forma recuperar o parâmetro "id" passado por GET no bean:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")); &amp;nbsp; 
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
O Seam facilita muito esse trabalho fazendo "bind" dos parâmetros GET por meio da anotação&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;@RequestParameter:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;@RequestParameter
private Long id = null;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Facilidade na utilização de ComboBox&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;   Imagine a seguinte situação: você pretende apresentar ao usuário um ComboBox com as regiões do Brasil onde cada região possui um id e um nome. Para você, é importante saber o id da região escolhida pelo usuário. Para o usuário, é importante escolher a região pelo nome, não pelo id.&lt;br /&gt;
Para resolver isso no JSF é necessário criar um mapa que contenha os nomes e os ids semelhante a esse:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;public class MostraRegioes {

&amp;nbsp; public Map&amp;lt;String, Regioes&amp;gt; getRegioes(){
&amp;nbsp; &amp;nbsp; Map&amp;lt;String, Regioes&amp;gt; regioes = new HashMap&amp;lt;String, Regioes&amp;gt;();
&amp;nbsp; &amp;nbsp; for(Regioes r : Regioes.values()) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; regioes.put(r.getNome(), 1);
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; return regioes;
&amp;nbsp; }

}

&lt;/pre&gt;
&lt;br /&gt;
E usá-lo da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: xml; gutter: false;  toolbar: false;"&gt;&amp;lt;h:selectOneMenu&amp;gt;
&amp;nbsp; &amp;lt;f:selectItems value="#{MostraRegioes.regioes}"/&amp;gt;
&amp;lt;/h:selectOneMenu&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
O que não é produtivo quando temos um sistema com muitos combos. Pois teríamos que fazer um método &amp;nbsp;(convertendo de lista ou Array para um mapa ou List&amp;lt;SelectItems&amp;gt;) &amp;nbsp;para cada combo. Felizmente o Seam ajuda nisso com o componente &amp;lt;s:selectItems /&amp;gt; que faz binding com uma lista/array comum. Veja:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: xml; gutter: false;  toolbar: false;"&gt;&amp;lt;h:selectOneMenu&amp;gt;
&amp;nbsp; &amp;lt;s:selectItems value="#{MostraRegioes.regioes}"
&amp;nbsp; &amp;nbsp; var="regiao" label=#{regiao.nome}"/&amp;gt;
&amp;lt;/h:selectOneMenu&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style="display: none;"&gt;
&lt;a href="http://www.guj.com.br/java/220439-qual-a-diferenca-do-jsf12-para-jsf20"&gt;http://www.guj.com.br/java/220439-qual-a-diferenca-do-jsf12-para-jsf20&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.guj.com.br/java/266058-com-o-jee-6-o-que-justifica-o-uso-do-jboss-seam"&gt;http://www.guj.com.br/java/266058-com-o-jee-6-o-que-justifica-o-uso-do-jboss-seam&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.guj.com.br/java/250717-jsf---parametros-via-get-resolvido"&gt;http://www.guj.com.br/java/250717-jsf---parametros-via-get-resolvido&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/7256300284799642700/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2013/02/vatangens-seam.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7256300284799642700?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7256300284799642700?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/ZZFRB6wDFaA/vatangens-seam.html" title="O que ganho usando Jboss Seam?" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2013/02/vatangens-seam.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4ESXYycCp7ImA9WhNbGEQ.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-7347142932334778696</id><published>2013-01-22T14:44:00.000-08:00</published><updated>2013-01-22T14:48:28.898-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-22T14:48:28.898-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><title>Criando validadores personalizados no JSF</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="validador-jsf" border="0" height="240" src="http://4.bp.blogspot.com/-e3nJzJV_Vlw/UP8WkdRsXUI/AAAAAAAAB5U/RVHNRmkLC_U/s320/validador-jsf.jpg" width="320" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Cortando as introduções e indo direto ao assunto, no JSF você pode trabalhar com &amp;nbsp;dois grupos de validadores de dados: os existentes (que são fornecidos pelo JSF) e os personalizados (que são os criados por você). Os existentes validam algumas características de dados, tais como: tamanho de campos, limites, entre outras. Mas, como é de se esperar, várias características não são abrangidas. Em vista disso, a possibilidade de criar validadores personalizados é uma boa saída fornecida pelo JSF.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Criando um validador&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Criar um validador em JSF é simples. Para tal, basta sobrescrever o método validade(), por meio de uma classe que estenda a interface javax.faces.validator.Validator, e registrá-lo no contexto do JSF. Vejamos um exemplo de validação de e-mail.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Criando o validador&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;public void validateEmail(FacesContext context, UIComponent toValidate, Object value) {
  String email = (String) value;
  if (email.indexOf('@') == -1) {
   ((UIInput) toValidate).setValid(false);
   FacesMessage message = new FacesMessage("Invalid Email");
   context.addMessage(toValidate.getClientId(context), message);
  }
 }

&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;2. Registrando o validador&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Para registrar o validador, basta indicá-lo no Faces-config, conforme o exemplo abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;&lt;validator&gt;
 &amp;lt;h:inputText id="email" value="#Bean.user.email}"
  validator="#{validateEmail}" required="true"/&amp;gt;
&lt;validator-class&gt;
 &lt;/validator-class&gt;
&lt;/validator&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;3. Usando o validador&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Tendo criado e registrado o validador, basta usa-lo por meio do marcador &amp;lt;f:validator .../&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;&lt;h:inputtext id="email" required="true" validator="#{validateEmail}" value="#Bean.user.email}"&gt;
&lt;/h:inputtext&gt;
&lt;/pre&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/7347142932334778696/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2013/01/criando-validadores-personalizados-jsf.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7347142932334778696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7347142932334778696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/9Pti_X5Sd1k/criando-validadores-personalizados-jsf.html" title="Criando validadores personalizados no JSF" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-e3nJzJV_Vlw/UP8WkdRsXUI/AAAAAAAAB5U/RVHNRmkLC_U/s72-c/validador-jsf.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2013/01/criando-validadores-personalizados-jsf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8GQHg4fyp7ImA9WhNVF08.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-3567511788189614279</id><published>2012-12-28T04:36:00.002-08:00</published><updated>2012-12-28T12:33:41.637-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-28T12:33:41.637-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><title>Ciclo de vida JSF</title><content type="html">Um dos fundamentos de maior relevância do JSF é seu ciclo de vida que se dá entre requisição e &amp;nbsp;resposta do servidor de aplicação. São vários os motivos da existência deste ciclo, dentre estes, temos:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Manter o&amp;nbsp;&lt;b&gt;controle de estado &lt;/b&gt;dos componentes de interface&lt;b&gt;;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Alinhar &lt;b&gt;ouvintes de eventos&lt;/b&gt; com seus respectivos eventos;&lt;/li&gt;
&lt;li&gt;Controle de &lt;b&gt;navegação&lt;/b&gt; entre páginas, que deve ser realizado pelo servidor;&lt;/li&gt;
&lt;li&gt;Permitir que &lt;b&gt;validações e conversões&lt;/b&gt; sejam realizadas no lado do servidor.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Indo direto ao assunto, o ciclo de vida do JSF se divide em 6 fases (veja a figura abaixo), que são:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#fase1"&gt;&lt;b&gt;Fase 1&lt;/b&gt;: Restore View (Restauração da Visão)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fase2"&gt;&lt;b&gt;Fase 2&lt;/b&gt;: Apply Request Values (Aplicar Valores da Requisição)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fase3"&gt;&lt;b&gt;Fase 3&lt;/b&gt;: Process Validation (Processar as Validações)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fase4"&gt;&lt;b&gt;Fase 4&lt;/b&gt;: Update Model Values (Atualizar Valores de Modelo)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fase5"&gt;&lt;b&gt;Fase 5&lt;/b&gt;: Invoke Application (Invocar Aplicação)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fase6"&gt;&lt;b&gt;Fase 6&lt;/b&gt;: Render Response (Renderizar a Resposta)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-KOYEcmcNOlI/UNxaiXr4rxI/AAAAAAAAB4k/jtusf_8Ufs4/s1600/fases+JSF.gif" alt="Ciclo devida JSF"/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td alt="Ciclo de vida do JSF" class="tr-caption" style="text-align: center;"&gt;Ciclo de vida do JSF&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Vejamos agora o que acontece em cada uma.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div id="fase1"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Fase 1: Restore View (Restauração da Visão)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A partir de uma requisição proveniente do servlet FacesServlet, é identificado qual visão está sendo requisitada por meio do ID desta que é determinado pelo nome da página JSP. Tendo identificado a página, esta é salva no FacesContext (caso ainda não tenha sido salva) e sua respectiva árvore de componentes é construída.&lt;/div&gt;&lt;br /&gt;
&lt;div id="fase2"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Fase 2: Apply Request Values (Aplicar Valores da Requisição)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Nesta fase, cada componente da visão, criado ou recuperado, passa a ter o seu valor. Nesse contexto, existem algumas diferenças ocasionadas pelo valor do atributo "immediate" em cada componente:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;immediate = false&lt;/b&gt;: Neste caso, que é o padrão, os valores são apenas convertidos para o tipo apropriado. Se o valor é um Integer, é convertido para Integer.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;immediate = true&lt;/b&gt;: Os valores são convertidos e validos.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div id="fase3"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Fase 3: Process Validation (Processar as Validações)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Esta é a primeira manipulação de eventos do ciclo, aqui serão executadas as validações definidas pelo servidor em cada componente. Não existindo valores inválidos, o ciclo segue para a Fase 4. Existindo, uma mensagem de erro será gerada (adicionada ao contexto do Faces, FacesContext) e o componente é marcado como inválido. Neste caso, o ciclo segue para a Fase 6 (Renderizar a resposta).&lt;/div&gt;&lt;br /&gt;
&lt;div id="fase4"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Fase 4: Update Model Values (Atualizar Valores de Modelo)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Os valores enviados pela requisição e validados pela fase 3, são atualizados em seus respectivos atributos contidos nos backings beans, onde somente as propriedades enviadas são atualizadas. É importante dizer que, mesmo após a fase de validação, fase 3, os valores enviados podem estar inválidos a nível de negócio ou a nível de conversão de tipos, o que pode ser verificado pelo próprio bean.&lt;/div&gt;&lt;br /&gt;
&lt;div id="fase5"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Fase 5: Invoke Application (Invocar Aplicação)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Nesta fase, os valores dos componentes da requisição, estão validados convertidos e disponíveis nos backings beans. Assim a aplicação tem os insumos necessários para aplicar a lógica de negócio.&lt;br /&gt;
Outro fator importante dessa fase, é o direcionamento do usuário de acordo com as submissões realizadas pelo mesmo. Por exemplo, se ouve sucesso no processamento dos dados enviados, o usuário é redirecionado para uma determinada página, se não, permanece na mesma página.&lt;/div&gt;&lt;br /&gt;
&lt;div id="fase6"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Fase 6: Render Response (Renderizar a Resposta)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O processo o Renderizar a Resposta consiste na apresentação da página referente ao resultado da aplicação ao usuário. Neste contexto existem três possibilidades:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Caso seja&amp;nbsp;a&amp;nbsp;primeira requisição da página: Os componentes associados são criados e associados a visão;&lt;/li&gt;
&lt;li&gt;Caso seja a primeira submissão: Os componentes são traduzidos para o HTML;&lt;/li&gt;
&lt;li&gt;Caso tenha ocorrido algum erro:&amp;nbsp;Existindo os marcadores &amp;lt;f:message /&amp;gt; ou &amp;lt;f:messages /&amp;gt;&amp;nbsp;na página, os erros são exibidos ao usuário.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Visão Geral&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;No desenvolvimento em JSF existem dois perfis diferentes de desenvolvedores: os que desenvolveram aplicações JSF e os que desenvolveram componentes. No primeiro perfil, as fases de maior foco são a 2, 3, 4 e 5. Já no segundo, são a 1 e 6, que estão mais relacionadas a&amp;nbsp;árvore de componentes no lado do servidor e de componentes da visão. Sendo assim podemos agrupar as fases da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fases focadas no desenvolvimento&amp;nbsp;de aplicações JSF&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fase 2&lt;/b&gt;: Apply Request Values (Aplicar Valores da Requisição)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fase 3&lt;/b&gt;: Process Validation (Processar as Validações)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fase 4&lt;/b&gt;: Update Model Values (Atualizar Valores de Modelo)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fase 5&lt;/b&gt;: Invoke Application (Invocar Aplicação)&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fases focadas no desenvolvimento&amp;nbsp;de componentes de visão&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fase 1&lt;/b&gt;: Restore View (Restauração da Visão)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fase 6&lt;/b&gt;: Render Response (Renderizar a Resposta)&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/3567511788189614279/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2012/12/ciclo-de-vida-jsf.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3567511788189614279?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3567511788189614279?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/ICbZioB_oaE/ciclo-de-vida-jsf.html" title="Ciclo de vida JSF" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-KOYEcmcNOlI/UNxaiXr4rxI/AAAAAAAAB4k/jtusf_8Ufs4/s72-c/fases+JSF.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2012/12/ciclo-de-vida-jsf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8CSXo-fip7ImA9WhNVF08.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-5817759423970764225</id><published>2012-12-17T13:12:00.001-08:00</published><updated>2012-12-28T12:34:28.456-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-28T12:34:28.456-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><title>O padrão MVC segundo o JSF</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;O que MVC?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O padrão MVC, de modo geral, divide uma aplicação em três camadas: modelo, visão e controle. A visão é responsável por apresentar a interface ao usuário. O modelo, pela representação dos objetos do negócio e fornecimento de acesso aos dados do negócio. E o controle define o comportamento da aplicação interpretando as ações de modo a realizar as devidas chamadas ao modelo. De modo simplificado, é dito que o controle fornece uma ligação entre visualização e modelo.&lt;br /&gt;
&lt;br /&gt;
Esse padrão contribui para uma melhor separação de tarefas em uma equipe de desenvolvedores. Pois, tendo a aplicação separada por camadas, é mais fácil direcionar pessoas com habilidades diferentes para se concentrarem em partes diferentes do código.&lt;br /&gt;
&lt;br /&gt;
Veja o diagrama abaixo&amp;nbsp;que demostra a relação entre modelo, visão e controle onde as linhas sólidas indicam associação direta e as tracejadas indicam associação indireta.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/ModelViewControllerDiagram2.svg/220px-ModelViewControllerDiagram2.svg.png" alt="Diagrama do modelo MVC"/&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;O que é JSF?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O JavaServer Faces (JSF), é uma especificação do framework MVC Java&amp;nbsp;padrão&amp;nbsp;que tem como principal objetivo simplificar a construção de componentes de interface gráfica para aplicações web.&lt;br /&gt;
&lt;br /&gt;
Desenvolvido pela&amp;nbsp;&amp;nbsp;Java Community Process (JCP), tem como uma de suas características mais relevantes a presença do modelo de componentes, semelhante ao que acontece no desenvolvimento Desktop. Essa orientação tende a facilitar o reuso pois, além dos vários componentes já existentes, é possível criar novos componentes.&lt;br /&gt;
&lt;br /&gt;
Outras características marcantes são a existência de validadores e conversores de dados (facilitando a manipulação de tais), navegabilidade entre páginas oferecida por arquivos de configuração, suporte a internacionalização, entre outras.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;MVC no JSF&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
No&amp;nbsp;JavaServer Faces, o controle fica por conta de um servlet chamado Faces Servlet, por arquivos de configuração (ex.: faces-config.xml), pelos Backing Beans e pelos validadores e conversores. O Faces&amp;nbsp;Servlet&amp;nbsp;se designa a receber requisições, encaminhá-las ao modelo e enviar as respectivas repostas. Os arquivos de configuração são responsáveis por definirem a navegação entre páginas e o mapeamento de ações. Já os validadores e conversores permitem um maior controle sobre os dados que serão enviados. Importante ressaltar que, mesmo sendo referenciados nas páginas, os conversores e validadores fazem parte do processamento de eventos, logo também fazem parte do controlador e não da visão.&lt;br /&gt;
&lt;br /&gt;
O modelo é constituído por classes de entidade e de negócio, que por sua vez, recebem dados da camada de visualização e executam regras pertinentes ao negócio.&lt;br /&gt;
&lt;br /&gt;
Já a visualização, remete ao que o usuário vê, ou seja: a interface - páginas JSP e kits renderizadores (HTML, WML, XML, etc.). Mas, como o JSF se utiliza de componentes, pode se dizer que esta é composta por uma hierarquia de componentes organizados.&lt;br /&gt;
&lt;br /&gt;
De modo simplificado, o MVC em aplicações web é distribuído da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Visão&lt;/b&gt;:&lt;br /&gt;
• Componentes UI em páginas JSP/XHTML&lt;br /&gt;
• Kits renderizadores (HTML, WML, XML, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Controlador&lt;/b&gt;:&lt;br /&gt;
• Faces Servlet (Front Controller)&lt;br /&gt;
• Backing Bean (Page Controller ou Modelo)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Modelo&lt;/b&gt;:&lt;br /&gt;
•&amp;nbsp;entidades e regras de negócio&lt;br /&gt;
• Objetos gerais da aplicação (dados, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;!--

Deseja aprofundar no assunto? Recomendo os seguintes links:

&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.guj.com.br/java/72237-jsf-x-mvc"&gt;http://www.guj.com.br/java/72237-jsf-x-mvc&lt;/a&gt;&amp;nbsp;( importante)&lt;br /&gt;
&lt;a href="http://blog.pucp.edu.pe/item/4825/model-view-controler-jsf"&gt;http://blog.pucp.edu.pe/item/4825/model-view-controler-jsf&lt;/a&gt;&lt;br /&gt;
imagem&amp;nbsp;&lt;a href="http://download.ultradownloads.com.br/wallpaper/169119_Papel-de-Parede-Quebra-cabeca_1600x1200.jpg"&gt;http://download.ultradownloads.com.br/wallpaper/169119_Papel-de-Parede-Quebra-cabeca_1600x1200.jpg&lt;/a&gt;&lt;/div&gt;--&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/5817759423970764225/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2012/12/jsf-mvc.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/5817759423970764225?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/5817759423970764225?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/uT8Q_OngVgI/jsf-mvc.html" title="O padrão MVC segundo o JSF" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.casaopen.com.br/2012/12/jsf-mvc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AEQH88fCp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-3206785087774065116</id><published>2012-11-07T15:44:00.001-08:00</published><updated>2012-12-18T16:08:21.174-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:08:21.174-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Removendo acentos de String no Java</title><content type="html">Você programa a mais de um mês? Se sim, é provável que já precisou retirar acentos de um String. Para isso, existe a forma feia, chata e antipática de fazer (que por sinal é a que mais vejo) e a forma bonita e elegante (que raramente vejo).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&amp;nbsp;Forma feia, chata e antipática&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;public String removeAcentos (String string){  
      string = string.replaceAll("[ÂÀÁÄÃ]","A");  
      string = string.replaceAll("[âãàáä]","a");  
      string = string.replaceAll("[ÊÈÉË]","E");  
      string = string.replaceAll("[êèéë]","e");  
      string = string.replaceAll("ÎÍÌÏ","I");  
      string = string.replaceAll("îíìï","i");  
      string = string.replaceAll("[ÔÕÒÓÖ]","O");  
      string = string.replaceAll("[ôõòóö]","o");  
      string = string.replaceAll("[ÛÙÚÜ]","U");  
      string = string.replaceAll("[ûúùü]","u");  
      string = string.replaceAll("Ç","C");  
      string = string.replaceAll("ç","c");   
      string = string.replaceAll("[ýÿ]","y");  
      string = string.replaceAll("Ý","Y");  
      string = string.replaceAll("ñ","n");  
      string = string.replaceAll("Ñ","N");  
      return string;  
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&amp;nbsp;Forma bonita e elegante&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush: java; gutter: false;  toolbar: false;"&gt;public static String removeAcentos(String string) {
    if (string != null){
        string = Normalizer.normalize(str, Normalizer.Form.NFD);
        string = str.replaceAll("[^\\p{ASCII}]", "");
    }
    return string;
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
PS. Na verdade existem várias formas de fazer isso.</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/3206785087774065116/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2012/11/removendo-acentos-java.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3206785087774065116?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3206785087774065116?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/TMhwOmlUVt0/removendo-acentos-java.html" title="Removendo acentos de String no Java" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.casaopen.com.br/2012/11/removendo-acentos-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcCSHc-fCp7ImA9WhJREEg.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-4078223775378397890</id><published>2012-04-13T11:03:00.000-07:00</published><updated>2012-07-11T17:14:29.954-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-11T17:14:29.954-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Acessibilidade" /><title>Por que devo estudar Acessibilidade Digital?</title><content type="html">&lt;div style="text-align: justify;"&gt;
Ao se falar em acessibilidade logo 
vem a mente a palavra acesso. E realmente acesso tem tudo a ver com 
acessibilidade. Mas, o que se pode entender por acessibilidade? Quais 
são suas primícias? Seus benefícios? Por que profissionais de TI devem estudá-la? É 
exatamente em respostas a essas perguntas que esse texto é direcionado.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-EpT62h3CHJw/T4JMMTGvYpI/AAAAAAAAA88/jDxwq3pY4VQ/s1600/charles_chaplin.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Imagem do Chaplin caido com a bengala na mão e de patins" border="0" src="http://2.bp.blogspot.com/-EpT62h3CHJw/T4JMMTGvYpI/AAAAAAAAA88/jDxwq3pY4VQ/s1600/charles_chaplin.jpg" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;Imagem do Chaplin &lt;/span&gt;&lt;span style="font-size: x-small;"&gt;caído &lt;/span&gt;&lt;span style="font-size: x-small;"&gt;com a bengala na mão e de patins&lt;/span&gt; &lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;O que é Acessibilidade Digital?&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Primeiramente é importante dizer que Acessibilidade está relacionada em fornecer condição para utilização, com segurança e autonomia, total ou assistida, dos espaços, mobiliários e equipamentos urbanos, das edificações, dos serviços de transporte, dos dispositivos, sistemas e meios de comunicação e informação, por qualquer pessoa. De forma análoga, Acessibilidade Digital remete a Acessibilidade no ambiente virtual sendo que Acessibilidade na Web significa que qualquer pessoa, utilizando qualquer tipo de tecnologia de navegação - navegadores gráficos, textuais, especiais para sistemas de computação móvel, etc. - deve ser capaz de visitar e interagir com qualquer site, compreendendo inteiramente as informações nele apresentadas. (DIAS, Cláudia. Usabilidade na Web - criando portais mais acessíveis. RJ: Alta Books, 2003). Em sua concepção inicial, acessibilidade estava ligada a indivíduos portadores de deficiência, entretanto sua amplitude tem se estendido a qualquer barreira que possa&amp;nbsp;inviabilizar&amp;nbsp;o acesso a qualquer pessoa. Diante disso, vejamos agora alguns dos motivos que impelem o estudo da acessibilidade por parte dos&amp;nbsp;profissionais de TI.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;Grande número de pessoas com deficiência&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Segundo o IBGE (Instituto Brasileiro de Geografia e Estatística) por meio do censo realizado no ano 2000 a população brasileira possui 14,5% de portadores de deficiência. Destes, 48,1% (que constituem 16,6 milhões) são deficientes visuais e 150 mil se declaram cegos, 27,1% com deficiência física, 16,6% com deficiência mental e 8,2% com deficiência auditiva.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;Maior visibilidade no Google&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
É de conhecimento que diversos buscadores, dentre eles o Google, levam em consideração a organização do conteúdo das páginas web. Por exemplo, se uma página apresenta imagens sem texto alternativos (tag alt), conteúdo não estruturado de acordo com o grau de importância (tags title, h1,h2,h3..), frames sem página alternativa (através do elemento "noframe") e etc, essa página tende a ser classificada com menor relevância em comparação a outra que segue os padrões de acessibilidade. Ou seja, uma boa acessibilidade também contribui para uma boa visibilidade em sistemas de busca.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;Valorização da cauda longa&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Não é intuito deste texto o aprofundamento no estudo da Cauda Longa mas, de forma simplificada, podemos dizer que Cauda Longa remete a força das minorias. Considerando que um pequeno grupo insolado tende a não ser muito relevante, em relação ao todo. Entretanto um conjunto de pequenos grupos possui uma relevância significativa. Esse conceito ganhou força com a expansão da internet e é baseado nisto que muitas lojas virtuais estão se sobressaindo (a Amazon.com é uma prova disso), pois também disponibilizam produtos dedicados as minorias. Mas o que quero dizer com isto? Quero dizer que se você atender somente a população de deficientes auditivos talvez seu retorno não seja expressivo, mas atendendo a população de deficientes auditivos, visuais, físicos... a probabilidade de retorno expressivo pode crescer consideravelmente.&lt;span style="font-size: large;"&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-JG85JoYJIA0/T4Tp7v7j9QI/AAAAAAAAA9I/jAoNTAah8H4/s1600/cauda_longa.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Gráfico da calda longa" border="0" src="http://2.bp.blogspot.com/-JG85JoYJIA0/T4Tp7v7j9QI/AAAAAAAAA9I/jAoNTAah8H4/s1600/cauda_longa.jpg" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-size: xx-small;"&gt;Imagem retirada do artigo "O que é Web 2.0?" acessado em&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-size: xx-small;"&gt;http://www.divulgardinheiro.com/divulgar-gratis-internet/internet-marketing/o-que-e-web-2-0/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;Conformidade com o decreto de lei 5296&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
O Decreto-lei 2596 de 2 de dezembro de 2004, também conhecido como Lei de Acessibilidade, tem por finalidade regulamentar o atendimento a indivíduos com deficiência em diversos aspectos, dentre estes o de comunicação e informação. Sendo que portais e sites da administração pública são obrigados a se tornarem acessíveis para o uso das pessoas portadoras de deficiência visual. Logo, se você trabalha em projetos web para o governo, estes projetos devem ser acessíveis.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;Proteção contra processos&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
O primeiro caso oficial de processo motivado por acessibilidade digital foi direcionado ao&amp;nbsp;&lt;span style="font-size: large;"&gt;&lt;/span&gt;&lt;span style="background-color: #fafaea; font-family: 'Trebuchet MS', Trebuchet, Arial, Verdana, sans-serif; font-size: 14px; line-height: 21px; text-align: left; text-indent: 42px;"&gt;Comitê de Organização dos Jogos Olímpicos de Sydney. Na ocasião&amp;nbsp;&lt;/span&gt;&lt;span lang="en" style="background-color: #fafaea; font-family: 'Trebuchet MS', Trebuchet, Arial, Verdana, sans-serif; font-size: 14px; line-height: 21px; text-align: left; text-indent: 42px;" xml:lang="en"&gt;Bruce Lindsay Maguire processou o comitê pela falta de acessibilidade em seu site. Fato é que atualmente v&lt;/span&gt;ários países possuem leis específicas que tratam a questão da acessibilidade: na Inglaterra existe a DDA, nos EUS a ADA e a Seção 508, e na Austrália a DDA. Assim sendo, seguir os padrões de acessibilidade reduz significavelmente o risco de eventuais processos.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span style="font-size: large;"&gt;Conclusão&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
A acessibilidade digital tem ganhado força nos últimos anos e tudo leva a  crer que este é um caminho sem volta. P&lt;span style="font-family: 'Times New Roman';"&gt;articularmente&lt;/span&gt;&amp;nbsp;acredito que, de forma semelhante ao crescimento das políticas de sustentabilidade, salvo as devidas proporções, acessibilidade&amp;nbsp;chegará a um patamar de&amp;nbsp;relevância&amp;nbsp;significante. De modo que é&amp;nbsp;impraticável&amp;nbsp;ignorar as&amp;nbsp;consequências&amp;nbsp;e implicações que tão assunto sugere.&lt;/div&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/4078223775378397890/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2012/04/porque-estudar-acessibilidade-digital.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/4078223775378397890?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/4078223775378397890?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/XYtUEGYdWtA/porque-estudar-acessibilidade-digital.html" title="Por que devo estudar Acessibilidade Digital?" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-EpT62h3CHJw/T4JMMTGvYpI/AAAAAAAAA88/jDxwq3pY4VQ/s72-c/charles_chaplin.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2012/04/porque-estudar-acessibilidade-digital.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMFSH89eyp7ImA9WhVbFEU.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-223724582856480952</id><published>2011-02-11T04:13:00.000-08:00</published><updated>2012-05-31T09:56:59.163-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-31T09:56:59.163-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Noticias" /><title>Você "vai" ao Ruby Masters Conf?</title><content type="html">&lt;div style="text-align: center;"&gt;
&lt;a href="http://rubymastersconf.com/" target="_blank"&gt;&lt;img height="175" src="http://rubymastersconf.com/images/banner-02.png" title="Ruby Masters Conf - Edição 2011" alt="Ruby Masters Conf - Edição 2011" width="270" /&gt;&lt;/a&gt; &lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
A Ruby Masters Conf foi uma das iniciativas mais legais que vi&amp;nbsp;recentemente&amp;nbsp;na comunidade Ruby. Ela se trata de um conjunto de palestras &amp;nbsp;que serão transmitidas on-line nos dias 25 e 26 de fevereiro de 2011 onde toda a renda será revertida para dois projetos: o &lt;a href="http://rubyinstaller.org/"&gt;RubyInstaller&lt;/a&gt; - &amp;nbsp;que é uma ferramenta usada para instalar o ambiente necessário para o Ruby no Windows - e o&amp;nbsp;&lt;a href="http://modrails.com/"&gt;Passenger&lt;/a&gt;&amp;nbsp;- que mudou a forma da comunidade&amp;nbsp;administrar um cluster de Mongrels ou gerenciar processos FastCGI.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Para participar, basta fazer sua inscrição no&amp;nbsp;&lt;a href="http://rubymastersconf.com/"&gt;RubyMastersConf.com&lt;/a&gt;&amp;nbsp;por um valor&amp;nbsp;simbólico&amp;nbsp;acima de R$35,00. Após a inscrição, é só esperar por ótimas palestras de pessoas muito conceituadas no mundo Ruby, como por exemplo:&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://akitaonrails.com/"&gt;Fábio Akita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://davidchelimsky.net/"&gt;David Chelimsky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cassiomarques.wordpress.com/"&gt;Cássio Marques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fabiokung.com/"&gt;Fábio Kung&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
E ai? Nos "encontraremos" na Ruby Masters Conf?&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="349" src="http://www.youtube.com/embed/2RQKUEFLtcM" title="YouTube video player" type="text/html" width="425"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Saiba&amp;nbsp;mais visitando o site&amp;nbsp;&lt;a href="http://rubymastersconf.com/"&gt;RubyMastersConf.com&lt;/a&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/223724582856480952/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2011/02/voce-vai-ao-ruby-masters-conf.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/223724582856480952?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/223724582856480952?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/d8A3nEvylvw/voce-vai-ao-ruby-masters-conf.html" title="Você &quot;vai&quot; ao Ruby Masters Conf?" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/2RQKUEFLtcM/default.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.casaopen.com.br/2011/02/voce-vai-ao-ruby-masters-conf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIHRXY-fSp7ImA9WhVbFEU.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-7157807009793454455</id><published>2011-01-27T09:40:00.000-08:00</published><updated>2012-05-31T09:58:54.855-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-31T09:58:54.855-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Noticias" /><title>Um ano de Casa Open</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_mK4DEqf4UXw/TT20D6MT7sI/AAAAAAAAAjo/E_pOvg7BW8E/s1600/1%252Bano%252BCasaOpen.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_mK4DEqf4UXw/TT20D6MT7sI/AAAAAAAAAjo/E_pOvg7BW8E/s400/1%252Bano%252BCasaOpen.JPG" width="400" alt="Imagem mostrando o número 1" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Este é um dia muito especial para mim pois há um ano atrás o primeiro post,&amp;nbsp;intitulado&amp;nbsp;&lt;a href="http://www.casaopen.com.br/2010/01/ruby-on-rails-vs-java.html"&gt;Ruby on Rails vs Java&lt;/a&gt;, do blog, que antigamente chamava-se railsopen.blogspot.com, foi ao ar. Desde então, muita coisa mudou: alterei o layout, o domínio (veja esse &lt;a href="http://www.casaopen.com.br/2010/03/de-casa-nova.html"&gt;post&lt;/a&gt;)... mas o que permanece é o foco: &lt;b&gt;Ruby e Rails&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Sim, aprendi&amp;nbsp;muito, errei alguns vezes, conhece pessoas e cresci. Bom, mas para comemorar essa data especial separei os 10 artigos mais lidos deste primeiro ano do &lt;a href="http://www.casaopen.com.br/"&gt;Casa Open&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/03/explore-o-mundo-em-360-graus.html"&gt;Explore o mundo em 360 graus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/01/arquivos-em-ruby.html"&gt;Arquivos em Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/01/documentacao-ruby-on-rails.html"&gt;Documentação Ruby on Rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/02/graficos-em-rails-css-graphs.html"&gt;Gráficos no Rails - CSS Graphs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/02/e-mail-para-varios-destinatarios.html"&gt;E-mail para vários destinatários&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/02/traduzir-calendario.html"&gt;Traduzindo datas no Rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/03/operador-ternario-e-ruby.html"&gt;Operador ternário e Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/09/tipagem-em-ruby.html"&gt;Tipagem em Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/12/sockets-em-ruby.html"&gt;Sockets em Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.casaopen.com.br/2010/01/ruby-on-rails-vs-java.html"&gt;Ruby on Rails vs Java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Também não poderia deixar de agradecer aos leitores, aos que fazem comentários, aos assinantes do &lt;a href="http://feeds.feedburner.com/casaopen"&gt;feed&lt;/a&gt;, os seguidores do &lt;a href="http://twitter.com/samuel_vinicius"&gt;twitter&lt;/a&gt; e a todos que de alguma forma fazem o blog evoluir. Obrigado!</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/7157807009793454455/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2011/01/um-ano-de-casa-open.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7157807009793454455?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7157807009793454455?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/1pmgWzcRLZ0/um-ano-de-casa-open.html" title="Um ano de Casa Open" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_mK4DEqf4UXw/TT20D6MT7sI/AAAAAAAAAjo/E_pOvg7BW8E/s72-c/1%252Bano%252BCasaOpen.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.casaopen.com.br/2011/01/um-ano-de-casa-open.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ICSHs5eCp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-6069395451566752134</id><published>2011-01-05T02:12:00.000-08:00</published><updated>2012-12-18T16:06:09.520-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:06:09.520-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Os railers e suas músicas</title><content type="html">&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;Em quase todos os grandes eventos de Ruby e Rails estamos tendo o privilegio imensurável de desfrutarmos do talento musical dos railers. Como sou uma boa pessoa, não irei privá-lo destes momentos inusitados...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;...deixando de lado a ironia, realmente é muito bom ouvir música nos eventos e as que você verá nos próximos vídeos são ótimas!&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Regaae do Node&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;Apresentado na RubyConf Brasil 2010.&lt;br /&gt;
By &lt;a href="http://www.twitter.com/danicuki"&gt;@danicuki&lt;/a&gt;, &lt;a href="http://www.twitter.com/luizfaias"&gt;@luizfaias&lt;/a&gt;, &lt;a href="http://www.twitter.com/ucoaaa"&gt;@ucoaaa&lt;/a&gt;&amp;nbsp;e&amp;nbsp;&lt;a href="http://www.twitter.com/andrefaria"&gt;@andrefaria&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;object alt="Vídeo da música Regaae do Node" height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/VY67k6NHfTs?fs=1&amp;amp;hl=pt_BR"&gt;&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;
&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;
&lt;embed src="http://www.youtube.com/v/VY67k6NHfTs?fs=1&amp;amp;hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Melô do Teste Automatizado e Samba do Akita&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;Melô do Teste Automatizado e Samba do Akita apresentado no Rails Summit 2009 por Daniel Cukier&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;object alt="Vídeo da música Melô do Teste Automatizado e Samba do Akita" height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4T4Yw9hctfc?fs=1&amp;amp;hl=pt_BR"&gt;&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;
&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;
&lt;embed src="http://www.youtube.com/v/4T4Yw9hctfc?fs=1&amp;amp;hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h1 id="watch-headline-title" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-size: 1,8333em; font-weight: bold; height: 1,1363em; line-height: 1,1363em; margin-bottom: 5px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 1,1363em; outline-color: initial; outline-style: initial; outline-width: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;span class="" dir="ltr" id="eow-title" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 22px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Forro do Elomar"&gt;Forro do Elomar&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;
&lt;span class="" dir="ltr" id="eow-title" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Forro do Elomar"&gt;Forro do Elomar no Oxente Rails em 2010&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;object alt="Vídeo da música Forro do Elomar" height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/uhFXtA2ngeo?fs=1&amp;amp;hl=pt_BR"&gt;&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;
&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;
&lt;embed src="http://www.youtube.com/v/uhFXtA2ngeo?fs=1&amp;amp;hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/div&gt;
</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/6069395451566752134/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2011/01/os-railers-e-suas-musicas.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/6069395451566752134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/6069395451566752134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/NEbSDfp6cwA/os-railers-e-suas-musicas.html" title="Os railers e suas músicas" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2011/01/os-railers-e-suas-musicas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIBQXw9fCp7ImA9WhNRE04.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-1009697804687752358</id><published>2010-12-26T04:43:00.000-08:00</published><updated>2012-11-07T15:55:50.264-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-07T15:55:50.264-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><category scheme="http://www.blogger.com/atom/ns#" term="Noticias" /><title>Retrospectiva 2010</title><content type="html">Antes de qualquer coisa desejo,&amp;nbsp;sinceramente,&amp;nbsp;a todos os leitores um ótimo 2011. Que seja um ano excelente&amp;nbsp;profissionalmente&amp;nbsp;e pessoalmente. Me vejo também no dever de agradecê-los pelas críticas, elogios e pelos comentários - são eles que me dão forças para continuar.&lt;br /&gt;
&lt;br /&gt;
Salvo os devidos agradecimentos, vamos ao que interessa.&amp;nbsp;Este foi um ótimo ano pra mim e para o blog Casa Open. Foi o ano de estreia do Blog, e tudo que é novo, é especial. Mas para evitar o muito falar, vejam um resumo sobre os artigos mais interessantes - segundo os meus olhos - que aqui foram publicados.&lt;br /&gt;
&lt;br /&gt;
Janeiro&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/01/ruby-on-rails-vs-java.html"&gt;Ruby on Rails vs Java&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/01/arquivos-em-ruby.html"&gt;Arquivos em Ruby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Fevereiro&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/02/graficos-em-rails-css-graphs.html"&gt;Gráficos no Rails - CSS Graphs&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/02/traduzir-calendario.html"&gt;Traduzindo datas no Rails&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/02/lendo-urls-no-ruby.html"&gt;Lendo URL's no Ruby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Março&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/03/operador-ternario-e-ruby.html"&gt;Operador ternário e Ruby&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/03/working-with-rails-ultrapassa-marca-de.html"&gt;Working with Rails ultrapassa a marca de 17000 programadores&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Abril&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/04/tarefas-em-background-delayed-job.html"&gt;Tarefas em background - delayed job&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/04/precedencia-em-operadores-logicos.html"&gt;Precedência em operadores lógicos&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Maio&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/04/precedencia-em-operadores-logicos.html"&gt;Interpretador Ruby Online&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Junho&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/06/em-qual-ambiente-estamos.html"&gt;Em qual ambiente estamos?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Julho&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/07/project-euler-1.html"&gt;Project Euler #1&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/07/teste-suas-expressoes-regulares-online.html"&gt;Teste suas expressões regulares na web&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Agosto&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/08/progzoonet-comparando-as-linguagens-de.html"&gt;progzoo.net: Comparando as linguagens de programação&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Setembro&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/09/retirando-excecao-invalidauthenticityto.html"&gt;Retirando a exceção InvalidAuthenticityToken&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/09/tipagem-em-ruby.html"&gt;Tipagem em Ruby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Outubro&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/10/respostas-http.html"&gt;Respostas HTTP&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/10/rubyconf-brasil.html"&gt;RubyConf Brasil 2010&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Novembro&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/11/captura-de-codigo-ascii-no-ruby.html"&gt;Captura de código &amp;nbsp;ASCII no Ruby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dezembro&lt;br /&gt;
&lt;a href="http://www.casaopen.com.br/2010/12/sockets-em-ruby.html"&gt;Sockets em Ruby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
No mais, tenham um bom final de ano e um 2011 melhor ainda!</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/1009697804687752358/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/12/retrospectiva-2010.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/1009697804687752358?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/1009697804687752358?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/DssaCIQcQNY/retrospectiva-2010.html" title="Retrospectiva 2010" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/12/retrospectiva-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EFQ3k4fSp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-747926512786391771</id><published>2010-12-15T05:49:00.000-08:00</published><updated>2012-12-18T16:06:52.735-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:06:52.735-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Sockets em Ruby</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_mK4DEqf4UXw/TQjEZRy9ytI/AAAAAAAAAgE/ZltnHtgfAuI/s1600/Sockets%252BRuby.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Foto de uma tomada ligada na fonte de energia" border="0" height="266" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/TQjEZRy9ytI/AAAAAAAAAgE/ZltnHtgfAuI/s400/Sockets%252BRuby.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Este é primeiro de vários artigos que irei publicar sobre Sockets em Ruby. Mas antes de qualquer coisa, é conveniente dizer &lt;b&gt;o que são Sockets:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;A grosso modo, são as extremidades de um canal de comunicação bidirecional. Ou seja, você pode utilizar Sockets para fazer comunicação entre processos de uma maquina, entre maquinas diferentes e entre processos de maquinas diferentes.&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;O que iremos fazer?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Como este é o primeiro  artigo sobre o tema, pretendo ir direto ao ponto, mostrando, de forma simples, como implementar uma aplicação Cliente-Servidor. Nesta aplicação o cliente envia uma mensagem para o servidor e este responde. Sendo a comunicação entre cliente e servidor realizada via Socket através do protocolo TCP.&lt;br /&gt;
Então, sem mais delongas, vamos aos códigos:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Servidor&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;# file server.rb
require 'socket' 

server = TCPServer.open(3001)  # Abre socket em escuta na porta 3001  
loop { # o servidor nunca morre, fica sempre executando
  client = server.accept      # aceita conexão do cliente
  msg_cliente = client.recvfrom( 10000 ) # recebe mensagem - 10000 bytes - do cliente

  puts  "Mensagem do cliente: #{msg_cliente}" # imprime a mensagem do cliente no servidor
  client.puts "Ola cliente eu, o servidor, recebi sua mensagem" #envia uma mensagem ao cliente    
  client.close # fecha conexão
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Cliente&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;# file client.rb
require 'socket'

server = TCPSocket.open('localhost', 3001) # conecta ao servidor na porta 3001
server.puts "Ola servidor eu, o cliente, estou enviando uma mensagem" # envia mensagem para o servidor

resp = server.recvfrom( 10000 ) # recebe a mensagem -10000 bytes - do servidor
puts resp

server.close # Fecha a conexão com o servidor
&lt;/pre&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Como rodar a aplicação?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Primeiro salve o código do servidor em um arquivo .rb - por exemplo server.rb - e execute o arquivo - ruby server.rb. Neste ponto o servidor está esperando a conexão de um cliente. Agora salve o código do cliente de forma análoga e execute em outro terminal de modo que cliente e servidor sejam rodados ao mesmo tempo. A partir de então o cliente envia uma mensagem ao servidor e o servidor responde.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Conclusões&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Este é um exemplo simples do que pode ser feito com Sockets, espero que te ajude em algo.&lt;br /&gt;
&lt;br /&gt;
Referência&lt;br /&gt;
&lt;a href="http://www.tutorialspoint.com/ruby/ruby_socket_programming.htm"&gt;http://www.tutorialspoint.com/ruby/ruby_socket_programming.htm&lt;/a&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/747926512786391771/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/12/sockets-em-ruby.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/747926512786391771?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/747926512786391771?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/K3gQdcc75NE/sockets-em-ruby.html" title="Sockets em Ruby" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_mK4DEqf4UXw/TQjEZRy9ytI/AAAAAAAAAgE/ZltnHtgfAuI/s72-c/Sockets%252BRuby.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/12/sockets-em-ruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EAQXoyeip7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-2739632112968636183</id><published>2010-11-30T04:24:00.000-08:00</published><updated>2012-12-18T16:07:20.492-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:07:20.492-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Captura de código  ASCII no Ruby</title><content type="html">Existem vários modos para capturar os código ASCII dos caracteres em Ruby, vejamos alguns deles:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;puts ?R, ?u, ?b, ?y&lt;/pre&gt;
&lt;pre class="cod"&gt;puts "R"[0], "u"[0], "b"[0], "y"[0]&lt;/pre&gt;
&lt;pre class="cod"&gt;"Ruby".each_byte { |x| p x}&lt;/pre&gt;
&lt;br /&gt;
Mas se você&amp;nbsp;preferir fazer o caminho inverso, este método resolve:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;&amp;nbsp;puts 82.chr, 117.chr, 98.chr, 121.chr&lt;/pre&gt;
&lt;br /&gt;
Referência:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://en.wikibooks.org/wiki/Ruby_Programming/ASCII"&gt;http://en.wikibooks.org/wiki/Ruby_Programming/ASCII1&lt;/a&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/2739632112968636183/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/11/captura-de-codigo-ascii-no-ruby.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/2739632112968636183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/2739632112968636183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/tZlR2TqrCP0/captura-de-codigo-ascii-no-ruby.html" title="Captura de código  ASCII no Ruby" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/11/captura-de-codigo-ascii-no-ruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YCSHcyfyp7ImA9Wx5bFkw.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-993796589947148370</id><published>2010-10-31T18:39:00.000-07:00</published><updated>2010-11-01T04:32:49.997-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-01T04:32:49.997-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Noticias" /><title>RubyConf Brasil</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mK4DEqf4UXw/TM3MU7_RzsI/AAAAAAAAAdw/nxIfhAzXj1I/s1600/Imagem0962.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_mK4DEqf4UXw/TM3MU7_RzsI/AAAAAAAAAdw/nxIfhAzXj1I/s400/Imagem0962.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Dois dias intensos de Ruby em São Paulo onde mais de 700 pessoas tiveram o privilegio de conhecer um pouco mais deste mundo que a muitos fascinam. Por lá estive e deixo aqui alguns dos meus pensamentos sobre o evento.&lt;br /&gt;
&lt;br /&gt;
A RubyConf Brasil foi algo que realmente vai deixar saudades, um evento onde pessoas de peso marcaram presença, onde o nível dos palestrantes e palestras foram altíssimos. Estes fatos, sem dúvida, deixam a comunidade cada dia mais orgulhosa de se e dos seus feitos.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_mK4DEqf4UXw/TM4RMXvwkTI/AAAAAAAAAd0/1GoyZM1gdus/s1600/Imagem0972.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/_mK4DEqf4UXw/TM4RMXvwkTI/AAAAAAAAAd0/1GoyZM1gdus/s200/Imagem0972.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Eu e muitos mineiros fomos. Se você foi, garanto que viu alguém com a camisa do grupo &lt;a href="http://railsmg.org/" target="_blank"&gt;Rails-MG&lt;/a&gt;. Nisto agradeço ao Gabriel Sobrinho - &lt;a href="http://www.twitter.com/sobrinho" target="_blank"&gt;@sobrinho&lt;/a&gt;, que arrumou uma correria para disponibilizar as camisas à todos integrantes do grupo.&lt;br /&gt;
&lt;br /&gt;
Como disse anteriormente, o nível das palestras foi sensacional, mas dentre estas irei falar especialmente de três:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;palestra: Desenvolvimento de Aplicações Sociais com Rails&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Carlos Brando falou sobre suas experiências no desenvolvimento de aplicações para software social em sistemas como Open Social - Orkut - e FaceBook. Ele mostrou uma forma prática, produtiva e sustentável para desenvolver aplicações sociais em Rails. Sendo a única coisa ruim a notícia de que o framework &amp;nbsp;que facilita o desenvolvimento destas aplicações que o Carlos anda trabalhando não terá o código fonte aberto, pois foi vendido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Palestra: Integrando o iPhone com Ruby on Rails + Geração de gráficos com Ruby on Rails&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
Essa palestra realmente me impressionou, Pedro Franceschi, de apenas 13 anos que já impactou o mundo dos iPhones - desbloqueando vários deles, mostrou que idade não é documento palestrando sobre seus conhecimentos em RoR.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_mK4DEqf4UXw/TM4RtVwB1RI/AAAAAAAAAd4/xXHJb9g_lR4/s1600/Imagem0968.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/_mK4DEqf4UXw/TM4RtVwB1RI/AAAAAAAAAd4/xXHJb9g_lR4/s200/Imagem0968.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Palestra: JRuby: O Melhor dos Dois Mundos&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
Charles Nutter, mostrou de modo prático como integrar o mundo Java e Ruby. Um ótimo ponto dessa palestra foram as demonstrações desta integração, como por exemplo o uso de bibliotecas gráficas do Java no Ruby, e o humor de Charles.&lt;br /&gt;
&lt;br /&gt;
Esta foi a primeira, de muitas, RubyConf Brasil. Deixo minhas gratificações a todos que contribuíram para o evento em especial ao &lt;a href="http://akitaonrails.com/" target="_blank"&gt;Fabio Akita&lt;/a&gt; e aos patrocinadores: &lt;a href="http://www.gonow.com.br/" target="_blank"&gt;Go Now&lt;/a&gt;, &lt;a href="http://www.thoughtworks.com/" target="_blank"&gt;thoughtworks&lt;/a&gt;, &lt;a href="http://www.caelum.com.br/"&gt;Caelum&lt;/a&gt;, &lt;a href="http://www.engineyard.com/" target="_blank"&gt;Engine Yard&lt;/a&gt;, &lt;a href="http://www.paypal.com.br/" target="_blank"&gt;Pay Pal&lt;/a&gt;&amp;nbsp;e &lt;a href="http://www.infoq.com/br/" target="_blank"&gt;Infoq&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Mural RubyConf Brasil&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mK4DEqf4UXw/TM4VFEDTPSI/AAAAAAAAAd8/2-aPqWlhe2U/s800/Imagem0971.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_mK4DEqf4UXw/TM4VFEDTPSI/AAAAAAAAAd8/2-aPqWlhe2U/s400/Imagem0971.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_mK4DEqf4UXw/TM4V07vqtuI/AAAAAAAAAeA/z7YhShtvyD4/s1600/Imagem0973.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_mK4DEqf4UXw/TM4V07vqtuI/AAAAAAAAAeA/z7YhShtvyD4/s400/Imagem0973.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/993796589947148370/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/10/rubyconf-brasil.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/993796589947148370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/993796589947148370?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/9vs1icEzdfM/rubyconf-brasil.html" title="RubyConf Brasil" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_mK4DEqf4UXw/TM3MU7_RzsI/AAAAAAAAAdw/nxIfhAzXj1I/s72-c/Imagem0962.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/10/rubyconf-brasil.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EBSXc6fCp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-8524680557042519180</id><published>2010-10-25T05:39:00.000-07:00</published><updated>2012-12-18T16:07:38.914-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:07:38.914-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Respostas HTTP</title><content type="html">&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;Quando fazemos uma requisição na Web, o servidor busca o que está sendo requisitado e envia uma resposta para quem fez a requisição. Esta resposta pode ser dos seguintes tipos:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;1XX: informativas;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;2XX: indicam sucesso;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;3XX: referem-se a um redirecionamento;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;4XX: indicam erros ocorridos no cliente;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;5XX:&amp;nbsp;indicam erros no servidor.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/ul&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Mas como obter estas respostas através do Ruby? O seguinte código responde à essa pergunta:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; font-size: 12px; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, 'bitstream vera sans', helvetica, sans-serif; line-height: 19px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;require 'net/http' 
&amp;nbsp; resposta = Net::HTTP.get_response(URI.parse("http://www.casaopen.com.br/"))
&amp;nbsp; puts resposta.code&amp;nbsp; # retorna qual foi a resposta a requisição HTTP. Ex: 200, 400...
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Mas como você não quer problemas caso a URL os tenha, isso ajuda:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;require 'net/http' 
begin
&amp;nbsp; resposta = Net::HTTP.get_response(URI.parse("http://www.casaopen.com.br/"))
&amp;nbsp; puts resposta.code&amp;nbsp; # retorna qual foi a resposta a requisição HTTP. Ex: 200, 400...
rescue =&amp;gt; ret&amp;nbsp;&amp;nbsp; # TimeoutError #&amp;nbsp; Net::HTTP.SocketError,
&amp;nbsp; puts&amp;nbsp; "Erro: #{resposta}"
end&amp;nbsp;&amp;nbsp; &lt;/pre&gt;
&lt;br /&gt;
Para maiores informações, veja a documentação do &lt;a href="http://ruby-doc.org/core/classes/Net/HTTP.html" target="_blank"&gt;Ruby&lt;/a&gt;.</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/8524680557042519180/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/10/respostas-http.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/8524680557042519180?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/8524680557042519180?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/QBmdODxgPdc/respostas-http.html" title="Respostas HTTP" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/10/respostas-http.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIHRn4_fip7ImA9WhNVGEw.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-6279974170607701688</id><published>2010-09-23T17:25:00.000-07:00</published><updated>2012-12-29T11:48:57.046-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-29T11:48:57.046-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Tipagem em Ruby</title><content type="html">Cada linguagem de programação tem sua forma de lidar com tipos, por exemplo: C é uma linguagem estaticamente tipada, pois o tipo da variável é definido em tempo de compilação. O que pode ser visto no seguinte exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;&amp;nbsp;&amp;nbsp;char a= 'a';
&lt;/pre&gt;
&lt;br /&gt;
No entanto, Ruby é dinamicamente, implicitamente e fortemente tipada. Vejamos o que cada um destes adjetivos significam:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Dinamicamente tipada&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Quer dizer que, a cada interação, o tipo é verificado. Isso fica claro no seguinte exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;x = 100
(1..4).each{ x = x * 100 ; &amp;nbsp;puts "#{ x.class} #{x}" &amp;nbsp;}
&lt;/pre&gt;
&lt;br /&gt;
Que gera o resultado:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;Fixnum 10000
Fixnum 1000000
Fixnum 100000000
Bignum 10000000000
&lt;/pre&gt;
&lt;br /&gt;
Como podemos ver a variável x começa como Fixnum e conforme aumenta passa para Bignum sem a necessidade de uma conversão.&lt;br /&gt;
&lt;br /&gt;
Essa característica gera vários pontos positivos na linguagem, tais como:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Diminui a verbosidade, pois não há a necessidade de fazer conversões;&lt;/li&gt;
&lt;li&gt;Tende a facilitar a vida do programador pois não há a preocupação com conversões.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Mas neste contexto nem tudo são flores, vejamos os pontos negativos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;A linguagem tende a ser mais lenta, em tempo de execução, devido ao fato de que, a cada interação, o tipo ser verificado;&lt;/li&gt;
&lt;li&gt;Pode confundir o programador pois o mesmo pode não saber exatamente com quais tipos está tratando.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Implicitamente tipada&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Continuando no mesmo exemplo, quando fizemos x = 100 não precisamos declarar o tipo de x. Ou seja, não foi necessário fazer algo como: Fixnum x = 100. Isso acontece pelo fato do Ruby detectar o tipo de cada variável em tempo de execução. Uma boa analogia para este fenômeno é pensar nas variáveis como se fossem caixas fechadas e seus dados como fitas coloridas onde o interpretador abre a caixa e verifica as cores das fitas.&lt;br /&gt;
&lt;br /&gt;
Novamente, os pontos positivos e negativos são muito semelhantes aos relacionados a tipagem dinâmica. Veja:&lt;br /&gt;
&lt;br /&gt;
Positivos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Diminui a verbosidade, pois não há a necessidade de fazer declarações.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Negativos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;A linguagem tende a ser mais lenta pois o tipo é verificado em tempo de execução de acordo com a analogia das caixas e fitas;&lt;/li&gt;
&lt;li&gt;Pode confundir o programador pois o mesmo pode não saber exatamente com quais tipos está tratando já que não existe a declaração dos mesmos.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Fortemente tipada&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Este é um conceito confuso, mas uma boa forma de explica-lo é dizendo que &amp;nbsp;todas as variáveis devem ter um tipo - ou seja: fazer parte de uma classe no caso do Ruby - e que &amp;nbsp;cada tipo segue a risca seu contrato. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;a = 100
b = "Ruby on Rails"
a + b

TypeError: String can't be coerced into Fixnum
&amp;nbsp;&amp;nbsp; &amp;nbsp;from (irb):54:in `+'
&amp;nbsp;&amp;nbsp; &amp;nbsp;from (irb):54
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Como você notou, em Ruby não podemos somar um String com Fixnum pois essa operação não está no contrato da classe String e Fixnum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De fato, o assunto não acaba por aqui, existem alguns materiais na Web e em Livros sobre isso. Em vista disso, e no intuito de incentivar a pesquisa, deixo algumas referencias e até a próxima!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codecommit.com/blog/ruby/adding-type-checking-to-ruby"&gt;codecommit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rubyfleebie.com/ruby-is-dynamically-and-strongly-typed/"&gt;rubyfleebie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
P.S. Os tipos em Ruby na verdade são classes, ou seja: não existem tipos primitivos e sim objetos que pertencem a classes. Ex.:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;a = 1 # a pertence a classe Fixnum
&lt;/pre&gt;
</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/6279974170607701688/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/09/tipagem-em-ruby.html#comment-form" title="9 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/6279974170607701688?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/6279974170607701688?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/t7xuO27ohRw/tipagem-em-ruby.html" title="Tipagem em Ruby" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>9</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/09/tipagem-em-ruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EDR3oyeCp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-6395532953630243579</id><published>2010-09-09T07:22:00.000-07:00</published><updated>2012-12-18T16:07:56.490-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:07:56.490-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Retirando a exceção InvalidAuthenticityToken</title><content type="html">&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;
&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Já tentou enviar formulários fora da sua aplicação? Se sim, certamente você teve problemas!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;
&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Esses problemas se devem ao fato de que o Rails 2 insere o campo “authenticity_token” nos formulários no intuito de não permitir envios de forms por terceiros.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;
&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Mas se desejar receber tais envios basta colocar:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;self.allow_forgery_protection = false
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;
&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;no controller desejado.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/6395532953630243579/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/09/retirando-excecao-invalidauthenticityto.html#comment-form" title="2 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/6395532953630243579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/6395532953630243579?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/DFbyveZOKmk/retirando-excecao-invalidauthenticityto.html" title="Retirando a exceção InvalidAuthenticityToken" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/09/retirando-excecao-invalidauthenticityto.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQDSX04eCp7ImA9Wx5REEg.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-9122008174429546054</id><published>2010-08-17T07:12:00.000-07:00</published><updated>2010-08-17T07:12:58.330-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-17T07:12:58.330-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Noticias" /><title>progzoo.net: Comparando as linguagens de programação</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-style: normal;" target="_blank"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;O&amp;nbsp;&lt;/span&gt;&lt;a href="http://progzoo.net/"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;progzoo.net&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;é um ótimo site que mostra códigos com o mesmo&amp;nbsp;propósito&amp;nbsp;em linguagens diferentes - Java, C#, C++, Perl, PHP, Python, Ruby, VB. O site fornece exemplos tais como o&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Hello World, Convert to Number, Read Text File, Sum an Array&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;entre outros.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="western" style="margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;/div&gt;&lt;div class="western" style="font-style: normal; font-weight: medium; margin-bottom: 0cm; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;E, puxando a sardinha para o Ruby, é impressionante o quanto ele é mais conciso do que a maiorias das outras linguagens.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: large;"&gt;Sem dúvida vale a pena conferir o &lt;a href="http://progzoo.net/" target="_blank"&gt;site&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="western" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/9122008174429546054/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/08/progzoonet-comparando-as-linguagens-de.html#comment-form" title="2 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/9122008174429546054?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/9122008174429546054?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/eXGyIx3okT8/progzoonet-comparando-as-linguagens-de.html" title="progzoo.net: Comparando as linguagens de programação" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/08/progzoonet-comparando-as-linguagens-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMMQXkycSp7ImA9WhNVFkw.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-1405754788089832680</id><published>2010-07-28T06:12:00.000-07:00</published><updated>2012-12-27T04:48:00.799-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-27T04:48:00.799-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Teste suas expressões regulares online</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_mK4DEqf4UXw/TFAsWqtJ-pI/AAAAAAAAAKw/86Wuzl5FeDo/s1600/RegexBuddy.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blanck"&gt;&lt;img border="0" height="194" src="http://2.bp.blogspot.com/_mK4DEqf4UXw/TFAsWqtJ-pI/AAAAAAAAAKw/86Wuzl5FeDo/s200/RegexBuddy.gif" width="200" alt="testador expressão regular Ruby"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="western" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="western" style="margin-bottom: 0cm;"&gt;Vai uma dica de um ótimo site, o &lt;a href="http://rubular.com/" target="_blanck"&gt;Rubular&lt;/a&gt;. Com ele você testa suas expressões regulares em Ruby de forma pratica e rápida e ainda pode adquirir um link de seus testes.&lt;/div&gt;&lt;div class="western" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="western" style="margin-bottom: 0cm;"&gt;Veja um exemplo: &lt;a href="http://rubular.com/r/tgTEBeNhzz" target="_blanck"&gt;http://rubular.com/r/tgTEBeNhzz&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/1405754788089832680/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/07/teste-suas-expressoes-regulares-online.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/1405754788089832680?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/1405754788089832680?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/09A2xM-5Jg8/teste-suas-expressoes-regulares-online.html" title="Teste suas expressões regulares online" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_mK4DEqf4UXw/TFAsWqtJ-pI/AAAAAAAAAKw/86Wuzl5FeDo/s72-c/RegexBuddy.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/07/teste-suas-expressoes-regulares-online.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ABRHs4fCp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-9108632213925965000</id><published>2010-07-16T05:57:00.001-07:00</published><updated>2012-12-18T16:09:15.534-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:09:15.534-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Project Euler #1</title><content type="html">O &lt;a href="http://projecteuler.net/" target="_new"&gt;Projeto Euler&lt;/a&gt; foi iniciado por Colin Hughes (aka Euler) em outubro de 2001 e consiste em diversos problemas que envolvem matemática e computação, sendo que alguns são possíveis resolver sem o uso da computação e outros não. Segundo a descrição do projeto, este teve como principal motivação oferecer uma plataforma para que mentes curiosas mergulhem em áreas desconhecidas.&lt;br /&gt;
&lt;br /&gt;
Salvo as devidas explicações, irei começar a resolver alguns problemas, de preferência em Ruby, e postar as soluções aqui. &lt;br /&gt;
&lt;br /&gt;
Então... vamos ao &lt;a href="http://projecteuler.net/index.php?section=problems&amp;amp;id=1" target="_new"&gt;problema 1&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Descrição&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.&lt;br /&gt;
Find the sum of all the multiples of 3 or 5 below 1000.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Solução&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;sum = 0
(1..999).each { |x| sum += x if x%3 == 0 or x%5 == 0 }
puts sum
&lt;/pre&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;sum = (0..999).inject {|aux, n| ( n%3 == 0 or n%5 == 0 ) ? aux + n  : aux }
p sum
&lt;/pre&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Resposta&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
233168</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/9108632213925965000/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/07/project-euler-1.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/9108632213925965000?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/9108632213925965000?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/-VOVRYryGwY/project-euler-1.html" title="Project Euler #1" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/07/project-euler-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ADRXY7eSp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-5333184765843276801</id><published>2010-07-08T13:51:00.000-07:00</published><updated>2012-12-18T16:09:34.801-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:09:34.801-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Doc da sua aplicação Rails</title><content type="html">Já experimentou o comando rake doc:app ?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;rake doc:app
&lt;/pre&gt;
&lt;br /&gt;
Ele cria uma doc semelhante a documentação do &lt;a href="http://ruby-doc.org/core/"&gt;Ruby&lt;/a&gt;&amp;nbsp;com todos os arquivos, classes e métodos  da sua sua aplicação no diretório /doc/app/ .&lt;br /&gt;
&lt;br /&gt;
Bom, mas existem muitos outros comandos interessantes, para conhecê-los basta rodar:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;rake -T


rake db:abort_if_pending_migrations        # Raises an error if there are pending migrations
rake db:charset                            # Retrieves the charset for the current environment's database
rake db:collation                          # Retrieves the collation for the current environment's database
rake db:create                             # Create the database defined in config/database.yml for the current RAILS_ENV
rake db:create:all                         # Create all the local databases defined in config/database.yml
rake db:drop                               # Drops the database for the current RAILS_ENV
rake db:drop:all                           # Drops all the local databases defined in config/database.yml
rake db:fixtures:identify                  # Search for a fixture given a LABEL or ID.
rake db:fixtures:load                      # Load fixtures into the current environment's database.
rake db:migrate                            # Migrate the database through scripts in db/migrate and update db/schema.rb ...
rake db:migrate:down                       # Runs the "down" for a given migration VERSION.
rake db:migrate:redo                       # Rollbacks the database one migration and re migrate up.
rake db:migrate:reset                      # Resets your database using your migrations for the current environment
rake db:migrate:up                         # Runs the "up" for a given migration VERSION.
rake db:reset                              # Drops and recreates the database from db/schema.rb for the current environm...
rake db:rollback                           # Rolls the schema back to the previous version.
rake db:schema:dump                        # Create a db/schema.rb file that can be portably used against any DB support...
rake db:schema:load                        # Load a schema.rb file into the database
rake db:seed                               # Load the seed data from db/seeds.rb
rake db:sessions:clear                     # Clear the sessions table
rake db:sessions:create                    # Creates a sessions migration for use with ActiveRecord::SessionStore
rake db:setup                              # Create the database, load the schema, and initialize with the seed data
rake db:structure:dump                     # Dump the database structure to a SQL file
rake db:test:clone                         # Recreate the test database from the current environment's database schema
rake db:test:clone_structure               # Recreate the test databases from the development structure
rake db:test:load                          # Recreate the test database from the current schema.rb
rake db:test:prepare                       # Check for pending migrations and load the test schema
rake db:test:purge                         # Empty the test database
rake db:version                            # Retrieves the current schema version number
rake doc:app                               # Build the RDOC HTML Files
rake doc:clobber_app                       # Remove rdoc products
rake doc:clobber_plugins                   # Remove plugin documentation
rake doc:clobber_rails                     # Remove rdoc products
rake doc:guides                            # Generate Rails guides
rake doc:plugins                           # Generate documentation for all installed plugins
rake doc:plugins:brazilian-rails           # Generate documentation for the brazilian-rails plugin
rake doc:plugins:human_attribute_override  # Generate documentation for the human_attribute_override plugin
rake doc:plugins:jrails                    # Generate documentation for the jrails plugin
rake doc:plugins:paperclip                 # Generate documentation for the paperclip plugin
rake doc:plugins:will_paginate             # Generate documentation for the will_paginate plugin
rake doc:rails                             # Build the RDOC HTML Files
rake doc:reapp                             # Force a rebuild of the RDOC files
rake doc:rerails                           # Force a rebuild of the RDOC files
rake gems                                  # List the gems that this rails application depends on
rake gems:build                            # Build any native extensions for unpacked gems
rake gems:build:force                      # Force the build of all gems
rake gems:install                          # Installs all required gems.
rake gems:refresh_specs                    # Regenerate gem specifications in correct format.
rake gems:unpack                           # Unpacks all required gems into vendor/gems.
rake gems:unpack:dependencies              # Unpacks all required gems and their dependencies into vendor/gems.
rake jrails:install:javascripts            # Installs the jQuery and jRails javascripts to public/javascripts
rake jrails:update:javascripts             # Copies the jQuery and jRails javascripts to public/javascripts
rake log:clear                             # Truncates all *.log files in log/ to zero bytes
rake middleware                            # Prints out your Rack middleware stack
rake notes                                 # Enumerate all annotations
rake notes:custom                          # Enumerate a custom annotation, specify with ANNOTATION=WTFHAX
rake notes:fixme                           # Enumerate all FIXME annotations
rake notes:optimize                        # Enumerate all OPTIMIZE annotations
rake notes:todo                            # Enumerate all TODO annotations
rake paperclip:clean                       # Cleans out invalid attachments.
rake paperclip:refresh                     # Refreshes both metadata and thumbnails.
rake paperclip:refresh:metadata            # Regenerates content_type/size metadata for a given CLASS (and optional ATTA...
rake paperclip:refresh:thumbnails          # Regenerates thumbnails for a given CLASS (and optional ATTACHMENT).
rake rails:freeze:edge                     # Lock to latest Edge Rails, for a specific release use RELEASE=1.2.0
rake rails:freeze:gems                     # Lock this application to the current gems (by unpacking them into vendor/ra...
rake rails:template                        # Applies the template supplied by LOCATION=/path/to/template
rake rails:unfreeze                        # Unlock this application from freeze of gems or edge and return to a fluid u...
rake rails:update                          # Update both configs, scripts and public/javascripts from Rails
rake rails:update:application_controller   # Rename application.rb to application_controller.rb
rake rails:update:configs                  # Update config/boot.rb from your current rails install
rake rails:update:generate_dispatchers     # Generate dispatcher files in RAILS_ROOT/public
rake rails:update:javascripts              # Update your javascripts from your current rails install
rake rails:update:scripts                  # Add new scripts to the application script/ directory
rake routes                                # Print out all defined routes in match order, with names.
rake secret                                # Generate a crytographically secure secret key.
rake stats                                 # Report code statistics (KLOCs, etc) from the application
rake test                                  # Run all unit, functional and integration tests
rake test:benchmark                        # Run tests for benchmarkdb:test:prepare / Benchmark the performance tests
rake test:functionals                      # Run tests for functionalsdb:test:prepare / Run the functional tests in test...
rake test:integration                      # Run tests for integrationdb:test:prepare / Run the integration tests in tes...
rake test:plugins                          # Run tests for pluginsenvironment / Run the plugin tests in vendor/plugins/*...
rake test:profile                          # Run tests for profiledb:test:prepare / Profile the performance tests
rake test:recent                           # Run tests for recentdb:test:prepare / Test recent changes
rake test:uncommitted                      # Run tests for uncommitteddb:test:prepare / Test changes since last checkin ...
rake test:units                            # Run tests for unitsdb:test:prepare / Run the unit tests in test/unit
rake time:zones:all                        # Displays names of all time zones recognized by the Rails TimeZone class, gr...
rake time:zones:local                      # Displays names of time zones recognized by the Rails TimeZone class with th...
rake time:zones:us                         # Displays names of US time zones recognized by the Rails TimeZone class, gro...
rake tmp:cache:clear                       # Clears all files and directories in tmp/cache
rake tmp:clear                             # Clear session, cache, and socket files from tmp/
rake tmp:create                            # Creates tmp directories for sessions, cache, sockets, and pids
rake tmp:pids:clear                        # Clears all files in tmp/pids
rake tmp:sessions:clear                    # Clears all files in tmp/sessions
rake tmp:sockets:clear                     # Clears all files in tmp/sockets

&lt;/pre&gt;
</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/5333184765843276801/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/07/doc-da-sua-aplicacao-rails.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/5333184765843276801?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/5333184765843276801?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/y4fKo3RkNcE/doc-da-sua-aplicacao-rails.html" title="Doc da sua aplicação Rails" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/07/doc-da-sua-aplicacao-rails.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AMQnczeyp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-3096594015671460754</id><published>2010-06-30T06:16:00.000-07:00</published><updated>2012-12-18T16:09:43.983-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:09:43.983-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Em qual ambiente estamos?</title><content type="html">Já teve a necessidade de saber em qual ambiente de trabalho - production, development, test e  etc - você está? Acredito que sim! Logo segue algumas dicas para saber isso:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;if Rails.env == 'development'
  puts 'Estamos no development'
elsif Rails.env == 'production'
  puts 'Estamos no production'
end
&lt;/pre&gt;
&lt;br /&gt;
Ou:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;puts 'Estamos no development' if Rails.env.development? 
puts 'Estamos no production' if Rails.env.production? 
puts  'Estamos no test' if Rails.env.test?  
puts  'Estamos no whatever' if Rails.env.whatever?
&lt;/pre&gt;
&lt;br /&gt;
Ou usando a variável de ambientes RAILS_ENV:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;if RAILS_ENV == 'development'
  puts 'Estamos no development'
elsif RAILS_ENV == 'production'
  puts 'Estamos no production'
end
&lt;/pre&gt;
</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/3096594015671460754/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/06/em-qual-ambiente-estamos.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3096594015671460754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3096594015671460754?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/GQE99I-yU68/em-qual-ambiente-estamos.html" title="Em qual ambiente estamos?" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/06/em-qual-ambiente-estamos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIBQXwzfSp7ImA9WhNRE04.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-7828768418180630456</id><published>2010-06-04T10:48:00.000-07:00</published><updated>2012-11-07T15:55:50.285-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-07T15:55:50.285-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Wallpaper Ruby on Rails</title><content type="html">Estava procurando um papel de parede novo e olhe o que encontrei:&lt;br /&gt;
[ P.S. basta clicar nas fotos para ser redirecionado aos devidos sites ]&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/encyte/56883622/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/_mK4DEqf4UXw/S7TcxprYZ-I/AAAAAAAAAJg/1AKQ2OhZ75M/s200/56944752_0ddecad0f8.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.wallpaperpimper.com/Rails-wallpaper-106833" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/_mK4DEqf4UXw/TAk6q0H7TSI/AAAAAAAAAKU/_J6JncjMq-Q/s200/Rails_wallpaper.jpg" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.rubyinside.com/advent2006/other1920.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/TAk6g47R49I/AAAAAAAAAKE/Ihn8eTDDaUI/s200/papel_de_parede_ruby_rails.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.rubyinside.com/advent2006/24-wallpapers.html" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/TAk6mUqLokI/AAAAAAAAAKM/ka6tz9Ia00c/s200/wallpaper_rails.jpg" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/7828768418180630456/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/06/wallpaper-ruby-on-rails.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7828768418180630456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/7828768418180630456?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/9d6EV-Xt9c8/wallpaper-ruby-on-rails.html" title="Wallpaper Ruby on Rails" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mK4DEqf4UXw/S7TcxprYZ-I/AAAAAAAAAJg/1AKQ2OhZ75M/s72-c/56944752_0ddecad0f8.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/06/wallpaper-ruby-on-rails.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUGSXYzcSp7ImA9WhNRE04.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-8169040719343584892</id><published>2010-05-13T09:52:00.000-07:00</published><updated>2012-11-07T15:50:28.889-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-07T15:50:28.889-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Interpretador Ruby Online</title><content type="html">Já passou pela experiência de querer executar  algum algoritmo mas estava sem o devido  interpretador ou compilador? Certamente sim! Mas nessas horas o site &lt;a href="http://codepad.org/" target="_blank"&gt;CodePad&lt;/a&gt; é uma ótima saída, com ele você pode interpretar/compilar código fonte de várias linguagens tais com: Ruby, PHP, C, C++, Haskell, Lua, Ocaml, Perl e outras. Além disso, ele disponibiliza o seu código juntamente com a respectiva saída através de uma url curta de forma semelhante as usadas no Twitter.&lt;br /&gt;
Sem dúvida esses fatores apontam o CodPad como uma boa maneira para mostrar,&amp;nbsp; de forma rápida,&amp;nbsp; um código simples para alguém. &lt;br /&gt;
&lt;br /&gt;
Interessou? Então entre no &lt;a href="http://codepad.org/" target="_blank"&gt;site&lt;/a&gt; e/ou veja como é o seu &lt;a href="http://codepad.org/about" target="_blank"&gt;funcionamento&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
P.S. Fiz alguns testes em Ruby e em todos tive sucesso, veja um deles &lt;a href="http://codepad.org/QrVXq8oj" target="_blank"&gt;http://codepad.org/QrVXq8oj&lt;/a&gt;.</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/8169040719343584892/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/05/interpretador-ruby-online.html#comment-form" title="3 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/8169040719343584892?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/8169040719343584892?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/hzerMMOYyTo/interpretador-ruby-online.html" title="Interpretador Ruby Online" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/05/interpretador-ruby-online.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08EQn8_fCp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-4535497583847925373</id><published>2010-04-30T06:41:00.000-07:00</published><updated>2012-12-18T16:10:03.144-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:10:03.144-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Precedência em operadores lógicos</title><content type="html">Antes de qualquer coisa, veja os seguintes códigos e seus respectivos retornos:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;true and false #=&amp;gt; false
true &amp;amp;&amp;amp; false #=&amp;gt; false
&lt;/pre&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;true or false #=&amp;gt; true
true || false #=&amp;gt; true
&lt;/pre&gt;
&lt;br /&gt;
Em vista disso, logo vem a pergunta: Qual a diferença entre "and" e "&amp;amp;&amp;amp;" e entre "or" e "||"?&lt;br /&gt;
A resposta é simples, "&amp;amp;&amp;amp;" e "||" possuem maior precedência que "and" e "or". Sendo que o "&amp;amp;&amp;amp;" possui maior precedência que o "||" e o "and" possui a mesma precedência que "or". Veja alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;true or false and false #=&amp;gt; false
&lt;/pre&gt;
&lt;br /&gt;
Neste caso o código é resolvido da esquerda para a direita, ou seja: primeiro o "or" e em seguida o "and".&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;true or false &amp;amp;&amp;amp; false #=&amp;gt; true
&lt;/pre&gt;
&lt;br /&gt;
Como o "&amp;amp;&amp;amp;" possui maior precedência ele é resolvido primeiramente e depois o "or".</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/4535497583847925373/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/04/precedencia-em-operadores-logicos.html#comment-form" title="2 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/4535497583847925373?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/4535497583847925373?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/h9e7GcJY-2M/precedencia-em-operadores-logicos.html" title="Precedência em operadores lógicos" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/04/precedencia-em-operadores-logicos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08ESH84fSp7ImA9WhNWGEo.&quot;"><id>tag:blogger.com,1999:blog-4800026411398402386.post-3340271074541128231</id><published>2010-04-18T08:01:00.000-07:00</published><updated>2012-12-18T16:10:09.135-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T16:10:09.135-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby e Rails" /><title>Tarefas em background - delayed job</title><content type="html">Realizar tarefas em background é uma boa saída para melhorar a resposta da sua aplicação. Geralmente usamos este recurso para tarefas como enviar e-mail, redimensionar imagens, postar algo no twitter... isso, simplesmente pelo fato que estas tarefas não necessitarem de resposta imediata para o usuário continuar usando o sistema.&lt;br /&gt;
A verdade é que, para quem utiliza Rails, existem vários plugins e gens que fazem este trabalho. Vejamos alguns:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://github.com/blog/542-introducing-resque"&gt;Introducing Resque&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://github.com/ncr/background-fu"&gt;background-f&lt;span style="font-size: small;"&gt;u &lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;a href="http://github.com/saimonmoore/backgroundjob" id="backgroundjob" name="backgroundjob"&gt;Backgroundjob&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://github.com/imedo/background_lite"&gt;background_lite&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://github.com/gnufied/backgroundrb"&gt;backgroundrb&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;br /&gt;
Porem, na minha opnião, a melhor opção é o &lt;a href="http://github.com/collectiveidea/delayed_job"&gt;Delayed Job&lt;/a&gt;. Com ele você armazena os jobs em uma tabela e os realiza quando achar melhor! Sem contar que o Delayed Job está disponível nas formas de plugin e gem. Vejamos o seu funcionamento: &lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt; Para instalar:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;# instação como plugin&amp;nbsp;
# rode na raiz da aplicação
script/plugin install git://github.com/collectiveidea/delayed_job.git
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Configurando o banco de dados&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Para gerar a tabela onde as tarefas serão salvas use os seguintes comandos no terminal:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;&amp;nbsp;script/generate delayed_job
&amp;nbsp;rake db:migrate&amp;nbsp;&lt;/pre&gt;
Isso vai gerar uma tabela no seguintes moldes:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;create_table :delayed_jobs, :force =&amp;gt; true do |table|
  table.integer  :priority, :default =&amp;gt; 0      # Allows some jobs to jump to the front of the queue
  table.integer  :attempts, :default =&amp;gt; 0      # Provides for retries, but still fail eventually.
  table.text     :handler                      # YAML-encoded string of the object that will do work
  table.text   :last_error                   # reason for last failure (See Note below)
  table.datetime :run_at                       # When to run. Could be Time.zone.now for immediately, or sometime in the future.
  table.datetime :locked_at                    # Set when a client is working on this object
  table.datetime :failed_at                    # Set when all retries have failed (actually, by default, the record is deleted instead)
  table.string   :locked_by                    # Who is working on this object (if locked)
  table.timestamps
end&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: inherit;"&gt;
&lt;span style="font-size: large;"&gt;Realizando tarefas em background&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Agora já é possível realizar jobs em background, veja um exemplo de envio de e-mail: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;# usando o Delayed Job
MeuModelDeEmail.send_later :deliver_MeuEmail, @MeuParametro

# sem usar o Delayed Job:
MeuModelDeEmail.deliver_MeuEmail(@MeuParametro)&lt;/pre&gt;
&lt;br /&gt;
Outro exemplo:&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;&lt;pre class="sh_ruby sh_sourceCode"&gt;@imagem&lt;span class="sh_symbol"&gt;.&lt;/span&gt;calculate_size # sem usar o Delayed Job&lt;/pre&gt;
@imagem.send_later&lt;span class="sh_symbol"&gt;(:&lt;/span&gt;calculate_size&lt;span class="sh_symbol"&gt;)&lt;/span&gt; # usando o Delayed Job&amp;nbsp;&lt;/pre&gt;
Mais um exemplo&lt;br /&gt;
&lt;br /&gt;
Outro modo seria passar a(s) tarefa(s) para uma lib onde teríamos um arquivo, por exemplo: lib/mailingenvia.rb, da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;require 'net/smtp'
class Mailingenvia &amp;lt; Struct.new( MeuParametro )
&amp;nbsp; def perform
&amp;nbsp;&amp;nbsp; Contato.deliver_MeuEmail( MeuParametro )
&amp;nbsp; end
end&lt;/pre&gt;
e chamá-lo assim:&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;Delayed::Job.enqueue Mailingenvia.new( @MeuParametro )
# P.S. Quando isso é feito o método perform é chamado &lt;/pre&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Realizando as tarefas que estão na fila de prioridade&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Quando fazemos um tarefa pelo delayed job ela é salva na tabela chamada "delayed_jobs" e para rodá-la é necessário o seguinte comando:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;rake jobs:work
# para parar de realizar os jobs: CRTL-C
&lt;/pre&gt;
&lt;code&gt;&lt;span style="font-family: inherit; font-size: small;"&gt;Se desejar apagar todas as tarefas da fila:&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: ruby; gutter: false;  toolbar: false;"&gt;rake jobs:clear&lt;/pre&gt;
&lt;br /&gt;
Bom, é isso. Para maiores informações veja a página do daleyd job no &lt;a href="http://github.com/collectiveidea/delayed_job"&gt;github&lt;/a&gt; ou asista este &lt;a href="http://railscasts.com/episodes/171-delayed-job"&gt;screencast&lt;/a&gt; que eu recomendo fortimente! Até a proxima!&lt;br /&gt;
&lt;br /&gt;
&lt;span onmouseout="_tipoff()" onmouseover="_tipon(this)"&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.casaopen.com.br/feeds/3340271074541128231/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.casaopen.com.br/2010/04/tarefas-em-background-delayed-job.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3340271074541128231?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4800026411398402386/posts/default/3340271074541128231?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/casaopen/~3/dXMK_-68LNM/tarefas-em-background-delayed-job.html" title="Tarefas em background - delayed job" /><author><name>Samuel Vinícius</name><uri>http://www.blogger.com/profile/18247509515584222197</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://4.bp.blogspot.com/_mK4DEqf4UXw/S3xS4zHqVtI/AAAAAAAAADw/aChBzCIhxE4/S220/uu.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.casaopen.com.br/2010/04/tarefas-em-background-delayed-job.html</feedburner:origLink></entry></feed>
