<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.10" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>blog.2solutions.com.br</title>
	<link>http://blog.2solutions.com.br</link>
	<description>Neste blog apresentamos as opiniões de nossos colaboradores, que participam ou ja participaram de nosso projetos.</description>
	<pubDate>Mon, 20 Oct 2008 15:28:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.10</generator>
	<language>en</language>
			<item>
		<title>Java no Ubuntu : Acertando Encoding no Eclipse</title>
		<link>http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu-acertando-encoding-no-eclipse/</link>
		<comments>http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu-acertando-encoding-no-eclipse/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 15:50:36 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Sem Categoria</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu-acertando-encoding-no-eclipse/</guid>
		<description><![CDATA[Uma coisa que precisamos nos preocupar quando temos ambientes heterogêneos de desenvolvimento é que em algum momento haverá a troca de dados de uma estação para outra, essa troca pode ser uma simples copia de arquivo ou o acesso a repositorio de arquivos.
Para que essas trocas não levem a problemas de caracteres é preciso que [...]]]></description>
			<content:encoded><![CDATA[<p>Uma coisa que precisamos nos preocupar quando temos ambientes heterogêneos de desenvolvimento é que em algum momento haverá a troca de dados de uma estação para outra, essa troca pode ser uma simples copia de arquivo ou o acesso a repositorio de arquivos.</p>
<p>Para que essas trocas não levem a problemas de caracteres é preciso que os ambientes de desenvolvimento conversem na mesma lingua. </p>
<p>Padronizando no Eclipse, seguimos a ajuda de <a href="http://www.guj.com.br/posts/list/18869.java">http://www.guj.com.br/posts/list/18869.java</a> , o que precisamos fazer é ajustar todas nossas estações para utilizar o mesmo padrão de encoding de arquivo, no caso utilizaremos o ISO-8859-1.</p>
<p>No Eclipse :</p>
<p>Window >> Preferences >> General >> workspace >> Text File Encoding</p>
<p>Feito isso agora funciona perfeito. Todos codificam no mesmo padrão.
</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu-acertando-encoding-no-eclipse/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java no Ubuntu : Inicio</title>
		<link>http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu/</link>
		<comments>http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 15:17:24 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Java</category>

		<category>Dicas</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu/</guid>
		<description><![CDATA[Estamos fazendo um estudo para migrar as estações de desenvolvimento que não são .NET para o Sistema Operacional Ubuntu.
Nosso primeiro requsito é a parte de instalação do JDK no Ubuntu e para isso é preciso intalar o Java e configurar a variavel de ambiente JAVA_HOME.
Instalar o Java, pode ser feito tanto pelo gerenciador de pacotes [...]]]></description>
			<content:encoded><![CDATA[<p>Estamos fazendo um estudo para migrar as estações de desenvolvimento que não são .NET para o Sistema Operacional Ubuntu.</p>
<p>Nosso primeiro requsito é a parte de instalação do JDK no Ubuntu e para isso é preciso intalar o Java e configurar a variavel de ambiente JAVA_HOME.</p>
<p>Instalar o Java, pode ser feito tanto pelo gerenciador de pacotes do Ubuntu quanto fazendo download pelo site da Sun. Se for feito pelo gerenciador a opção que se tem é o OpenJDK e é so fazer um next>next>finish, sem mistério. </p>
<p>Se for baixar do site da Sun (http://java.sun.com) baixe a versão binaria (é a não RPM).</p>
<p>O unico detalhe é que o arquivo não vem executável, para isso :</p>
<p><code>chmod 777 jdk1.5....</code></p>
<p>Execute o arquivo</p>
<p><code>./jdk1.5...</code></p>
<p>Após a instalação do JDK ser realizada com sucesso o próximo passo é configurar a variável de ambiente.</p>
<p>Para que todos os usuarios acessem essa variavel de ambiente, é preciso adicionar algumas configurações nos arquivos /etc/bash.bashrc e /etc/profile.</p>
<p>As configurações precisam ser feitas nos dois arquivos pois um é para login shel (console) e o outro é login no shel (gnome por exemplo).</p>
<p><code>export JAVA_HOME=/usr/lib/jdk1.5<br />
export PATH=$JAVA_HOME/bin:$PATH</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/10/15/java-no-ubuntu/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JPAQL - Filtrando pelo ultimo status de um historico</title>
		<link>http://blog.2solutions.com.br/2008/10/09/jpaql-mostrando-o-ultimo-status-de-um-historico/</link>
		<comments>http://blog.2solutions.com.br/2008/10/09/jpaql-mostrando-o-ultimo-status-de-um-historico/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 18:21:51 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Dicas</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/10/09/jpaql-mostrando-o-ultimo-status-de-um-historico/</guid>
		<description><![CDATA[Para alguns sistemas toda a alteração que ocorre em uma entidade deve ser armazenada com informações como &#8220;quem alterou&#8221;, &#8220;a data&#8221; e &#8220;para qual situação mudou&#8221;. Podemos representar assim :
1 - Entidade Chamado
2 - Entidade ChamadoHistorico
3 - Entidade Status
public class Chamado {
   private Integer id;
   private List&#60;ChamadoHistorico&#62; chamadoHistoricos;
}
public class Status {
 [...]]]></description>
			<content:encoded><![CDATA[<p>Para alguns sistemas toda a alteração que ocorre em uma entidade deve ser armazenada com informações como &#8220;quem alterou&#8221;, &#8220;a data&#8221; e &#8220;para qual situação mudou&#8221;. Podemos representar assim :</p>
<p>1 - Entidade Chamado<br />
2 - Entidade ChamadoHistorico<br />
3 - Entidade Status</p>
<p><code>public class Chamado {<br />
   private Integer id;<br />
   private List&lt;ChamadoHistorico&gt; chamadoHistoricos;<br />
}<br />
public class Status {<br />
  private Integer id;<br />
  private String descricao;<br />
}<br />
public class ChamadoHistorico {<br />
  private Integer id;<br />
  private Date data;<br />
  private Chamado chamado;<br />
  private Status status;<br />
}<br />
</code></p>
<p>Na tela que mostra todos os chamados, precisamos retornar uma lista com os chamados e seus ultimos status. Para isso devemos criar métodos na entidade Chamado que retornem seu ultimo status algo como :</p>
<p><code><br />
@Transient<br />
public Status getUltimoStatus(){<br />
	Status status = null;<br />
	if(chamadoHistoricos != null &#038;&#038; !chamadoHistoricos.isEmpty()){<br />
		for (ChamadoHistorico chamadoHistorico : chamadoHistoricos) {<br />
			status = chamadoHistorico.getStatus();<br />
		}<br />
	}<br />
	return status;<br />
}<br />
</code></p>
<p><code>@Transient<br />
public Date getUltimaData(){<br />
	Date data = null;<br />
	if(chamadoHistoricos != null &#038;&#038; !chamadoHistoricos.isEmpty()){<br />
		for (ChamadoHistorico chamadoHistorico : chamadoHistoricos) {<br />
			data  = chamadoHistorico.getData();<br />
		}<br />
	}<br />
	return data;<br />
}<br />
</code></p>
<p>Percorrendo essa lista utilizando JSTL e EL.</p>
<p><code>&lt;table&gt;<br />
	&lt;tr&gt;<br />
		&lt;th&gt;Id&lt;/th&gt;<br />
		&lt;th&gt;Ultima Atualizacao&lt;/th&gt;<br />
		&lt;th&gt;Status&lt;/th&gt;<br />
	&lt;/tr&gt;<br />
	&lt;c:forEach items=${nomeDaListaComChamados} var="chamado"&gt;<br />
	&lt;tr&gt;<br />
		&lt;td>${chamado.id}&lt;/td&gt;<br />
		&lt;td>${chamado.ultimaData}&lt;/td&gt;<br />
		&lt;td>${chamado.ultimoStatus.descricao}&lt;/td&gt;<br />
	&lt;/tr&gt;<br />
	&lt;/c:forEach&gt;<br />
&lt;/table&gt;<br />
</code></p>
<p>E da parte de JPAQL, posso ter a situação de filtrar apenas os chamados &#8220;EM ABERTO&#8221; == 1 :</p>
<p><code>select chamado from Chamado chamado left join chamado.chamadoHistoricos as historico<br />
where historico.id in (select max(ch.id) from ChamadoHistorico ch group by ch.fise.id)<br />
and historico.status.id = 1<br />
</code>
</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/10/09/jpaql-mostrando-o-ultimo-status-de-um-historico/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Arquitetura Java 2Solutions (utilizando struts2+spring+jpa)</title>
		<link>http://blog.2solutions.com.br/2008/09/17/processo-e-arquitetura-2solutions-nivel-iniciante/</link>
		<comments>http://blog.2solutions.com.br/2008/09/17/processo-e-arquitetura-2solutions-nivel-iniciante/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 22:25:42 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Tutorias</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/09/17/processo-e-arquitetura-2solutions-nivel-iniciante/</guid>
		<description><![CDATA[Abaixo estou listando um passo-a-passo para a implementação de requisitos de um sistema, utilizando a arquitetura Java da 2Solutions.
Em primeiro lugar, os frameworks que adotamos para o desenvolvimento são :
Struts2 : View e Controller
JPA (Hibernate) : Persistência
Spring : IoC e DI
Os frameworks se relacionam, facilitando o nosso trabalho assim, os trabalhos iniciam assim:
Resumo de Levantamento [...]]]></description>
			<content:encoded><![CDATA[<p>Abaixo estou listando um passo-a-passo para a implementação de requisitos de um sistema, utilizando a arquitetura Java da 2Solutions.</p>
<p>Em primeiro lugar, os frameworks que adotamos para o desenvolvimento são :</p>
<p><a href="http://struts.apache.org/2.x/">Struts2</a> : View e Controller<br />
<a href="http://www.hibernate.org/">JPA (Hibernate)</a> : Persistência<br />
<a href="http://www.springframework.org/">Spring</a> : IoC e DI</p>
<p>Os frameworks se relacionam, facilitando o nosso trabalho assim, os trabalhos iniciam assim:</p>
<p><strong>Resumo de Levantamento de requerimentos</strong></p>
<p>A primeira coisa a fazer no desenvolvimento de software é o levantamento/descobrimente de requerimentos. Essas informações são bem armazenadas na forma de diagramas de caso de uso.</p>
<p>A ideia dos casos de uso é ser o mais simples possivel, apenas documentando as funcionalidades, deixando de descreve-las a fundo. O caso de uso deve ser documentado com um usuario e quais funcionalidades do sistema ele ira interagir, por exemplo :</p>
<p><em>Ator : Gerente de contas<br />
Caso de Uso : Cadastrar novo cliente</em></p>
<p>Se o caso de uso &#8216;cadastrar novo cliente&#8217; for um pouco complexo, repare bem, <strong>SE</strong> for complexo, dai sua lógica deve ser armazenada em um diagrama de atividades. Ou podemos utilizar cenários para armazenar as situações.</p>
<p>Junto a isso pode ser feito protótipos para ser apresentado ao cliente e este levantar mais informações pertinentes. Nesta fase não temos codigo compilado, apenas telas e informações sobre a funcionalidade. Podemos agilizar isso com reunioes, ou com viagens ao codigo e planos de teste.</p>
<p><strong>Modelagem</strong></p>
<p>A medida que as funcionalidades vão sendo descobertas o próximo passo é ir descrevendo as entidades encontradas. Essa descrição pode ser feita direto no banco de dados, ou pode ser feita associando classes.</p>
<p>Na 2Solutions nós fazemos as classes e anotamos seu nome e seus atributos para que as tabelas sejam geradas.</p>
<p>Por tanto o primeiro passo é fazer a modelagem das classes. </p>
<p>Uma forma de verificar se o modelo esta bem feito é criando testes unitários. Teste unitário é apenas garantir que aquela funcionalidade especifica da sua entidade como &#8216;inserir no banco&#8217; esta funcionando. O ideal é criar para cada entidade testes unitarios de <em>insert</em>, <em>select</em>, <em>update</em> e <em>delete</em>.</p>
<p><strong>Action/Jsp</strong></p>
<p>Depois que suas classes estiverem corretamente modeladas e testadas, dai partimos para as interfaces. Por padrão toda entidade criada pode ser manipulada utilizando interfaces genéricas. Para que isso funcione voce precisa.</p>
<p>1 - Criar o arquivo EntidadeAction no pacote actions, seguindo o modelo de uma action padrão :</p>
<p><code>public class ClienteAction extends GenericAction {<br />
	public ClienteAction(GenericService service){<br />
		super(service);<br />
	}<br />
}</code></p>
<p>2 - Com a entidade criada, o próximo passo é fazer as associações no Spring. O Spring é o responsável por cuidar da parte de instanciar objetos e seta-los nas entidades. Com o Spring temos benefícios imediatos como a IoC (Inversion Of Control) e a DI (Dependency Injection)</p>
<p><code>&lt;!--<br />
	Entitys<br />
--&gt;<br />
&lt;bean id="clienteEntity" class="br.gov.sp.sucen.controledengue.entity.Cliente" scope="session"/&gt;</code></p>
<p><code>&lt;!--<br />
	Services<br />
--&gt;<br />
&lt;bean id="clienteService" class="br.gov.sp.sucen.controledengue.service.GenericServiceImpl"&gt;<br />
	&lt;constructor-arg&gt;<br />
		&lt;value>br.gov.sp.sucen.controledengue.entity.Cliente</value&gt;<br />
	&lt;/constructor-arg&gt;<br />
&lt;/bean&gt;</code></p>
<p><code>&lt;!--<br />
	Actions<br />
--><br />
&lt;bean id="clienteAction" scope="prototype" class="br.gov.sp.sucen.controledengue.action.ClienteAction"&gt;<br />
	&lt;constructor-arg ref="clienteService" /&gt;<br />
	&lt;property name="entity" ref="clienteEntity" /&gt;<br />
&lt;/bean&gt;</code></p>
<p>3 - Com tudo configurado a sua entidade ja esta com as operações basicas de manipulação prontas.</p>
<p>http://localhost:8080/MeuProjeto/cliente!novo.action<br />
http://localhost:8080/MeuProjeto/cliente!pesquisar.action<br />
http://localhost:8080/MeuProjeto/cliente!salvar.action<br />
http://localhost:8080/MeuProjeto/cliente!remover.action<br />
http://localhost:8080/MeuProjeto/cliente!editar.action<br />
http://localhost:8080/MeuProjeto/cliente!visualizar.action</p>
<p><strong>Personalizando</strong></p>
<p>Procure sempre criar interfaces baseadas nas entidades. Com recursos como AJAX, nós podemos ter uma tela desempenhando varias funções no mesmo ambiente. Por exemplo, se na interface de cadastro de cliente você precisar mostrar uma lista com os vendedores, para selecionar qual o vendedor desse cliente, o processe ficaria assim.</p>
<p><strong>Combo (&lt;select&gt;)</strong></p>
<p><code>&lt;%<br />
   ObjectFactory factory = StrutsSpringObjectFactory.getObjectFactory();<br />
   GenericService service = (GenericService)factory.buildBean("vendedorService",null);<br />
   pageContext.setAttribute("propertyListName",service.buscarTodos());<br />
%&gt;<br />
&lt;s:select name="entity.vendedor.id" label="Selecione Vendedor" list="%{#attr.propertyListName}" listKey="id" headerKey="" headerValue=""/&gt;</code></p>
<p>Eu particularmente não gosto muito de Scriptlets no JSP, porém não gosto de ter que ficar criando uma colecao de retorno em toda Action</p>
<p><strong>Radiobuttons (Sim/Nao)</strong></p>
<p><code>&lt;s:radio label="Ativo" list="#{'true':'Sim','false':'Nao'}" name="entity.ativo"/&gt;</code></p>
<p><strong>Checkbox (Lista de Elementos)</strong></p>
<p><code>&lt;%<br />
   GenericService service = (GenericService)factory.buildBean("vendedorService",null);<br />
   List all = service.buscarTodos();<br />
   pageContext.setAttribute("propertyListName",all);<br />
%&gt;<br />
&lt;s:checkboxlist name="entity.vendedores" label="Selecione vendedores" list="%{#attr.propertyListName}"/&gt;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/09/17/processo-e-arquitetura-2solutions-nivel-iniciante/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby On Rails - Dia 5</title>
		<link>http://blog.2solutions.com.br/2008/09/08/ruby-on-rails-dia-5/</link>
		<comments>http://blog.2solutions.com.br/2008/09/08/ruby-on-rails-dia-5/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 16:08:55 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Ruby - Rails</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/09/10/oes/</guid>
		<description><![CDATA[Durante o treinamento, utilizamos uma liguagem nova (Ruby) e um framework (Rails) revolucionário. Não há duvidas da produtividade de Rails, e mesmo que consigamos atingir algo semelhante com outras lingguagens/plataformas, o mais importante são os conceitos aprendidos. Para esse ultimo dia, veremos dois assuntos.
JRuby
Para quem ja brincou com recursos avançados de Java, sabe os SDKs [...]]]></description>
			<content:encoded><![CDATA[<p>Durante o treinamento, utilizamos uma liguagem nova (Ruby) e um framework (Rails) revolucionário. Não há duvidas da produtividade de Rails, e mesmo que consigamos atingir algo semelhante com outras lingguagens/plataformas, o mais importante são os conceitos aprendidos. Para esse ultimo dia, veremos dois assuntos.</p>
<p><strong>JRuby</strong></p>
<p>Para quem ja brincou com recursos avançados de Java, sabe os SDKs mais atuais têm suporte a scripting, ou seja, é possível definir trechos de codigo em outra linguagem e o Java consegue interpreta-los. Esse é um grande avanço para a plataforma Java pois ela agora não fica mais depedente diretamente da linguagem Java, abrindo seus mercado para qualquer linguagem que implemente scripting.</p>
<p>Com o JRuby temos uma outra vantagem que é nosso codigo Ruby (rodando com Rails inclusive) acessar recursos Java (todo o nosso legado de bibliotecas Java que não queremos reescrever). Segue abaixo alguns caminhos para quem quer se aprofundar no assunto.</p>
<p>Pagina Oficial<br />
<a href="http://jruby.codehaus.org/">http://jruby.codehaus.org/</a></p>
<p>Download<br />
<a href="http://dist.codehaus.org/jruby/jruby-bin-1.1.4.zip">http://dist.codehaus.org/jruby/jruby-bin-1.1.4.zip</a></p>
<p>Iniciar (conhecendo bem ruby não tem segredo)<br />
<a href="http://wiki.jruby.org/wiki/Getting_Started">http://wiki.jruby.org/wiki/Getting_Started</a></p>
<p>Deploy no Tomcat(*)<br />
<a href="http://wiki.jruby.org/wiki/Jruby_on_Rails_on_Tomcat">http://wiki.jruby.org/wiki/Jruby_on_Rails_on_Tomcat</a></p>
<p>* Ao baixar a nova versao do Rails (2.1.1) é preciso comentar a versao do Rails do seu projeto (2.1.0), localizado em<br />
SEU_PROJETO\config\environment.rb (comentar a linha</p>
<p><strong>IDE</strong></p>
<p>Durante o treinamento trabalhamos apenas com editores de texto e o console (prompt). Esse modelo funciona, porém o auxílio de uma ferramenta pode trazer vantagens, como agilidade no acesso a códigos, acompanhar o log, assistencia de codigo, facilidade na exução de scripts e etc.</p>
<p><strong>Aptana - RadRails</strong></p>
<p>Uma IDE bem interessante para trabalhar com Rails é o RadRails (Aptana). Desenvolvida sobre plataforma Eclipse, é possível instalá-la como se fosse um plugin. Para trabalhar com Rails apenas alguns ajustes são necessários.</p>
<p>Comece fazendo o download em <a href="http://www.aptana.com/studio/download/">http://www.aptana.com/studio/download/</a></p>
<p>Apos a instalação baixar o plugin do Rails. Isso pode ser feito clicando na pagina inicial da IDE.</p>
<p><a href="http://www.2solutions.com.br/blog/1.png"><img src="http://www.2solutions.com.br/blog/p_1.jpg" alt="Pagina inicial do Aptana" /></a></p>
<p>Feito a instalação agora podemos começar com a criação de um novo projeto Rails.</p>
<p>Clicando em File >> New >> Other >> Project</p>
<p><a href="http://www.2solutions.com.br/blog/2.png"><img src="http://www.2solutions.com.br/blog/p_2.jpg" alt="Selecionar projeto Rails" /></a></p>
<p>Selecionado um projeto Rails</p>
<p><a href="http://www.2solutions.com.br/blog/3.png"><img src="http://www.2solutions.com.br/blog/p_3.jpg" alt="Configurações do projeto Rails" /></a></p>
<p>Após ter configurado seu projeto, a interface principal é atualizada com o diretorio do seu projeto criado ja com a estrutura dos diretorios. Na aba de log aparece todos os diretorios/arquivos criados.</p>
<p><a href="http://www.2solutions.com.br/blog/4.png"><img src="http://www.2solutions.com.br/blog/p_4.jpg" alt="Projeto Rails criado" /></a></p>
<p>Na aba console, é possível executar os comandos que seriam executados no prompt, apesar de existir uma forma mais user-friendly de executar essas operações.</p>
<p><a href="http://www.2solutions.com.br/blog/5.png"><img src="http://www.2solutions.com.br/blog/p_5.jpg" alt="Executando comandos no console" /></a></p>
<p>No exemplo de execução de script, foi executado o script de scaffolding em uma entidade Company. O resultado dos arquivos (não precisa dar refresh) esta abaixo.</p>
<p><a href="http://www.2solutions.com.br/blog/6.png"><img src="http://www.2solutions.com.br/blog/p_6.jpg" alt="Arquivos gerados pelo scaffolding" /></a></p>
<p>Com os arquivos criados, podemo agora editar os códigos. Começando pelas classes, o editor coloca em destaque as palavras reservadas, faz alinhamento automatico (identação) e também tem suporte ao Ctrl+&#8217;espaço&#8217; para apresentar métodos que você tem acesso. Recurso bem interessante visto que as classes Ruby tem um numero maior de métodos <em>(interface humana)</em>.</p>
<p><a href="http://www.2solutions.com.br/blog/7.png"><img src="http://www.2solutions.com.br/blog/p_6.jpg" alt="Assitência no código" /></a></p>
<p>Também temos esses recursos na edição de paginas view (html).</p>
<p><a href="http://www.2solutions.com.br/blog/8.png"><img src="http://www.2solutions.com.br/blog/p_8.jpg" alt="Assitência no código de visualização" /></a></p>
<p>Arquivos atualizados, é hora de colocarmos o servidor para funcionar. Na aba Servers execute o servidor</p>
<p><a href="http://www.2solutions.com.br/blog/9.png"><img src="http://www.2solutions.com.br/blog/p_9.jpg" alt="Inicializar o servidor" /></a></p>
<p>O servidor é iniciado na porta 3002, podendo ser acesso com http://localhost:3002</p>
<p><a href="http://www.2solutions.com.br/blog/10.png"><img src="http://www.2solutions.com.br/blog/p_10.jpg" alt="Servidor inicializado" /></a></p>
<p>A perspectiva ideial para trabalhar com projeto Rails é a &#8216;RadRails&#8217;. Para acessá-la va em Window >> Open Perspective >> Other</p>
<p><a href="http://www.2solutions.com.br/blog/12.png"><img src="http://www.2solutions.com.br/blog/p_12.jpg" alt="Selecionando a perspectiva RadRails" /></a></p>
<p>Nesta nova perspectiva os comandos via script que voce executaria no console, agora voce pode executar pelas abas, inclindo comandos rake.</p>
<p><a href="http://www.2solutions.com.br/blog/13.png"><img src="http://www.2solutions.com.br/blog/p_13.jpg" alt="Executando Rake" /></a></p>
<p>Executando instruções direto no console</p>
<p><a href="http://www.2solutions.com.br/blog/14.png"><img src="http://www.2solutions.com.br/blog/p_14.jpg" alt="Instruções direto no console" /></a></p>
<p>Executando os scripts de geração de código (generator)</p>
<p><a href="http://www.2solutions.com.br/blog/15.png"><img src="http://www.2solutions.com.br/blog/p_15.jpg" alt="Generators" /></a></p>
<p>Outra funcionalidade util é o gerenciamento de gems que pode ser feito direto na ferramenta.</p>
<p><a href="http://www.2solutions.com.br/blog/16.png"><img src="http://www.2solutions.com.br/blog/p_16.jpg" alt="Gems instaladas" /></a></p>
<p>Para adicionar uma gem basta clicar no ícone &#8220;+&#8221; e uma interface para atualização de gems vai aparecer, com um espaço para indicar qual o endereço do src do gem.</p>
<p><a href="http://www.2solutions.com.br/blog/17.png"><img src="http://www.2solutions.com.br/blog/p_17.jpg" alt="Gems instaladas" /></a></p>
<p>As funcionalidades acima servem para você começar a desenvolver com o RadRails, porém ele possui outras funcionalidades interessantes como a parte de integração com banco de dados e a edição dos arquivos de propriedade. Vale a pena dar uma conferida.</p>
<p>Até a próxima</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/09/08/ruby-on-rails-dia-5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby On Rails - Dia 4</title>
		<link>http://blog.2solutions.com.br/2008/09/05/ruby-on-rails-dia-4/</link>
		<comments>http://blog.2solutions.com.br/2008/09/05/ruby-on-rails-dia-4/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 14:37:20 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Ruby - Rails</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/09/09/ruby-on-rails-dia-4/</guid>
		<description><![CDATA[No quarto dia de treinamento o assunto que iremos abordar são as interfaces (ActionView).
Assim como todo framework para interfaces web, o principal é minimizar a utilização de lógicas de controle (if/else) na construção de formulários. Essa diminuição aparece principalmente quando utilizamos os formulários.
Um formulario contem informações que irão ser enviadas, porém que podem ser carregadas. [...]]]></description>
			<content:encoded><![CDATA[<p>No quarto dia de treinamento o assunto que iremos abordar são as interfaces (ActionView).</p>
<p>Assim como todo framework para interfaces web, o principal é minimizar a utilização de lógicas de controle (if/else) na construção de formulários. Essa diminuição aparece principalmente quando utilizamos os formulários.</p>
<p>Um formulario contem informações que irão ser enviadas, porém que podem ser carregadas. Dai a praticidade de se criar um formulario que ja esteja preparado para trabalhar com dados integradas a outras camadas.</p>
<p>No Ruby On Rails a estratégia não é nunhuma novidade.</p>
<p>Temos diversas instruções para representar um campo associado a um atributo de um registro. Por exemplo :</p>
<p><code>&lt;% form_for(@fabricante) do |f| %&gt;<br />
  &lt;%= f.error_messages %&gt;<br />
  &lt;p&gt;<br />
    &lt;%= f.label :descricao %&gt;&lt;br /&gt;<br />
    &lt;%= f.text_field :descricao %&gt;<br />
  &lt;/p&gt;<br />
  &lt;p&gt;<br />
    &lt;%= f.submit "Update" %&gt;<br />
  &lt;/p&gt;<br />
&lt;% end %&gt;</p>
<p>&lt;%= link_to 'Show', @fabricante %&gt; |<br />
&lt;%= link_to 'Back', fabricantes_path %&gt;</code></p>
<p>No exemplo acima (gerado pelo scaffold) temos um formulario, seus campos e um botão de submissão. Todo são construidos utilizando instruções do framework, dessa forma não precisamos nos preocupar se estamos preenchendo um formulario, validando se houve erro para retornar os campos preenchidos, etc. O mais importante é que o objeto que vai ter os seus atributos mapeados para os campos do formulario deve ser declarado como um atributo (@) no controller. No nosso exemplo deve existir um atributo @fabricante.</p>
<p>Discutimos muito sobre a utilização de campos &lt;select&gt;, por exemplo. Estes campos são mais complexos pois é necessário uma segunda consulta para mostrar os dados no combo, algo como :</p>
<p><code>&lt;p&gt;&lt;label for="carro_fabricante"&gt;Carro&lt;/label&gt;&lt;br/&gt;<br />
&lt;%= collection_select(:carro, :fabricante_id, Fabricante.find(:all), :descricao, {:prompt => true}) %&gt;</code></p>
<p>JavascriptGeneratorTemplate</p>
<p>Para que voce possivel utilizar o mínimo de javascript para interações Javascript, foi desenvolvido uma forma de estruturar os arquivos em que a unica linguagem envolvida é o Ruby.</p>
<p>Um exemplo clássico é a pagina de listagem, aonde ao clicar em inserir um novo registro, este aparece na listagem sem que haja refresh na tela. Na prática é incluir uma nova linha na tabela através de operações DOM.</p>
<p>Para quem ja trabalhou com manipulação de objetos DOM em algum elemento HTML (tabela por exemplo) sabe que é preciso um pouco de conhecimento (e código) para que fique do jeito que esperamos. Ja com Rails, o templa RJS faz isso de forma que ele é o arquivo que encapsula a lógica de atualização da interface.</p>
<p>O processo fica assim</p>
<p>Arquivo principal : É a pagina contendo a tabela renderizada.<br />
Arquivo include de linha: O trecho que representa cada linha da tabela é um arquivo de inclusão, que sera utilizado pela pagina principal e pelo script RJS<br />
Arquivo script RJS: O método da controller, ao retornar uma pagina, retorna esse arquivo. Por ser uma chamada assincrona, o resultado do processamento desse arquivo é um codigo Javascript gerado pelo RJS.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/09/05/ruby-on-rails-dia-4/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby On Rails - Dia 3</title>
		<link>http://blog.2solutions.com.br/2008/09/04/ruby-on-rails-dia-3/</link>
		<comments>http://blog.2solutions.com.br/2008/09/04/ruby-on-rails-dia-3/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 00:58:11 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Ruby - Rails</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/09/04/ruby-on-rails-dia-3/</guid>
		<description><![CDATA[Na aula anterior finalizamos a aplicação CRUD. Tomou um certo tempo devido a alguns ajustes de configuração e também porque a cada camada alguns conceitos iam sendo discutidos. Hoje o objetivo foi o estudo aprofundado de ActionRecord e ActionController.
ActionRecord
Existem algumas estratégias para fazer o mapeamento objeto-tabela (ORM), no caso do ActiveRecord uma funcionalidade que o [...]]]></description>
			<content:encoded><![CDATA[<p>Na aula anterior finalizamos a aplicação CRUD. Tomou um certo tempo devido a alguns ajustes de configuração e também porque a cada camada alguns conceitos iam sendo discutidos. Hoje o objetivo foi o estudo aprofundado de ActionRecord e ActionController.</p>
<p><strong>ActionRecord</strong></p>
<p>Existem algumas estratégias para fazer o mapeamento objeto-tabela (ORM), no caso do ActiveRecord uma funcionalidade que o difere de outras implementações (como DAO por exemplo) é o fato de a própria entidade possuir métodos de interação com o banco.  Isso faz com que se diminua o numero de classes e se reaproveite os atributos do objeto.</p>
<p>Mas isso é so uma parte. Como a estrutura da linguagem Ruby é tão flexível, é possível ter definições de método de consulta no próprio objeto como por exemplo :</p>
<p><code>User.find_by_username("login")</code></p>
<p>Inclusive, dizer que o Rails é um framework ORM eu considero meio equivocado, na verdade o Rails não mapeia as colunas para os atributos, ele adiciona nos objetos as colunas. Toda vez que se pede algo para uma classe, o Rails faz um metadados na tabela associada a insere esses atributos dinamicamente no objeto. Assim, se alguem inserir uma nova coluna na tabela, ela automaticamente sera carregada nos objetos.</p>
<p>Isso remete a um outro assunto discutido em sala, Migration.</p>
<p><strong>Migration</strong></p>
<p>Atualizações em tabelas de banco são muitas. Por mais que se faça um trabalho legal de modelagem, invariávelmente temos que criar colunas, refatorar nomes, ajustas associações e por ai vai. Manter essa documentação de atualizações organizada de forma coerente e prática pode demandar uma intereção custoza na equipe de desenvolvimento/banco. Nisso entra o Migration. Com um padrão de nomenclaturas de arquivo e uma facilidade de comandos, é possível versionar os estados das estruturas e trocar facilmente de uma versão para outra. Bem interessante. </p>
<p>Mas isso não tem a ver só com Rails. Isso tem a ver com a organização da manutenção dos dados da empresa. O legal é que como a linguagem utilizada é Ruby e o framework é o Rails, fica muito mais prático, porém poderia ser utilizado para qualquer equipe em qualquer linguagem/plataforma.</p>
<p><strong>Operações Bulk</strong></p>
<p>Operaçoes em massa são aquelas que alteram varios registros ao mesmo tempo, por exemplo :</p>
<p><code>update users set ativo = 1</code></p>
<p>Acessível pelos métodos</p>
<p><code>User.update_all("ativo = 1")<br />
User.destroy_all("ativo = 1")</code></p>
<p><strong>Eventos - Callbacks</strong></p>
<p>Métodos de callbacks são aqueles invocados quando ocorre determinada situação. No rails eles aparecem nos eventos de interação com o banco. São bem simples de criar e utilizar.</p>
<p>Exemplos :</p>
<p><code>class User < ActiveRecord::Base<br />
  before_destroy :manda_email</p>
<p>  def manda_email<br />
    #Manda email para alguém<br />
  end<br />
end<br />
</code></p>
<p><strong>Outros recursos</strong></p>
<p>Para validações ja tem um monte de funções prontas para serem utilizadas, é possível especializar algumas e criar as suas. Muito útil e fácil.</p>
<p><code>validates_inclusion_of :age , :in => 15..99</code></p>
<p>Para os acumuladores (count, sum, minimum, etc) também é bem prático e útil.</p>
<p><code>User.count(:condition => "age > 18")</code></p>
<p>Um assunto que discutimos muito (e eu sempre me emociono) é da parte de transações. Como eles conseguiram deixar tão simples.</p>
<p>User.transaction do<br />
a1.deposit(100)<br />
a2.withdraw(100)<br />
end</p>
<p>Se der exceção é feito rollback senão commit. E a funcionalidade não para ai, se você quiser que os objetos retornem ao estado anterior do bloco de transação é so :</p>
<p>User.transaction(a1,a2) do<br />
a1.deposit(100)<br />
a2.withdraw(100)<br />
end</p>
<p>Mais um recurso, facil de implementar, porém muito inteligente são as colunas timestamps, que se seguirem a convenção de nomes funcionam assim :</p>
<p><em>created_on</em> grava a data/hora ao inserir um novo registro<br />
<em>created_at</em> grava a data ao inserir um novo registro<br />
<em>updated_on</em> grava a data/hora ao atualizar o registro<br />
<em>updated_at</em> grava a data ao atualizar o registro</p>
<p>E por ultimo, um recurso que muita gente nem conhece, Lock otimista (Optimistic Lock). Funciona assim, quando consultamos um registro no banco e abrimos seus dados para edição o registro não fica &#8220;lockado&#8221; para nosso acesso, ele fica disponível para outros fazerem a mesma operação no mesmo registro. Isso ocorre porque em aplicações com muitos usuarios, se houvesse esse lock todos os outros usuarios ficariam esperando o primeiro finalizar, seria a estratégia pessimista, pois ja pensa que se não segurar o registro outro vai na frente e salva antes. Isso pode acontecer, lógico, mas a estratégia implementada é criar uma coluna de versão.<br />
Quando eu consulto um registro, fica a informação da versão que estou editando, se alguem salvar na minha frente vai atualizar a versão, e quando eu for salvar o ambiente de avisa &#8220;Olha, alguem ja salvou antes&#8221;.<br />
Implementar isso leva um certo tempo de desenvolvimento, porém em rails é so voce criar uma coluna com o nome lock_version.</p>
<p>Da parte do ActionRecord foi isso vamos ao ActionController</p>
<p><strong>ActionController</strong></p>
<p>Para quem esta acostumado com frameworks web, esse é o controlador de fluxo. Vantagens do framework Rails é a facilidade de criação (não tem XMLs nem anotações, somente convenções) e inclusão de actions (métodos que recebem requisições).</p>
<p>Todo método criado na classe Controller pode receber requisição, e o legal é que existe um diretorio específico para cada pagina de cada controlador. É mais ou menos o que acontece na realidade, um controlador acaba &#8220;gerenciando&#8221; um grupo de paginas específicas do seu contexto.</p>
<p>O interessante é que acessar a pagina de outro controlador, mudar de pagina para retorno em conteudo texto ou verificar se é uma requisição ajax é facil. É abstraido muitos conceitos da parte de troca de mensagens HTTP.</p>
<p>Exemplos:</p>
<p>Para retornar texto</p>
<p><code>def teste_texto<br />
  s = "Esse é o texto que sera retornado"<br />
  render :text => s<br />
end</code></p>
<p>Para retornar uma pagina do mesmo controller</p>
<p><code>def teste_uma_pagina<br />
   #Faz algumas operacoes<br />
  render :action => 'uma_pagina'<br />
end</code></p>
<p>Para retornar uma pagina com mesmo nome do método</p>
<p><code>def uma_pagina<br />
   #Faz algumas operacoes<br />
end</code></p>
<p>Para retornar uma página de um outro Controller (adivinham ?)</p>
<p><code>def teste_mais_complexo<br />
   #Faz algumas operacoes<br />
  render :controller => 'loja_virtual' , :action => 'outra_pagina'<br />
end</code></p>
<p>Também existem recursos de verificação, como so deixar executar os métodos que forem por post.</p>
<p><code>verify :method  => :post, <img src='http://blog.2solutions.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly => [ :destroy , :create , :update],<br />
          :redirect_to => { :action => :list }<br />
</code><br />
Para configurar os layouts utilizados por esse controler, é so adicionar no inicio do corpo da classe :</p>
<p><code>layout :loja_virtual_usuario</code></p>
<p>Para configurar filtros de requisição :</p>
<p><code>before_filter :valida_usuario<br />
def valida_usuario<br />
  #faz a validacao<br />
end<br />
</code></p>
<p>Existem outros recursos como flash[:notice] para o envio de mensagens com tempo de vida da requisiçao, outra funcionalidade é o render para montar as paginas de resposta, tem tambem o rescue para lançar excessão e depois trata-la. </p>
<p>Tanto o assunto de ActionRecord quanto de ActionController foram muito bem trabalhados no livro. Vale a pena dar uma conferida.</p>
<p>Amanhã tem mais.
</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/09/04/ruby-on-rails-dia-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby On Rails - Dia 2</title>
		<link>http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-2/</link>
		<comments>http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-2/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 01:39:54 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Ruby - Rails</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-2/</guid>
		<description><![CDATA[Uma palavra que resume bem o dia 2 é a seguinte &#8220;atualização&#8221;. Eu não estava trabalhando com Ruby +2.0 e infelizmente, o livro também segue a versão mais antiga. O problema é que houveram algumas atualizações que tomaram um pouco do tempo do treinamento, no entanto, não impactaram no resultado final. Finalizar o aplicativo CRUD.
Bem, [...]]]></description>
			<content:encoded><![CDATA[<p>Uma palavra que resume bem o dia 2 é a seguinte &#8220;atualização&#8221;. Eu não estava trabalhando com Ruby +2.0 e infelizmente, o livro também segue a versão mais antiga. O problema é que houveram algumas atualizações que tomaram um pouco do tempo do treinamento, no entanto, não impactaram no resultado final. Finalizar o aplicativo CRUD.</p>
<p>Bem, vamos detalhar algumas dificuldades encontradas. O inicio do desenvolvimento foi focado na modelagem das entidades (Model). Hoje adicionamos métodos de negocio, como um metodo para criptografar senha. Tudo ia muto bem até a hora de gerar os controllers e views. </p>
<p>O comando utilizado para isso é o scaffolding</p>
<p><code>ruby script/generate scaffolding Car</code></p>
<p>A listagem resultado do comando mostra que tudo foi gerado, no entanto o conteudo das paginas de listagem (index), edicao, novo e visualização não estão com os campos da entidade. Assim tivemos que fazer tudo na mão. Pelo menos serviu para o pessoal dar uma praticada e ir entendendo uma parte da sintaxe dos controllers e views.</p>
<p>Se você não implementou a entidade model, a sintaxe do scaffolding deve ser</p>
<p><code>ruby script/generate scaffold Car model:string year:integer preco:float data_compra:datetime</code></p>
<p>Interessante que agora não é mais gerado as telas com um for pesquisando as colunas e sim, é adicionado os campos diretamente. Isso ajuda pois na realidade ao ajustar as telas o mais comum é retirarmos colunas.</p>
<p>Com o scaffolding executado, a estrutura principal das nossas entidades esta pronto. O que nos resta fazer é irmos as especializando e adicionando outras com funcionalidades não ligadas a uma entidade específica.</p>
<p>Para simularmos essa situação implementamos um requisito de autenticação. Dificilmente você ira participar do desenvolvimento de uma aplicação que não utilize recursos de autenticação (e a maioria ainda precisa de autorização também), e para o treinamento essa funcionalidade tem alguns objetivos didáticos :</p>
<p>1) A interface de login não esta associada a nenhuma entidade e portanto deve ser criada a parte<br />
2) O controlador precisa de método fora do padrão CRUD, como login e logout<br />
3) Na logica de autenticação é preciso criar um metodo que saiba o que fazer com o login/senha, e assim trabalhamos com esses métodos de negócio nas entidades (User). Esse método além de realizar manipulação de banco de dados, tambem trabalha um pouco com a sintaxe da linguagem.<br />
4) No controlador (LoginController) manipulamos dados da sessão<br />
5) No controlador manipulamos dados no flash[:notice], especifico para armazenar dados durante uma requisição<br />
6) O redirecionamento das paginas (login com sucesso ou nao)</p>
<p>E tivemos tempo de trabalhar um pouco com filtros. É um assunto com uma leve carga conceitual, porém com uma implementação muito simples.</p>
<p>Resumindo nossos trabalhos, podemos destacar uma revisão em conceitos de OO, pratica na linguagem Ruby, os geradores de codigo script/generate e algumas funcionalidades interessantes como sessao, flash e filtros.</p>
<p>Um outro recurso interessante é para quem não gosta de geradores de código (eu). Ao invés de deixar os controladores gerados pelo scaffolding com todas as assinaturas de métodos, adicione a linha no corpo da sua classe :</p>
<p><code>scaffold :car</code></p>
<p>Assim seu controller &#8220;ganha&#8221; as funcionalidades CRUD padrão, e o numero de linhas de código cai mais ainda.</p>
<p>Observação : Em alguns projetos Java que eu trabalho nós criamos Actions (strus2) genéricas com Jsp genéricos também, assim, para situações em que o CRUD nao precisa de nenhuma especialização não é preciso codificar as telas.</p>
<p>Nos próximos dias vamos aprofundar o assunto em cada tópico.</p>
<p>Até amanhã
</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby On Rails - Dia 1</title>
		<link>http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-1/</link>
		<comments>http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-1/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 13:09:49 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Ruby - Rails</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-1/</guid>
		<description><![CDATA[Para servir de repositorio de dados do conteudo passado no treinamento Ruby On Rails em Sao Luiz - MA eu resolvi criar um post especifico de cada dia de treinamento. O treinamento é baseado no livro do Fabio Akita, que além de ter uma ordem cronológica didática, também tem exemplos práticos. Cada aluno tem seu [...]]]></description>
			<content:encoded><![CDATA[<p>Para servir de repositorio de dados do conteudo passado no treinamento Ruby On Rails em Sao Luiz - MA eu resolvi criar um post especifico de cada dia de treinamento. O treinamento é baseado no livro do Fabio Akita, que além de ter uma ordem cronológica didática, também tem exemplos práticos. Cada aluno tem seu exemplar do livro para acopanhamento. Vou aproveitar para detalhar o que levantamentos de util nas aulas pois pode ser útil para mais alguém.</p>
<p>No inicio do treinamento ja discutimos sobre a necessidade de alguns conceitos fundamentais para um melhor aproveitamento do treinamento.</p>
<p>Em primeiro lugar, para mergulhar de cabeça em Ruby On Rails, você TEM que ter alguns pré-requisitos :</p>
<p>1) conceitos de modelagem de dados : Não precisa ser expert em nenhum banco, no entanto, saber criar tabelas e relacionamentos é fundamental.<br />
2) conceito de orientação a objetos : Muitos recursos do Ruby e do Rails exigem que o desenvolvedor entenda bem de classes e objetos. Se você enxerga classes apenas como o mal necessário para criar objetos, acho melhor voce dar uma estuda nestes conceitos. De uma revisada em polimorfismo, herança e encapsulamento (pilares da OO).<br />
3) Familiaridade com ambiente web : O foco do treinamento é em um framework web, e por tanto, você deve ter noção de como funciona aplicações web. Servidor web, provendo paginas estáticas ou dinâmicas, processando requisições de clientes, request, response, sessão e conceitos de segurança ajudam.<br />
Atende os requisitos ? Então vamos la.</p>
<p><strong>Ambiente</strong></p>
<p>Ruby é uma linguagem interpretada, e por tanto você precisa do interpretador. Acessa o site http://www.ruby-lang.org e baixa o binario para o seu sistema operacional. Vai vir muito mais coisa que o interpretador, com destaque para o &#8220;ri&#8221; (consultar a documentação das classes) e &#8220;rdoc&#8221; para gerar documentação</p>
<p>Se for tudo no Next >> Next >> Finish sera criado um diretorio Ruby e o sub-diretorio Bin ja vai estar configurado no path.</p>
<p>Abra o console (prompt) e execute &#8220;ruby&#8221; de qualquer diretorio. Assim ja validamos se a instalação foi executada com sucesso.</p>
<p>Bem, o Ruby é muito legal e eu recomendo uma leitura mais avançada na linguagem, no entanto, para nosso treinamento as coisas vão sendo passadas sob demanda. Por tanto  vamos ao Rails.</p>
<p><code><br />
gem update --system<br />
gem install rails --include-dependencies<br />
</code></p>
<p>A instalação de pacotes adicionais é feita utilizando esse gerenciador &#8220;gem&#8221;</p>
<p><strong>Começando meu projeto</strong></p>
<p>Depois de instalado é hora de criarmos o nosso projeto:</p>
<p><code>rails meuprojeto</code></p>
<p>Todos os diretorios do projeto são criados e cada um tem a sua função específica.</p>
<p>Vamos iniciar configurando o acesso ao banco de dados.</p>
<p>Seguimos o wiki do Rails para configurar o acesso ao SQL Server</p>
<p><a href="http://wiki.rubyonrails.org/rails/pages/HowtoConnectToMicrosoftSQLServer">http://wiki.rubyonrails.org/rails/pages/HowtoConnectToMicrosoftSQLServer</a></p>
<p>Essa atividade foi mais demorada, pois tivemos que pesquisar esse driver e seguir o tutorial. Fizemos o teste ja executando um comando do rake para fazer a carga no banco com as nossas tabelas.</p>
<p>rake db:schema:load</p>
<p>começamos a construção das nossas entidades (model)</p>
<p><code><br />
ruby script/generate model User<br />
ruby script/generate model Task<br />
</code></p>
<p>e interagimos com o banco de dados através do ambiente de execução do Rails</p>
<p><code>ruby script/console</code></p>
<p>Exemplos </p>
<p><code><br />
u = User.new<br />
u.username = "teste"<br />
u.full_name = "Teste de usuario"<br />
u.hashed_password = "12313"<br />
u.save<br />
</code></p>
<p>Com a parte de integração com o SQL Server funcionando, fechamos a parte de preparação do ambiente. Uma duvida que surgiu foi referente a documentação.</p>
<p>Para visualizar a documentação de uma classe podemos utilizar o ri.</p>
<p>Exemplo :</p>
<p><code>ri String</code></p>
<p>ou, especificando o método</p>
<p><code>ri String#upcase</code></p>
<p>Mas quando existe mais de um metodo com essa assinatura significa que o Ri esta encontrando essa classe#metodo em mais de uma fonte de documentacao.<br />
Nesses casos você precisa especificar qual documentação deve ser pesquisada.</p>
<p>Exemplo :</p>
<p><code>ri --system String#upcase</code></p>
<p>As opções disponíveis são :</p>
<p><em>By default ri searches for documentation in the following<br />
directories:</p>
<p>    c:/ruby/share/ri/1.8/system<br />
    c:/ruby/share/ri/1.8/site<br />
    C:\Users\hfurlan/.rdoc<br />
    c:/ruby/lib/ruby/gems/1.8/doc/*/ri</p>
<p>Specifying the &#8211;system, &#8211;site, &#8211;home, &#8211;gems or &#8211;doc-dir<br />
options will limit ri to searching only the specified<br />
directories.</em></p>
<p>Do primeiro dia foi (resumidamente) isso.</p>
<p>Amanhã tem mais.
</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2008/09/02/ruby-on-rails-dia-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>High-Tech e High-Touch</title>
		<link>http://blog.2solutions.com.br/2007/08/11/high-tech-e-high-touch/</link>
		<comments>http://blog.2solutions.com.br/2007/08/11/high-tech-e-high-touch/#comments</comments>
		<pubDate>Sat, 11 Aug 2007 12:06:00 +0000</pubDate>
		<dc:creator>Hildebrando</dc:creator>
		
		<category>Desenvolvimento de Software</category>

		<guid isPermaLink="false">http://blog.2solutions.com.br/2007/08/11/high-tech-e-high-touch/</guid>
		<description><![CDATA[Se você é da área de tecnologia (ou não) ja deve ter ouvido a palavra High-Tech associada a um computador, acessório, veículo ou midia. A tradução fiel para este termo é algo altamente tecnológico. 
Já a palavra High-touch significa algo altamente assessorado, com uma atenção e atendimento especial. Por exemplo, se uma pessoa te faz [...]]]></description>
			<content:encoded><![CDATA[<p>Se você é da área de tecnologia (ou não) ja deve ter ouvido a palavra High-Tech associada a um computador, acessório, veículo ou midia. A tradução fiel para este termo é algo altamente tecnológico. </p>
<p>Já a palavra High-touch significa algo altamente assessorado, com uma atenção e atendimento especial. Por exemplo, se uma pessoa te faz uma visita é uma interação high-touch pois você esta em contato direto com o individuo.</p>
<p>Agora, o que as palavras têm em comum além do &#8220;High&#8221; ?</p>
<p>Levando para o campo do desenvolvimento de software a ideia é que, em algumas situções, você precisa desenvolver algo extremamente high-tech, ou seja, utilizar dos mais avançados recurso para possibilitar o &#8220;high-touch&#8221;. Imagine um aplicação de Broker (compra e venda de ações) em que a utilização de alta tecnologia é indiscutível dado o numero de integrações, a robustes, a escalabilidade e a disponibilidade do serviço, porém os canais de suporte são falhos quanto ao &#8220;touch&#8221;. Como suporte demorado, atendimento somente via ferramentas de abertura de chamados e telefones burocráticos. Aplicar o &#8220;high-touch&#8221; é essencial e de implantação não tão complicada :</p>
<p>Destacando duas aplicaçoes interessantes de &#8220;High-touch&#8221; em sistemas :</p>
<p>1 - Disponibilizar ferramentas de chat online além dos tradicionais canais de telefones. Um chat tem uma linguagem mais informal e mais direta. O usuario consegue detalhar algumas informações ou mesmo ter agilidade para ter uma pergunta respondida. Por ser um aplicativo este pode ser desenvolvido para encontrar um atendente para determinado perfil, armazenar o historico da conversa, suporta o usuario copiar/colar mensagens do sistema.</p>
<p>2 - Acompanhar as ações do usuario (movimento do mouse, digitação, cliques, etc) , através da utilização de ferramentas de acesso remoto. </p>
<p>a) <a href="http://www.realvnc.com/">VNC</a>. É um dos softwares mais famosos do segmento, em que a unica necessidade é o usuario a ser acessado instalar o VNC server. Para acessar um computador o atendente utiliza o VNC client.</p>
<p>b) Remote Desktop Connection é um aplicativo nativo do Windows XP. Quem for acessar precisa apenas digitar o IP do usuario que ja consegue acesso direto. Neste caso não é necessário instalar nenhum aplicativo.</p>
<p>c) <a href="http://www.logmein.com">LogMeIn</a> que, diferente dos outros, não obriga o usuario a possuir um IP quente (IP válido), podendo ser utilizado dentro de uma rede interna. Tambem necessita da instalação de um programa na estação a ser gerenciada remotamente.</p>
<p>Todos eles exigem senhas de autenticação para garantir a segurança no acesso.
</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.2solutions.com.br/2007/08/11/high-tech-e-high-touch/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
