<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>AmapaOnRails</title>
	<atom:link href="http://www.amapaonrails.org/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.amapaonrails.org</link>
	<description>Elevando a cultura do Norte!</description>
	<pubDate>Thu, 16 Jul 2009 19:29:26 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Flexigrid with rubyOnRails</title>
		<link>http://www.amapaonrails.org/?p=99</link>
		<comments>http://www.amapaonrails.org/?p=99#comments</comments>
		<pubDate>Thu, 16 Jul 2009 19:27:15 +0000</pubDate>
		<dc:creator>vinicius</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=99</guid>
		<description><![CDATA[Flexigrid é um incrível projeto Javascript que
fornece funções em Ajax para aplicações Web. Esse projeto
foi usado na construção do plugin Vl_Flexigrid de forma a
possibilita que você possa usar de maneira mais simples a
datagrid Flexigrid em seus projeto RubyOnRails com apenas
algumas poucas linhas de código.]]></description>
			<content:encoded><![CDATA[<p>Pessoal publiquei o plugin <a href="http://viniciusluizz.wordpress.com/2009/07/16/adicionar-datagrids-flexigrid-as-suas-aplicacoes-rails-parte-i/#comments" target="blank">VL_Flexigrid</a> (baseado no componente <a href="http://www.flexigrid.info/" target="blank">Flexigrid</a>) no meu blog por isso to divulgando aqui no amapaOnRails.</p>
<p>Esse é o primeiro de três possíveis artigos usando o mesmo plugin, esporo que gostem.</p>
<p>att,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=99</wfw:commentRss>
		</item>
		<item>
		<title>O que fazer no ubuntu quando a porta do mogrel ficar ocupada?</title>
		<link>http://www.amapaonrails.org/?p=94</link>
		<comments>http://www.amapaonrails.org/?p=94#comments</comments>
		<pubDate>Fri, 21 Nov 2008 22:09:49 +0000</pubDate>
		<dc:creator>vinicius</dc:creator>
		
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=94</guid>
		<description><![CDATA[Olha so pessoal, isso parece besteira mas tem muita gente que reinicia o computador sempre que aparece uma mensagem assim &#8220;RoR TCPServer Error: Address already in use - bind(2)&#8221; ao tentar estartar o mogrel.
Bom, seus problemas terminaram. Faca o seguinte, primeiramente voce precisa descobrir quem e o programa que esta ocupando a porta do seu [...]]]></description>
			<content:encoded><![CDATA[<p>Olha so pessoal, isso parece besteira mas tem muita gente que reinicia o computador sempre que aparece uma mensagem assim &#8220;RoR TCPServer Error: Address already in use - bind(2)&#8221; ao tentar estartar o mogrel.</p>
<p>Bom, seus problemas terminaram. Faca o seguinte, primeiramente voce precisa descobrir quem e o programa que esta ocupando a porta do seu servidor, por isso digite o seguinte comando em um terminal</p>
<p>lsof|grep 3000</p>
<p>dai vai aparecer algo mais ou menos assim</p>
<p><span class="puntext">ruby   5303  vinicius  5u  IPv4</span></p>
<p>beleza, o que interessa e a numeracao apos nome ruby. Vamos derrubar esse processo digitando o seguinte</p>
<p>kill -9 <span class="puntext">5303</span></p>
<p>note que estou usando a mesma numeracao do processo por isso ele sera eliminado da lista. Agora voce podera rodar normalmente seu server sem nenhum problema.</p>
<p>att,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=94</wfw:commentRss>
		</item>
		<item>
		<title>Um pouco de Ruby e Rails</title>
		<link>http://www.amapaonrails.org/?p=81</link>
		<comments>http://www.amapaonrails.org/?p=81#comments</comments>
		<pubDate>Tue, 18 Nov 2008 13:20:22 +0000</pubDate>
		<dc:creator>vinicius</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[RoR]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=81</guid>
		<description><![CDATA[Olá pessoal, essa é minha primeira participação dentro da comunidade Ruby por isso preparei esse material pra quem ta iniciando. Sei que deve ter coisas assim aos montes mas essa é do Amapá por isso sinto me orgulhoso poder contribuir com ele....]]></description>
			<content:encoded><![CDATA[<p><!--[if gte mso 9]&gt;  Normal 0 21   false false false        MicrosoftInternetExplorer4  &lt;![endif]--><!--[if gte mso 9]&gt;   &lt;![endif]--><!--[if gte mso 9]&gt;  Normal 0 21   false false false        MicrosoftInternetExplorer4  &lt;![endif]--><!--[if gte mso 9]&gt;   &lt;![endif]--> Olá pessoal, meu nome é Vinícius Luiz e essa é minha primeira participação dentro da comunidade Ruby. Resolvi montar esse material por que é a forma que tenho de fixar melhor o que to aprendendo. Comecei a poucos o estudo de Ruby e de Rails, esse pouco gostaria de compartilhar com mais alguém então por que não com todos? Nesse artigo não vou me aprofundar em uma aplicação Rails até por que não disponho de tanto conhecimento assim. Vou falar um pouco sobre RoR, sua instalação, atualização e, logicamente, falarei um pouco sobre Ruby (nessa ordem). Serei bastante direto e meus exemplos serão para Windows e Linux, por isso.</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong><span style="14pt;">O que é RoR? </span></strong></p>
<p class="MsoNormal">
<p class="MsoNormal">RoR é um acrônimo para RubyOnRails, ta certo?. Esse, na realidade, é um poderoso framework open-source de desenvolvimento web criado para construir, de forma muito rápida, aplicações web de alta qualidade. É bastante simples de instalar, seu único pré-requisito é o próprio Ruby instalado e configurado na máquina local, ai o resto é resto.</p>
<p class="MsoNormal">Como disse, o RoR precisa do Ruby por isso, pra inicio de conversa vamos instalar o Ruby que é uma linguagem de programação assim como java, dotnet, python, etc&#8230; Se você for usuário Microsoft, abaixo tem um link pra baixar um instalador da linguagem Ruby, o one-click install, no windows. Nele não existe segredo, é só ir pressionando próximo até aparece o fechar e pronto “Ruby funcionando!”.</p>
<p class="MsoNormal">
<p class="MsoNormal"><a href="http://rubyinstaller.rubyforge.org/wiki/wiki.pl">http://rubyinstaller.rubyforge.org/wiki/wiki.pl</a></p>
<p class="MsoNormal">
<p class="MsoNormal">Para facilitar o entendimento desse micro-artigo, vou trabalhar com o windows XP e a distribuição Ubuntu do Linux. Os exemplos serão mostrados em ambos os sistemas operacionais, até por que uso ambos.</p>
<p class="MsoNormal">
<p class="MsoNormal">Continuando, pra quem usa linux a instalação do Ruby é meio diferente, mesmo assim, sem mistério. Como disse, eu uso Ubuntu, mas acredito que seja o mesmo para as demais distribuições por isso, faça o seguinte. Abra um terminal e digite:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>sudo apt-get install ruby</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Esse comando instala e configura o Ruby como se fosse o one-click install do windows, muito fácil ne mesmo?.</p>
<p class="MsoNormal">
<p class="MsoNormal">Agora que temos o Ruby instalado, basta fazer o mesmo com o Rails por isso vamos da seguinte maneira. Novamente, será exibido os passos para Ubuntu e posteriormente Windows, digite no terminal os comandos seguintes:</p>
<p class="MsoNormal">
<p class="MsoNormal">[Linux Ubuntu]</p>
<p class="MsoNormal"><strong>sudo gem install rails -y<span lang="EN-US"><br />
sudo gem install sqlite3-ruby<br />
sudo apt-get install libopenssl-ruby1.8 </span></strong></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">[Windows XP]</span></p>
<p class="MsoNormal"><strong><span lang="EN-US">gem install rails -y<br />
gem install sqlite3-ruby</span></strong></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal">Aguarde um tempinho (não se preocupe caso aparente que o comando não respondeu ou esta demorando um pouco, o sistema esta catalogando todas as dependências necessárias para o download, terminando, será exibidos a listagem com o que ta sendo instalado) e pronto. Muito complicado né mesmo? O primeiro comando instala o RoR com todas as suas dependências (pra isso o <strong>–y, </strong>em futuras versões do Ruby esse parâmetro não será necessário<strong>)</strong>. O segundo comando instala um adaptador que vai possibilitar nossa aplicação conversar com um banco sqlite3 (é possível baixar o adaptador sem o banco está instalado, mas o sistema só vai rodar se encontrar o banco por isso instale-o também). O último comando só vale pra Linux, ele vai instalar a biblioteca openssl usada pelo mongrel para iniciar o serviço, quando não tem, da pau.</p>
<p class="MsoNormal">
<p class="MsoNormal">DICA: Se você usa proxy pra acessar a internet, no Windows precisa configurar uma variável para que o RubyGems possa baixar as gems. Faça o seguinte:</p>
<p class="MsoNormal">
<p class="MsoNormal" style="18pt;">a) acesse as propriedades de <strong>meu computador</strong>;<br />
b) depois <strong>avançado&gt;variáveis de ambiente</strong>;<br />
c) nela você vai criar uma variável chamada <strong>HTTP_PROXY</strong> e o valor dela devera ser h<strong>ttp://&lt;ip_proxy&gt;:&lt;porta_proxy&gt;</strong></p>
<p class="MsoNormal" style="18pt;">d) abra novamente o terminal para que a modificação tenha efeito e pronto.</p>
<p class="MsoNormal">
<p class="MsoNormal">Continuando, vamos testar nosso ambiente. Uma forma bastante simples e pratica de fazer isso, por sinal muito parecida com a do java (javac), é digitando no terminal:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>ruby -v<br />
rails -v</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Tanto pra Windows quanto Linux. O primeiro comando informa a versão do Ruby que esta instalada. O segundo informa a versão do Rails que foi baixada. Os dois comandos respondendo direitinho prova que ta tudo certinho com nossos passos até então (qual quer problema reveja os passos novamente).</p>
<p class="MsoNormal">
<p class="MsoNormal">Bom, como já temos os dois prontos, podemos fazer um teste mais rigoroso criando uma aplicação de demonstração para ver a coisa no vera mesmo.</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong><span style="14pt;">Criando um Demo em Rails</span></strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Antes de tudo, você que usa Windows precisa realizar mais um passo chato configurando o Ruby na variável Path do sistema. Acesse as propriedades de <strong>Meu Computador, avançado&gt;variáveis de ambiente </strong>e acrescente a seguinte instrução dentro da variável path.</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>C:\ruby\bin</strong></p>
<p class="MsoNormal">O endereço tem de ser o da instalação do Ruby, coloque a unidade C: por que é o padrão da instalação. Após isso, feche o terminal para que ele re-carregue todas as configurações e pronto.</p>
<p class="MsoNormal">
<p class="MsoNormal">Crie em algum lugar uma pasta para centralizar seus projetos (isso não é um pré-requisito, mas deixa seu ambiente de trabalho mais organizado). Abra novamente o terminal de comandos (se você ainda estiver com o terminal anterior aberto, poderá usá-lo), por ele acesse a pasta de projetos Rails recém criada e digite:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>rails Demo</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Rails é o comando que vai criar sua aplicação, ele pede somente um parâmetro que é justo o nome do aplicativo. Esse comando instrui o Rails a criar um sistema web, note que ele não cria uma estrutura vazia. Isso acontece por que Rails segue uma serie de convenções para facilitar a vida de quem vai produzir sistemas. Uma dessas convenções é justamente a padronização do ambiente da aplicação por pastas especificas que ele próprio (RoR) se encarrega de gerenciar. Logicamente, você tem livre arbítrio para seguir suas próprias convenções e não as dele (RoR), só fique ciente que esse será um trabalho a mais que terá e você precisara gerenciar isso. Agora podemos acessar o demo e iniciar nosso primeiro sistema web digitando (a partir da pasta do projeto):</p>
<p class="MsoNormal">
<p class="MsoNormal">[Linux Ubuntu]<br />
<strong><span lang="EN-US">script/server </span></strong></p>
<p class="MsoNormal">
<p class="MsoNormal">[Windows XP]<br />
<strong><span lang="EN-US">ruby script/server </span></strong></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal">Note que em um ambiente Windows, precisamos referenciar a variável de sistema Ruby. Agora vamos aponte o browse para o seguinte endereço:</p>
<p class="MsoNormal"><strong> </strong></p>
<p class="MsoNormal"><strong>http://localhost:3000</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Se tudo correr direitinho, será exibido a pagina de boas vindas do projeto.</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong><span style="14pt;">Como faço para atualizar meus projetos RoR?</span></strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Em vista de tudo pronto e funcionando, é bastante comum que você (programador) queira sempre esta com a versão mais atual de seu framework preferido. Com RoR não é diferente, mas existe uma condição para que isso ocorra. Alguns recursos do Ruby precisam se encontrar atualizados, por exemplo, RoR é instalado a partir de um gerenciador de pacotes do Ruby chamado RubyGems, ele se encarrega de verificar e baixar todas as dependências do RoR incluindo RDoc e, por ai vai. RubyGems é um recurso do Ruby muito usado, por isso sempre é bom da uma atualizada nele até por que versões mais recentes dos pacotes gems sempre irão pedir a versão mais atual do RubyGems e isso inclui RoR. A boa notícia é que fica fácil atualizar seus recursos depois RubyGems está pronto pra isso, basta certificar-se de que o sistema será atualizado corretamente a partir dos comandos:</p>
<p class="MsoNormal">
<p class="MsoNormal">[Linux Ubuntu]<br />
<strong><span lang="EN-US">sudo gem update<span> </span>&#8211;system<br />
sudo gem install rails<br />
</span>sudo gem update rake<br />
sudo gem update sqlite3-ruby</strong></p>
<p class="MsoNormal"><strong> </strong></p>
<p class="MsoNormal">[Windwos XP]<br />
<strong><span lang="EN-US">gem update &#8211;system<br />
</span></strong><strong><span lang="EN-US">gem install rails<br />
</span></strong><strong><span lang="EN-US">gem update rake<br />
</span>gem update sqlite3-ruby</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Novamente, tanto Linux quanto Windows. O primeiro comando atualiza o próprio sistema RubyGems (que é exigido pela versão mais recente do RoR) como já mencionado. O segundo comando instala Rails mais recente com todos os novos recursos. O terceiro comando atualiza a ferramenta Rake (um construtor de aplicações Ruby similar ao make do Linux). Por fim, o último comando vai atualizar o adaptador sqlite3 que foi instalado (você pode ter vários adaptadores, um para cada banco preferido seu).</p>
<p class="MsoNormal">Novamente, a execução dos comandos pode levar um tempinho para ser concluído, não se preocupe caso não aparece nenhum texto de imediato. Quando estiver finalizado, você poderá listar todas as gems instaladas usando o comando:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>gem list</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Esse é um comando do Ruby por isso pode ser rodado a qualquer instante. Existe um outro que possibilita você ler a documentação de todas as gems instaladas:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>gem server</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Executando essa instrução acima, você estará iniciando um servidor web na porta 8808 que dará acesso à documentação das gems de instaladas. Você verá uma lista des gems com links para o RDoc web e uma breve descrição da gem. O endereço para o server é:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>http://localhost:8808/</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Depois que estiver com a versão mais recente de RoR, pode acontecer que algumas de suas aplicações não funcionem. Esse é um problema muito simples de resolver por tanto faça o seguinte:</p>
<p class="MsoNormal" style="-18pt;"><!--[if !supportLists]--><span>a)<span style="none;"> </span></span><!--[endif]-->Acesse a arquivo <strong>config/environment.rb</strong> de sua aplicação;</p>
<p class="MsoNormal" style="-18pt;"><!--[if !supportLists]--><span>b)<span style="none;"> </span></span><!--[endif]-->Altera o valor da variável <strong>RAILS_GEM_VERSION</strong> para a nova versão do RoR que você quer usar, tipo: de RAILS_GEM_VERSION = &#8216;2.0.0&#8242; para RAILS_GEM_VERSION = &#8216;2.1.2’.</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong><span style="14pt;">O Ruby!</span></strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Até esse momento vimos um pouco sobre RoR. Nada muito detalhado, mas com algumas informações fundamentas pra quem ta iniciando. RubyOnRails é um Framework muito poderoso que não seria capaz de fazer o que faz se não fosse a linguagem de programação <span> </span>Ruby. Ruby é uma linguagem tão boa que hoje já temos empresas grandes como a Sun investindo nela. Existe até um projeto pouco conhecido chamado JRuby (eu disse pouco?) que vem tomando espaço de uns outros menos barulhentos mas muito legais como o Groovy (pra quem quiser saber mais, abaixo segue um post com 33 pontos de comparação para essas linguagens), detalhe, não estamos aqui para falar disso por isso deixaremos esses discurções para quem sabe mais do assunto por tanto.</p>
<p class="MsoNormal">
<p class="MsoNormal"><a href="http://www.javafree.org/news/view.jf?idNew=3118">http://www.javafree.org/news/view.jf?idNew=3118</a></p>
<p class="MsoNormal">
<p class="MsoNormal">Quando instalamos o Ruby no computador para testar o RoR, junto com ele foi instalado um programinha muito bom para se testar código, o <strong>irb</strong> (interactive Ruby shell), que nos possibilita chama-lo e já ir colocando códigos e testando. Nada muito complexo, excelente pra quem ta iniciando assim como eu. Agora, antes de tudo, vamos fazer algumas modificações no ambiente para facilitar e dar um pouco mais de agilidade as nossas vidas (essa configuração só se aplica ao Linux pos não sei como fazer isso no Windows, mas quem souber e quiser contribuir, sinta-se a vontade para postar aqui).</p>
<p class="MsoNormal">
<p class="MsoNormal">Acesse o diretório de seu usuário na pasta /home/, por exemplo:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>/home/vinicius/</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Dentro digite:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>sudo gedit .irbrc</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Será exibido um documento em branco, nele acrescente a linha:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>require ‘irb/completion’</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Ok, a partir de agora seu irb possui suporte para auto-complemento<strong> </strong>usando a tecla de atalho tab, mas isso ainda não esta funcionando pos falta um passo a ser seguido. Procure a pasta onde o Ruby foi instalando, no meu pc ela fica em /etc/lib/ruby. Pelo terminal, a partir dela faço o seguinte, localizo a pasta 1.8.2 que possui os arquivos rb depois digito o comando:</p>
<p class="MsoNormal">
<p class="MsoNormal">Rdoc *.rb</p>
<p class="MsoNormal">
<p class="MsoNormal">Esse comando vai gera a documentação do Core do Ruby a partir dos arquivos rb. Após essa trabalheira toda, agora sim poderemos utilizar o irb com recursos de auto-complemento. Vamos fazer só um teste rápido pra validar o que fizemos, acesse o terminal e digite:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>irb</strong></p>
<p class="MsoNormal"><strong>String</strong><strong><span style="16pt;">.</span>&lt;PRECIONE_TAB&gt;</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">A instruição irb vai iniciar a execução do programa IRB. Quando, nele, digitamos o nome de uma classe do Ruby e chamamos o método methods da classe, é exibo um array contendo todos os métodos dessa classe. Se os passos feitos antes do inicio do irb funcionaram, nós poderemos escrever, por exemplo, o nome de uma classe qualquer mais o ponto e pressione o TAB duas vezes (bem como o exemplo acima) que os métodos serão exibidos lado a lado na tela.</p>
<p class="MsoNormal">
<p class="MsoNormal">Beleza, tudo certo para nosso pequeno Tour? Vamos esquecer um pouquinho o que vimos em RoR e nos focarmos no Ruby por isso, antes de mais nada, é preciso entender que em Ruby tudo é um objeto e quando eu falo tudo me refiro a tudo mesmo (ta bom, tem algumas exceções que fogem a regra tipo variável, mixin e blocos) por isso, qualquer coisa que se faça esta sendo feito em um objeto. Por exemplo, vamos criar um método e uma classe, hum!! Como criar um método e uma classe?</p>
<p class="MsoNormal">Como disse, o IRB é um ambiente de teste que possibilita testar tudo o que vem na cabeça por isso uma definição de método tipo:</p>
<p class="MsoNormal">
<p class="MsoNormal">def meu_nome<br />
puts &#8220;vinicius luiz&#8221;<br />
end</p>
<p class="MsoNormal">
<p class="MsoNormal">ou uma declaração de classe tipo:</p>
<p class="MsoNormal">
<p class="MsoNormal">class Teste1</p>
<p class="MsoNormal">end</p>
<p class="MsoNormal">
<p class="MsoNormal">São coisas totalmente aceitas dentro dele. Não se preocupe em “onde que ele ta pondo essas coisas” ou “quando vai precisar compilar”. Ruby é uma linguagem totalmente dinâmica por isso o que você escrever no IRB já estará pronto para uso.</p>
<p class="MsoNormal">
<p class="MsoNormal">Agora que temos uma definição de método e uma declaração de classe, vamos ilustrar so mais um pouquinho e não se preocupe se o que vir for meio estranho. Como disse, em Ruby tudo é muito simples inclusive declarações de classe. Class em si é um objeto por isso podemos criar outras classes da seguinte maneira (esse é um modo muito diferente do convencional):</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>Teste2 = Class.new</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Isso não é um bicho de sete cabeças pra se entender correto? O que fizemos foi simplesmente criar uma classe nova instanciando ela do objeto Class, simples não?</p>
<p class="MsoNormal">Agora, temos um método que vai imprimir uma string &#8220;vinicius luiz&#8221; quando for chamado no irb. Como o irb e um objeto Object, o que estamos fazendo na realidade é uma chamada em Object, exemplo (agora segue uma lista):</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>meu_nome<br />
</strong><strong>self.meu_nome<br />
Object.meu_nome</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Note a primeira chamada não é mais segredo já a segunda e a terceira! Como você percebeu, o método criado na realidade foi enfiado (sutil não?) no objeto Object e como IRB herda Object, também acessa esse mesmo método novo. Até o momento não vimos nada complicado, mas temos uma terceira forma de se chamar essa mesma função, digite:</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>Kernel.meu_nome</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Kernel? Mas quem e esse Kernel afinal? Calma, eu explico! Kernel é um modulo que pega os dados postos no IRB e coloca em Object. Qualquer método que esteja sendo criado no IRB (na realidade em qualquer lugar no ruby) ficara acessível através do contexto de qualquer classe, do Kernel ou de Object, deu pra entender isso? Humm, pêra ae! Eu disse qualquer classe?</p>
<p class="MsoNormal">
<p class="MsoNormal">Ta lembrado das classes criadas no inicio, agora é à hora de usá-las, vamos fazer o seguinte:</p>
<p class="MsoNormal"><strong> </strong></p>
<p class="MsoNormal"><strong>Teste1.meu_nome<br />
Teste2.meu_nome</strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Antes de prosseguir, permita me fazer uma pergunta. “Quem nasceu primeiro, o ovo ou a galinha?”, ehhh, to brincando. Bom, continuando.</p>
<p class="MsoNormal">
<p class="MsoNormal">Como toda classe por padrão herda de um Objeto expecifico (e já estamos cansados de saber disso), em Ruby não é diferente por isso nossas classes também, visto que herdam do objeto Object, terão acesso à função meu_nome.</p>
<p class="MsoNormal">
<p class="MsoNormal">Como deu pra ver, tudo em Ruby é um objeto incluindo qualquer coisa pôs métodos, variareis, etc. definidos em qualquer lugar não são coisas dispersas em um espaço estático e acessível sem vinculação com nada. Tudo que for definido será inserido em Object que por sua vez deriva pro o IRB, pro Kernel e pra qualquer outro objeto.</p>
<p class="MsoNormal">
<p class="MsoNormal">Acho que da pra dizer que o Kernel no ruby seria como o java.lang do java (corrijam me se estiver errado). Uma biblioteca importada por padrão, com métodos acessíveis sem a necessidade de informar o nome de sua classe.</p>
<p class="MsoNormal">
<p class="MsoNormal"><strong><span style="14pt;">Conclusão</span></strong></p>
<p class="MsoNormal">
<p class="MsoNormal">Bom pessoal, falei um pouco de RoR, sua instalação, atualização e algumas outras pequenas configurações que existem pra serem feitas nos diferentes ambientes testados. Acho que não teve muita coisa nova pos o que mostrei já deve ta mais que batido.</p>
<p class="MsoNormal">Pode acontecer deu ter me equivocado? Pode sim, sem nenhum problema por isso me corrigirem se for o caso pos como disse no inicio, esse material foi pra fixar mais as idéias.</p>
<p class="MsoNormal">
<p class="MsoNormal">Estudem Ruby, não se prendam somente em RoR, RoR, RoR. É um bom framework? Sim, com toda certeza um dos melhores, mas Ruby a meu ver é muito mais essencial pra quem ta iniciando. Existem materiais excelentes na internet, quem poder e quiser baixar, eles estão ai aos milhares por isso, colocarei só um aqui pra vocês.</p>
<p><span style="&quot;Times New Roman&quot;;"><a href="http://rapidlibrary.com/index.php?q=ruby+way">http://rapidlibrary.com/index.php?q=ruby+way</a></span></p>
<p class="MsoNormal">
<p class="MsoNormal">Existem alguns livros nacionais muito legais como “Ruby: desvendando a linguagem” (esse particularmente eu aconselho) e outros mais. Agora, quem quiser postar alguma coisa, sou todo ouvidos hehehehe.</p>
<p class="MsoNormal"><span> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=81</wfw:commentRss>
		</item>
		<item>
		<title>Cresce a Comunidade Amapaense de RubyonRails!</title>
		<link>http://www.amapaonrails.org/?p=79</link>
		<comments>http://www.amapaonrails.org/?p=79#comments</comments>
		<pubDate>Mon, 03 Nov 2008 15:13:26 +0000</pubDate>
		<dc:creator>isaacguerra</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=79</guid>
		<description><![CDATA[E a linguagem Ruby vem cativando mais programadores no Amapá, agora o time cresce com o Pessoal da InovaSoft.
No sábado dia 1/11/2008, fizemos uma reunião e divilgação da Comunidade AmapáOnRails na sede da InovaSoft, onde estavam os programadores Vinicius, Anderson, Huan, Veronica, Robson.
Falamos um pouco sobre programação e outros assuntos legais, vimos o Ruby fazendo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin: 0px;" src="http://images.google.com.br/url?q=http://www.amapaonrails.org/wp-content/uploads/2008/08/logoamapaonrails.jpe&amp;usg=AFQjCNFnYN3Lks96fnUBKPOEi2-UoCoa5g" alt="" width="102" height="134" />E a linguagem Ruby vem cativando mais programadores no Amapá, agora o time cresce com o Pessoal da InovaSoft.</p>
<p>No sábado dia 1/11/2008, fizemos uma reunião e divilgação da Comunidade AmapáOnRails na sede da InovaSoft, onde estavam os programadores Vinicius, Anderson, Huan, Veronica, Robson.</p>
<p>Falamos um pouco sobre programação e outros assuntos legais, vimos o Ruby fazendo suas mágicas ao vivo e a cores, eu também mostrei um pouco do meu KungFu usando a linguagem Ruby. Bem foi um sábado legal. Agradeço ao pessoal que apoia a comunidade e convido todas a usarem Ruby. Valeu!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=79</wfw:commentRss>
		</item>
		<item>
		<title>Metaclasse em Ruby! parte II</title>
		<link>http://www.amapaonrails.org/?p=76</link>
		<comments>http://www.amapaonrails.org/?p=76#comments</comments>
		<pubDate>Tue, 28 Oct 2008 14:48:51 +0000</pubDate>
		<dc:creator>isaacguerra</dc:creator>
		
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=76</guid>
		<description><![CDATA[Este artigo é uma continuação de Metaclasse em Ruby!
Bem Continuando&#8230;&#8230;&#8230;.
Vamos colocar nossa classe de Teste aqui para relembra-la!
 Bem se a Metaclasse é um Objeto da classe &#8220;Class&#8221; e todos os métodos dos Objetos desta classe buscam seus métodos na Metaclasse, entao eu posso adicionar métodos na Metaclasse e usá-los nos Objetos. Vejamos!  Antes [...]]]></description>
			<content:encoded><![CDATA[<p>Este artigo é uma continuação de <a href="http://www.amapaonrails.org/?p=68">Metaclasse em Ruby!</a></p>
<p>Bem Continuando&#8230;&#8230;&#8230;.</p>
<p>Vamos colocar nossa classe de Teste aqui para relembra-la!</p>
<p><script src="http://gist.github.com/19049.js"></script> Bem se a Metaclasse é um Objeto da classe &#8220;Class&#8221; e todos os métodos dos Objetos desta classe buscam seus métodos na Metaclasse, entao eu posso adicionar métodos na Metaclasse e usá-los nos Objetos. Vejamos!  Antes para criarmos uma classe tinhamos algo como no exemplo acima, mais poderiamos fazer assim:  <script src="http://gist.github.com/20389.js"></script></p>
<p>Bem ficou bem claro! Talvez a mágica esteja sendo desvendada, isso pode ser legal para alguns e muito triste para outros. Bem eu amo a simplicidade de Ruby, alguns amam suas mágicas, outros temem seu dinamismo. Porém o mais importante é que todos ao conhecer Ruby sempre criam algum sentimento por ele.</p>
<p>Voltando ao Assunto!</p>
<p>Agora, é que as coisas ficam mais complicadas e mágicas.</p>
<p>Em Ruby, os objetos de uma classe sempre compartilham os mesmos métodos e esses métodos ficam em sua Metaclasse, isso voces ja viram, porém, é possivel que objetos possuam métodos particulares, isso nós chamamos de singleton_methods.</p>
<p>Os métodos singleton de um Objeto só pertencem a ele, e não aos outros objetos da classe! São métods individuais, é como o ruby propoe que possamos dar individualidade aos objetos, ele deixa que nós dinamicamente adicionemos alguma funcionalidade que só aquele objeto precisa, e não nos obriga a adicionar essa funcionalidade a todos os obejtos de uma classe, isso é ser singleton_methods. Bem vejamos como isso é feito!</p>
<p><script src="http://gist.github.com/20392.js"></script></p>
<p>Lembrando que os métodos singleton são guardados no próprio objeto e não na metaclasse.</p>
<p>Bem existem muitas outras coisas cobre o assunto mais acho que o mais importante ja vimos! O mais interessante é podermos ver as coisas claramente. Ruby é uma linguagem que superficialmente é muito simples, porém quando nos aprofundamos podemos nos confundir em algumas coisas, o mais importante é poder ver a coisas claramente para sermos melhores!</p>
<p>Valeu!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=76</wfw:commentRss>
		</item>
		<item>
		<title>Metaclasse em Ruby!</title>
		<link>http://www.amapaonrails.org/?p=68</link>
		<comments>http://www.amapaonrails.org/?p=68#comments</comments>
		<pubDate>Thu, 23 Oct 2008 15:34:20 +0000</pubDate>
		<dc:creator>isaacguerra</dc:creator>
		
		<category><![CDATA[JRuby]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=68</guid>
		<description><![CDATA[Esse assunto é bem legal porém as vezes muito confuso vou tentar explica-lo sem confundir.
O que é uma Metaclasse?
Para que serve uma Metaclasse?
Bem antes vamos falar de Classes e Objetos. Vamos fazer uma classe simples para usarmos como exemplo.

 Uma Classe é composta de atributos e métodos, entao todos os Objetos de uma classe tem [...]]]></description>
			<content:encoded><![CDATA[<p>Esse assunto é bem legal porém as vezes muito confuso vou tentar explica-lo sem confundir.</p>
<p>O que é uma Metaclasse?<br />
Para que serve uma Metaclasse?</p>
<p>Bem antes vamos falar de Classes e Objetos. Vamos fazer uma classe simples para usarmos como exemplo.</p>
<p><script src="http://gist.github.com/18402.js"></script></p>
<p> Uma Classe é composta de atributos e métodos, entao todos os Objetos de uma classe tem em comum seus atributos e métodos. Porém cada objetos tem seus atributos específicos, ou seja, se uma classe tem o atributo &#8220;nome&#8221; todos os objetos teram um nome, so que para cada objetos o nome é particular, ex. Joao, Maria, Jose, etc. sendo assim cada Objeto tem seu próprio atributo e é individual. Já os métodos, sao todos iguais para todos os objetos, a ação de um método é sempre igual em todos os objetos. </p>
<p>E o que isso implica? É que quando se instancia um Objeto, o Objeto é colocado em memória e lá é reservado espaço de memória para todos seus atributos, isso é importante para que possamos guardar valores individuais para cada Objeto. Porém os métodos são iguais a todos os Objetos e não faz sentido ocupar espaço em memória colocando para cada Objeto seus métodos é muito mais inteligente colocar todos os métodos em um único Obejto e esses métodos serem usados por todos os Objetos da mesma Classe. </p>
<p>Bem este Objeto que guarda em sí todos os métodos de uma Classe chama-se Metaclasse!  Em Ruby uma Metaclasse é um Objeto(constante) Singleton, que guarda em sí todos os métodos e representa a classe durante a execução do código.  </p>
<p>Em miudos, em Ruby uma Metaclasse é um Objeto que representa a Classe, ou seja, uma espécie de procurador, ou executor do que está escrito na Classe. Estranho, mais é isso, lembrando que Classe nunca faz nada, pois em Orientação a Objetos só Objetos podem fazer algo e não Classe. Isso torna o ruby uma linguagem altamente Orientada a Objetos. Costuma-se dizer que em Ruby até as Classes são Objetos porém não é bem verdade Classes continuam sendo documentos e as Metaclasses é que são os Objetos que representão a Classe. </p>
<p>Fica Assim! Quando se escreve uma classe em Ruby automaticamente o interpretador cria um Objetos(Metaclasse) que representa essa Classe, este Objeto é uma constante por isso tem a primeira letra em maiúcula e é singleton, ou seja, só existe uma instancia em execução.  Por fim não podemos deixa de lembrar que a Metaclasse é um Objeto, sendo um Objeto ele vem de uma classe, que é a classe &#8220;Class&#8221;, e tem atributos e métodos como qualquer Objeto. Vejamos:</p>
<p><script src="http://gist.github.com/19034.js"></script></p>
<p>Notem que no Objeto(metaclasse) que representa a Classe &#8220;Teste&#8221; não tem o método &#8220;falar&#8221;, isso porque ele não e da classe &#8220;Teste&#8221; e sim da classe &#8220;Class&#8221; e tem o métodos da sua classe. Mais o Objeto(metaclasse) guarda em si alguns métodos legais, como o método &#8220;new&#8221;.</p>
<p>Em algums linguagens de programação a criação de uma instacia de um objeto é feito pelo interpretador, já em Ruby a criação de uma instacia de um Objeto é feita pela sua Metaclasse, isso é ser Orientado a Objetos.</p>
<p>Bem classicamente o método &#8220;new&#8221; lê a documentação, ou seja a &#8220;Classe&#8221; e cria um Objeto com seus atributos em memória. Essa ação é realizada pelo método &#8220;new&#8221;. Sendo um método é possivel mudar seu comportamento, pensemos algo como.</p>
<ul>
<li>Primeiro abrir uma conexao com o Banco de dados</li>
<li>Ir em uma tabela e coletar o nome de suas colunas</li>
<li>depois criar um Objeto que tenha seus atributos representando essas colunas</li>
<li>criar também todos os métodos de persistencia para essas informações no bando</li>
</ul>
<p>Ficou mais legal assim o método &#8220;new&#8221;! heheh!</p>
<p>Olha que legal, em Ruby por a Metaclasse ser responsável pelo criação de Objetos, a Metaclasse tem em si um método &#8220;new&#8221;, sendo um método eu posso sobrescreve-lo e mudar seu comportamento natural, e colocar mais aqueles passos no método &#8220;new&#8221;, assim eu posso automatimente criar um Objeto que seja um modelo de Dados persistente em Banco de dados. legal isso. Acho que voces ja viram essa idéia no Activerecord do RubyonRails. Talvez voce esteja falando, poxa como é facil, aquela mágica todo é so isso!</p>
<p>Porém o Poder a Metaclasse vai muito além disso, vejamos outro exemplo classico e muito poderoso:</p>
<p>Vamos pensar em atributos. Para que seus atributos sejam Encapsulas corretametne é necessário que se tenha os métodos acessores. Métodos acessores, como o nome ja diz são os métodos que dão acesso ao atributo, os famosos métodos gets e sets, sempre chatos! Bem para criarmos um atributo e seus acessore a classe ficaria assim:</p>
<p><script src="http://gist.github.com/19044.js"></script></p>
<p>Bem assim é que se faz encapsulamento de atributos, é sempre a mesma coisa e sempre chata, agora pense em um objeto que tem vários atributos para cada atributo seus métodos acessores, isso é um tormento e não melhora em nada o código, pois sempre é meiro do mesmo jeito.</p>
<p>Deixando a chatisse dos métodos acessore de lado, e lembrando que nós temos uma Objeto(metaclasse) que faz as coisas para mim, porque não criarmos um método na Objeto(metaclasse) que escreva os métodos acessores para mim. Poxa isso seria mágico eu passaria a chatisse para o Objeto(metaclasse) fazer. Isso ja foi feito e é usado assim:</p>
<p><script src="http://gist.github.com/19049.js"></script></p>
<p>Existe o método &#8220;attr_acessor&#8221; escreve o Atributo e seus métodos acessores, este método é do Objeto(metaclasse).</p>
<p>Como existe o método &#8220;attr_accessor&#8221; existem vários outro metodos que nso ajuda a diminuir a aquntidade de código durante a programação. O mais legal de tudo é que voce pode escrever seus próprio métodos de ajuda, sei lá, alguma rotina que voce esteja reescrevendo, ou algo que de para automatizar é legal esse recurso, lembrabdo de nao esquecer do conseito DRY.</p>
<p>Bem acho que este artigo ta ficando muito cansativo e longo, vamos continuar vendo em outro artigo!</p>
<p>No proximo artigo veremos como colocar funcionalidades na Metaclass.</p>
<p>E onde fica os métodos dos objetos na metaclasse, e adicionar novos metodos de instancia,</p>
<p>Espero que estejam gostando do assunto, valeu!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=68</wfw:commentRss>
		</item>
		<item>
		<title>Programando em Ruby II - Tipos, Numeros, Strings, Array</title>
		<link>http://www.amapaonrails.org/?p=59</link>
		<comments>http://www.amapaonrails.org/?p=59#comments</comments>
		<pubDate>Tue, 21 Oct 2008 15:30:51 +0000</pubDate>
		<dc:creator>isaacguerra</dc:creator>
		
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=59</guid>
		<description><![CDATA[Continuando os Artigos sobre Ruby&#8230;..
Hoje falaremos sobre Tipos, Numeros, Strings, Array
Antes de começarmos a falar propriamente da linguagem ruby, vamos pensar um pouco sobre algumas caracterí­sticas de outras linguagens de programaçío. No fundo de qualquer linguagem de programaçío o objetivo é disponibilizar uma sintaxe e semantia que sejam capaz de escrever a soluçío de um [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando os Artigos sobre Ruby&#8230;..</p>
<p>Hoje falaremos sobre Tipos, Numeros, Strings, Array</p>
<p>Antes de começarmos a falar propriamente da linguagem ruby, vamos pensar um pouco sobre algumas caracterí­sticas de outras linguagens de programaçío. No fundo de qualquer linguagem de programaçío o objetivo é disponibilizar uma sintaxe e semantia que sejam capaz de escrever a soluçío de um problema que seja finito e bem delineado. Porém existem várias complicações nesse meio, ou seja, imagine qual seria a atribuição verdadeira de uma linguagem, podemos pensar de várias formas, mais vamos aos extremos:</p>
<p>Uma Linguagem tem que ser:</p>
<blockquote><p>Uma Linguagem tem que ser completa, com todas as funções possiveis prontas, tem que ser rigida e formal o suficiente para que não leve o programador a errar, tem que ser formal o suficiente que transforme o ato de programar algo previsí­vel e desenhavel como um processo de engenharia, onde antes de começar a ato de programar seja possí­vel prever o resultado com grande garantia.</p></blockquote>
<p>Bem essa seria a linguagem ideal, porém vamos aos detalhes. Uma linguagem que tenha todas as funções possiveis prontas e ja disponí­veis seria ótimo pois ja teria tudo a mío durante a programação, porem o aprendizado de várias funções prontas seria mais demorado e complexo tornando mais dificil o aprendizado do linguagem. Uma linguagem que seja formal o suficiente para não deixar o programador errar torna o resultado mais previsí­vel, porém, torna o processo de programar algo mecanico e mata a possibilidade de criar metodos novos de resolvel algum problema de uma maneira diferente limitando a capacidade dos programadores. Tornar o processo de programar algo como um processo puramente de engenharia seria o ideal pois tornaria os software mais previsí­veis, porém o ato de programar e um ato de arte não de pura matemática, sendo onde deve ser bem dosado o que será arte e o que será planejamento e previsão.</p>
<blockquote><p>Ou uma linguagem deve ser simples, só com as funcionalidades indispesáveis, com alto poder de explansão, tem que ser totalmente flexivél e adaptavél para que libere a criatividade do programador, deve ser dinamica o suficiente para que o software seja algo perfeito e nada previsí­vel.</p></blockquote>
<p>Bem essa também seria a linguagem ideal porém vamos as detalhes: Uma liguagem simples que só contenhas funçoes básicas seria muito simples de aprender, porem a toda nova necessidade seria necessário que seja escrito, onde tornar o ato de programar totalmente artí­stico em nada previsí­vel torna o software mais sucessí­vel a erros e falhas.</p>
<p>Bem isso são alguns pontos que são interessantes serem lembrados antes de começarmos a falar em ruby, pois ruby é uma linguagem que tende mais a segunda opção acima não tão extrema, mais algo perto. A linguagem ruby foi feita por um programador e visa a satisfação do programador, ela também e altamente expansí­vel e adaptavel, e dinamica e simples.</p>
<p>Bem Vamos a Ruby!</p>
<p><strong>TIPOS</strong></p>
<p>Bem, em ruby nao tem tipos! não da maneira que se tem em java, como primitivos, ou seja, numeros, caracteres, booleanos.</p>
<p>Em Ruby tudo é objeto, e sendo assim:</p>
<blockquote><p>1 - é um Objeto da classe Fixnum</p>
<p>1231231.654645 - é um objeto da classe Float</p>
<p>&#8220;a&#8221; - é um objeto da classe String</p>
<p>true - é um objeto da classe TrueClass</p>
<p>false - é um objeto da classe FlaseClass</p></blockquote>
<p>Sabendo que objetos tem métodos, quas sío os métodos de um Fixnum ou do 1</p>
<blockquote><p>irb(main):007:0&gt; 1.methods</p>
<p>["%", "inspect", "&lt;&lt;", "singleton_method_added", "&amp;", "clone", "&gt;&gt;", "round", "method", "public_methods", "instance_variable_defined?", "divmod", "equal?", "freeze", "integer?", "chr", "*", "+", "to_i", "methods", "respond_to?", "-", "upto", "between?", "prec", "truncate", "/", "dup", "instance_variables", "__id__", "modulo", "succ", "|", "eql?", "object_id", "zero?", "~", "id", "to_f", "singleton_methods", "send", "prec_i", "taint", "step", "to_int", "frozen?", "instance_variable_get", "^", "__send__", "instance_of?", "remainder", "to_a", "+@", "nonzero?", "-@", "type", "**", "floor", "&lt;", "protected_methods", "&lt;=&gt;", "instance_eval", "display", "==", "prec_f", "quo", "&gt;", "===", "downto", "id2name", "size", "instance_variable_set", "kind_of?", "abs", "extend", "&gt;=", "next", "to_s", "&lt;=", "coerce", "hash", "ceil", "class", "tainted?", "=~", "private_methods", "div", "nil?", "untaint", "times", "to_sym", "[]&#8220;, &#8220;is_a?&#8221;]</p></blockquote>
<p>Notem que o Objeto <em>1</em> tem todos os metodos necessários para ser auto-suficiente, ou seja, o objeto <em>1</em> é capas de se somar, subtrair, multiplicar, dividir e muitas outras ações usando os métodos. Legal isso sendo assim a linguagem ruby não tem nada a ver com soma, isso e responsabilidade dos objetos.</p>
<p>Bem parece que a linguagem ruby realmente e bem simples, ela nao faz quase nada, nem mesmo operações matemáticas básicas. Então o quela realmetne faz.</p>
<p>Bem uma coisa interessante da linguagem ruby e o <em>&#8220;sintax sugar&#8221;</em>, e como e chamado alguns recursos de ajuda ao programador, coisas que tornam algo complicado de ser lido ou escrito em açucar sintatico para o programdor.</p>
<blockquote><p>Olhem esse exemplor - <em>a = 10 + 20</em></p>
<p>Bem para se chamar um método de um objeto escreve-se assim &#8220;Objeto.Metodo&#8221;</p>
<p>Então ja que em Ruby o <em>10</em> e um Objeto Fixnum e <em>+</em> é um metodo do objeto ficaria ssim:</p>
<p><em>a.=(10.+(20))</em></p>
<p>ai entra o <em>sintax sugar</em> em açao e deixa voce escrever assim:</p>
<p><em>a = 10 + 20</em></p>
<p>Isso nao mudou nada o <em>10</em> continua sendo objeto e <em>+</em> um metodo do objeto <em>10</em>, porem a sintaxe ficou açucarada e bem mais legí­vel, legal isso.</p></blockquote>
<p>A função de <em>sintax sugar</em> é muito usada em ruby, sempre que ruby puder tornar as coisas mais legí­ves e simples ele as tornará.</p>
<p><strong>Funções avançadas em numeros </strong></p>
<p>Voltando as números, talvez voce tenha notado que apesar de a Classe Fixnum ter bastantes métodos ela nao contem métodos muito avançados de matemática, isso fica a cargo de um módulo chamado <em>Math</em></p>
<blockquote><p>Raiz Quadrada de 25 ficaria assim em ruby</p>
<p>Math.sqrt(25)</p>
<p>Metodos do módulo Math</p>
<p>["inspect", "cos", "log10", "private_class_method", "const_missing", "clone", "method", "public_methods", "atan", "public_instance_methods", "instance_variable_defined?", "erf", "method_defined?", "equal?", "freeze", "included_modules", "const_get", "asinh", "methods", "respond_to?", "sin", "module_eval", "class_variables", "sqrt", "dup", "protected_instance_methods", "cosh", "instance_variables", "public_method_defined?", "erfc", "__id__", "eql?", "object_id", "const_set", "atanh", "id", "singleton_methods", "tan", "send", "frexp", "class_eval", "taint", "frozen?", "instance_variable_get", "sinh", "include?", "private_instance_methods", "__send__", "instance_of?", "private_method_defined?", "to_a", "name", "exp", "autoload", "type", "&lt;", "protected_methods", "instance_eval", "&lt;=&gt;", "acos", "display", "==", "&gt;", "ldexp", "===", "instance_method", "instance_variable_set", "tanh", "kind_of?", "extend", "protected_method_defined?", "const_defined?", "&gt;=", "ancestors", "atan2", "to_s", "&lt;=", "public_class_method", "log", "hash", "class", "tainted?", "instance_methods", "asin", "=~", "private_methods", "class_variable_defined?", "hypot", "nil?", "untaint", "constants", "acosh", "is_a?", "autoload?"]</p></blockquote>
<p>Conversão de numeros</p>
<p>Felizmente a classes Numericas possuem métodos de conversão, ficando assim:</p>
<blockquote><p>1.to_i - Converte para inteiro</p>
<p>1.to_s - Converte para String</p>
<p>1.to_f - Converte para Float</p>
<p>1.chr - Converte na tabela Ascii</p></blockquote>
<p>Tem muito mais conversoes possí­vel que voce pode ver na documentaçío</p>
<p><strong>STRING </strong></p>
<p>Bem agora vamos falr um pouco sobre String</p>
<p>String é uma cadeia de Caracteres, em ruby não, String é um objeto da Classe String.</p>
<p>&#8220;Ola eu sou uma String&#8221; ou &#8216;Ola eu sou uma String&#8217;</p>
<p>A diferença entre scrings com Aspas dupla e Simples e que Strings com Aspas duplas aceita caractere de formatação, tipo quebra de linha e outros.</p>
<p>Vamos dar uma olhada nos métodos diponí­veis em Strings</p>
<blockquote><p>&#8220;Ola eu sou uma String&#8221;.methods</p>
<p>["%", "select", "[]=&#8221;, &#8220;inspect&#8221;, &#8220;&lt;&lt;&#8221;, &#8220;each_byte&#8221;, &#8220;clone&#8221;, &#8220;method&#8221;, &#8220;gsub&#8221;, &#8220;casecmp&#8221;, &#8220;public_methods&#8221;, &#8220;to_str&#8221;, &#8220;partition&#8221;, &#8220;tr_s&#8221;, &#8220;empty?&#8221;, &#8220;instance_variable_defined?&#8221;, &#8220;tr!&#8221;, &#8220;equal?&#8221;, &#8220;freeze&#8221;, &#8220;rstrip&#8221;, &#8220;*&#8221;, &#8220;match&#8221;, &#8220;grep&#8221;, &#8220;chomp!&#8221;, &#8220;+&#8221;, &#8220;next!&#8221;, &#8220;swapcase&#8221;, &#8220;ljust&#8221;, &#8220;to_i&#8221;, &#8220;swapcase!&#8221;, &#8220;methods&#8221;, &#8220;respond_to?&#8221;, &#8220;upto&#8221;, &#8220;between?&#8221;, &#8220;reject&#8221;, &#8220;sum&#8221;, &#8220;hex&#8221;, &#8220;dup&#8221;, &#8220;insert&#8221;, &#8220;reverse!&#8221;, &#8220;chop&#8221;, &#8220;instance_variables&#8221;, &#8220;delete&#8221;, &#8220;dump&#8221;, &#8220;__id__&#8221;, &#8220;tr_s!&#8221;, &#8220;concat&#8221;, &#8220;member?&#8221;, &#8220;object_id&#8221;, &#8220;succ&#8221;, &#8220;find&#8221;, &#8220;eql?&#8221;, &#8220;each_with_index&#8221;, &#8220;strip!&#8221;, &#8220;id&#8221;, &#8220;rjust&#8221;, &#8220;to_f&#8221;, &#8220;singleton_methods&#8221;, &#8220;send&#8221;, &#8220;index&#8221;, &#8220;collect&#8221;, &#8220;oct&#8221;, &#8220;all?&#8221;, &#8220;slice&#8221;, &#8220;taint&#8221;, &#8220;length&#8221;, &#8220;entries&#8221;, &#8220;chomp&#8221;, &#8220;frozen?&#8221;, &#8220;instance_variable_get&#8221;, &#8220;upcase&#8221;, &#8220;sub!&#8221;, &#8220;squeeze&#8221;, &#8220;include?&#8221;, &#8220;__send__&#8221;, &#8220;instance_of?&#8221;, &#8220;upcase!&#8221;, &#8220;crypt&#8221;, &#8220;delete!&#8221;, &#8220;detect&#8221;, &#8220;unpack&#8221;, &#8220;to_a&#8221;, &#8220;zip&#8221;, &#8220;lstrip!&#8221;, &#8220;type&#8221;, &#8220;center&#8221;, &#8220;&lt;&#8221;, &#8220;protected_methods&#8221;, &#8220;instance_eval&#8221;, &#8220;map&#8221;, &#8220;&lt;=&gt;&#8221;, &#8220;rindex&#8221;, &#8220;display&#8221;, &#8220;any?&#8221;, &#8220;==&#8221;, &#8220;&gt;&#8221;, &#8220;split&#8221;, &#8220;===&#8221;, &#8220;strip&#8221;, &#8220;size&#8221;, &#8220;sort&#8221;, &#8220;instance_variable_set&#8221;, &#8220;gsub!&#8221;, &#8220;count&#8221;, &#8220;succ!&#8221;, &#8220;downcase&#8221;, &#8220;min&#8221;, &#8220;kind_of?&#8221;, &#8220;extend&#8221;, &#8220;squeeze!&#8221;, &#8220;downcase!&#8221;, &#8220;intern&#8221;, &#8220;&gt;=&#8221;, &#8220;next&#8221;, &#8220;find_all&#8221;, &#8220;to_s&#8221;, &#8220;&lt;=&#8221;, &#8220;each_line&#8221;, &#8220;each&#8221;, &#8220;rstrip!&#8221;, &#8220;class&#8221;, &#8220;slice!&#8221;, &#8220;hash&#8221;, &#8220;sub&#8221;, &#8220;tainted?&#8221;, &#8220;private_methods&#8221;, &#8220;replace&#8221;, &#8220;inject&#8221;, &#8220;=~&#8221;, &#8220;tr&#8221;, &#8220;reverse&#8221;, &#8220;nil?&#8221;, &#8220;untaint&#8221;, &#8220;sort_by&#8221;, &#8220;lstrip&#8221;, &#8220;to_sym&#8221;, &#8220;capitalize&#8221;, &#8220;max&#8221;, &#8220;chop!&#8221;, &#8220;is_a?&#8221;, &#8220;capitalize!&#8221;, &#8220;scan&#8221;, &#8220;[]&#8220;]</p></blockquote>
<p>Com certeza uma das atribuiçoes mais importantes de uma linguagem de programaçao e manipular bem strings ou textos, e ruby com certeza da conta do recado, trabalhar com String e ruby e buito facil e produtivo.</p>
<p>Manipulaçío de String</p>
<blockquote><p>a = &#8220;bom&#8221; =&gt; &#8220;bom&#8221;</p>
<p>a * 3 =&gt; &#8220;bombombom&#8221;</p>
<p>a + &#8221; dia&#8221; =&gt; &#8220;Bom Dia&#8221;</p>
<p>a &lt;&lt; &#8221; Hacker&#8221; =&gt; &#8220;Bom dia Hacker&#8221;, a diference de + e &lt;&lt; e que o + gera um novo objeto e o &lt;&lt; adiciona no memo objeto.</p>
<p>a.upcase =&gt; &#8220;BOM DIA HACKER&#8221;</p>
<p>a.downcase =&gt; &#8220;bom dia hacker&#8221;</p>
<p>a.capitalize =&gt; &#8220;Bom dia hacker&#8221;</p></blockquote>
<p>Percorrendo e Alterando uma String</p>
<blockquote><p>a = &#8220;Estudando Ruby&#8221; =&gt; &#8220;Estudando Ruby&#8221;<br />
a[0] = &#8220;e&#8221; =&gt; &#8220;estudando Ruby&#8221;</p>
<p>a[10] =&gt; 82, codigo da tabela ascii</p>
<p>a.delete(&#8221;R&#8221;)  =&gt; &#8220;estudando uby&#8221;</p>
<p>a.insert(9,&#8221;R&#8221;) =&gt; &#8220;estudando Ruby&#8221;</p>
<p>a.reverse =&gt; &#8220;ybuR odnadutse&#8221;</p></blockquote>
<p>Bem temos em ruby uma maneira simples de concatenar textos</p>
<blockquote><p>Exite a notaçío &#8220;#{}&#8221;</p>
<p>Imagine escrever o texto assim</p>
<p>a = &#8220;nome do usuario&#8221;</p>
<p>&#8220;Bom dia&#8221;+ a =&gt; &#8220;Bom dia nome do usuario&#8221;</p>
<p>&#8220;Bom dia #{a}&#8221; =&gt; &#8220;Bom dia nome do usuario&#8221;</p></blockquote>
<p>Tem muito mais coisas legais sobre String, mais veremos mais adiante em outro artigo.</p>
<p><strong>ARRAY </strong></p>
<p>Agora vamos ver um pouco sobre Array</p>
<p>Array é um capitulo aparte em Ruby, aqui e que ruby mostra seus diferenciais e torna tudo mais interessante, algo que com certeza voce vai se beneficiar.</p>
<blockquote><p>a = [] =&gt; Cria um array vazio</p>
<p>a = [1,2,3,4,5]  =&gt; cria e ja popula uma array</p></blockquote>
<p>Vamos dar uma olha nos methos da classe array</p>
<blockquote><p>a.methods</p>
<p>["select", "[]=&#8221;, &#8220;inspect&#8221;, &#8220;&lt;&lt;&#8221;, &#8220;compact&#8221;, &#8220;&amp;&#8221;, &#8220;clone&#8221;, &#8220;last&#8221;, &#8220;method&#8221;, &#8220;public_methods&#8221;, &#8220;partition&#8221;, &#8220;delete_if&#8221;, &#8220;empty?&#8221;, &#8220;instance_variable_defined?&#8221;, &#8220;equal?&#8221;, &#8220;freeze&#8221;, &#8220;each_index&#8221;, &#8220;*&#8221;, &#8220;grep&#8221;, &#8220;sort!&#8221;, &#8220;assoc&#8221;, &#8220;+&#8221;, &#8220;to_ary&#8221;, &#8220;methods&#8221;, &#8220;respond_to?&#8221;, &#8220;-&#8221;, &#8220;reject&#8221;, &#8220;insert&#8221;, &#8220;reverse!&#8221;, &#8220;dup&#8221;, &#8220;push&#8221;, &#8220;delete&#8221;, &#8220;instance_variables&#8221;, &#8220;concat&#8221;, &#8220;member?&#8221;, &#8220;__id__&#8221;, &#8220;|&#8221;, &#8220;find&#8221;, &#8220;eql?&#8221;, &#8220;pack&#8221;, &#8220;join&#8221;, &#8220;reverse_each&#8221;, &#8220;object_id&#8221;, &#8220;each_with_index&#8221;, &#8220;collect!&#8221;, &#8220;rassoc&#8221;, &#8220;id&#8221;, &#8220;at&#8221;, &#8220;compact!&#8221;, &#8220;singleton_methods&#8221;, &#8220;index&#8221;, &#8220;collect&#8221;, &#8220;send&#8221;, &#8220;all?&#8221;, &#8220;reject!&#8221;, &#8220;flatten&#8221;, &#8220;slice&#8221;, &#8220;taint&#8221;, &#8220;length&#8221;, &#8220;entries&#8221;, &#8220;pop&#8221;, &#8220;instance_variable_get&#8221;, &#8220;frozen?&#8221;, &#8220;transpose&#8221;, &#8220;include?&#8221;, &#8220;__send__&#8221;, &#8220;instance_of?&#8221;, &#8220;detect&#8221;, &#8220;to_a&#8221;, &#8220;indexes&#8221;, &#8220;zip&#8221;, &#8220;map!&#8221;, &#8220;uniq&#8221;, &#8220;type&#8221;, &#8220;fetch&#8221;, &#8220;protected_methods&#8221;, &#8220;instance_eval&#8221;, &#8220;map&#8221;, &#8220;&lt;=&gt;&#8221;, &#8220;values_at&#8221;, &#8220;rindex&#8221;, &#8220;display&#8221;, &#8220;any?&#8221;, &#8220;==&#8221;, &#8220;===&#8221;, &#8220;shift&#8221;, &#8220;size&#8221;, &#8220;sort&#8221;, &#8220;instance_variable_set&#8221;, &#8220;clear&#8221;, &#8220;min&#8221;, &#8220;kind_of?&#8221;, &#8220;extend&#8221;, &#8220;find_all&#8221;, &#8220;to_s&#8221;, &#8220;indices&#8221;, &#8220;each&#8221;, &#8220;class&#8221;, &#8220;flatten!&#8221;, &#8220;slice!&#8221;, &#8220;hash&#8221;, &#8220;first&#8221;, &#8220;tainted?&#8221;, &#8220;replace&#8221;, &#8220;inject&#8221;, &#8220;=~&#8221;, &#8220;private_methods&#8221;, &#8220;delete_at&#8221;, &#8220;reverse&#8221;, &#8220;nitems&#8221;, &#8220;nil?&#8221;, &#8220;untaint&#8221;, &#8220;sort_by&#8221;, &#8220;unshift&#8221;, &#8220;max&#8221;, &#8220;fill&#8221;, &#8220;is_a?&#8221;, &#8220;[]&#8220;, &#8220;uniq!&#8221;]</p></blockquote>
<p>Algumas funções básicas sobre arrays</p>
<blockquote><p>a = Array.new ou a=[]</p>
<p>a &lt;&lt; &#8220;Joaquim&#8221; =&gt; ["Joaquim"]</p>
<p>a.insert(1,&#8221;Silva&#8221;) =&gt; ["Joaquim","Silva"]</p>
<p>a.first =&gt; &#8220;Joaquim&#8221;</p>
<p>a.last =&gt; &#8220;Silva&#8221;</p>
<p>a.empty? =&gt; false</p></blockquote>
<p>Bem na verdade a classe array tem muitos métodos, e com certeza tem um que supre sua necessidades, vamos ver um pouco sobre interação com array.</p>
<blockquote><p>a = [4,5,6,7,8,9,10]</p>
<p>a.each {|i| puts i} =&gt; 4,5,6,7,8,9,10</p></blockquote>
<p>Bem existem várias variaçoes de interadores em array, mais acredito que ainda falaremos muito sobre esse assunto, que certamente sera aborado em outros temas, sendo assuim, ficamos por aqui!</p>
<p>Depois continuamos, valeu!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=59</wfw:commentRss>
		</item>
		<item>
		<title>Programando em Ruby I - Orientação a Objetos</title>
		<link>http://www.amapaonrails.org/?p=56</link>
		<comments>http://www.amapaonrails.org/?p=56#comments</comments>
		<pubDate>Tue, 21 Oct 2008 15:06:56 +0000</pubDate>
		<dc:creator>isaacguerra</dc:creator>
		
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=56</guid>
		<description><![CDATA[Tudo no Paradigma de Programação a Orientada a Objetos resume-se em:

Classes
Atributos
Metodos

Na construção de uma Classe, observamos:

Herança
Abstração
Encapsulamento
Polimorfismo

E por fim tudo Acaba em Objeto.
Ou seja, Objetos são Instancias de Classes que forma construídas observado Heranças, Encapsulamento, Polimorfismo e abstração.
Bem! Voce pode estar se perguntando, isso eu ja sabia! Porem vale apena lembrar antes de entrarmos no assunto, [...]]]></description>
			<content:encoded><![CDATA[<p>Tudo no Paradigma de Programação a Orientada a Objetos resume-se em:</p>
<ul>
<li>Classes</li>
<li>Atributos</li>
<li>Metodos</li>
</ul>
<p>Na construção de uma Classe, observamos:</p>
<ul>
<li>Herança</li>
<li>Abstração</li>
<li>Encapsulamento</li>
<li>Polimorfismo</li>
</ul>
<p>E por fim tudo Acaba em Objeto.</p>
<p>Ou seja, Objetos são Instancias de Classes que forma construídas observado Heranças, Encapsulamento, Polimorfismo e abstração.</p>
<p>Bem! Voce pode estar se perguntando, isso eu ja sabia! Porem vale apena lembrar antes de entrarmos no assunto, pois em alguns momentos esses conseitos serão importantes para esclarecer dúvidas sobre as várias implementações do Paradigma.</p>
<p>Para entendermos melhor vamos analizar a função seguir:</p>
<blockquote><p>a = 10 + 20</p></blockquote>
<p>Vamos Ver o que é cada um dos membros dessa função.</p>
<blockquote><p>&#8220;a&#8221; - é uma variável</p>
<p>&#8220;=&#8221; -  é um operador</p>
<p>&#8220;10&#8243; - é um número</p>
<p>&#8220;+&#8221; - é um operador</p>
<p>&#8220;20&#8243; - é um número</p></blockquote>
<p>Na primeira olhada na funçao podemos identificar facilmente as partes que a compoem. E bem claro que a função e composta de variáveis, operadores e números.</p>
<p><img class="alignleft" style="margin: 10px;" src="http://regressoaofuturo5.blogs.sapo.pt/arquivo/EstouDoido.jpg" alt="" width="75" height="75" />Bem voltemos então as bases da Orientação a Objetos(no começo do artigo), procure por variáveis, operadores e números. Isso mesmo não existe variáveis, operadores e números, na Orientação a Objetos sã existem, <strong>Objetos</strong> compostos de  atributos e metodos.</p>
<p>Vamos rever a função, agora Orientado a Objetos</p>
<blockquote><p>a = 10 + 20</p>
<p>&#8220;a&#8221; - é um objeto</p>
<p>&#8220;=&#8221; - é um método do objeto &#8220;a&#8221;</p>
<p>&#8220;10&#8243; - é um objeto</p>
<p>&#8220;+&#8221; - é um método do objeto &#8220;10&#8243;</p>
<p>&#8220;20&#8243; - é um objeto</p>
<p>Poderia ser escrito assim:</p>
<p>a.=(10.+(20))</p></blockquote>
<p>Ou seja, tudo em uma linguagem Orientada a Objetos são objetos.</p>
<p>É assim que Ruby implementa a Orientação a Objetos, tudo que é manipulado em um Programa segue a seguinte ordem, Palavra Reservada, Objeto ou Método, não existe nada além disso.</p>
<p>Isso simplifica muito o aprendizado da linguagem, pois aprendendo as palavras reservadas, o resto é tudo objetos, e quando voce precisa fazer alguma coisa com um objeto basta chamar seus métodos e pronto, simples assim.</p>
<p>Vejamos um exemplo de um objeto em ruby</p>
<blockquote><p>&#8220;eu sou um objeto&#8221;</p>
<p>Voce deve estar olhando e vendo que isso é uma String, isso mesmo, e também e um objeto, e tem um monte de métodos</p>
<p>Vamos fazer o texto ficar todo em maiúsculo</p>
<p>&#8220;eu sou um objeto&#8221;.upcase</p>
<p>&#8220;EU SOU UM OBJETO&#8221;</p>
<p>Notem, nós chamamos o métodos &#8220;upcase&#8221; diretamente na String. O Objeto é auto-suficiente, contém todos os métodos pertinentes a sí, isso é muito importante, pois libera a linguagem dessas obrigações.</p>
<p>Vejamos os numeros</p>
<p>10</p>
<p>Isso também é um objeto e tem seus métodos por exemplo, o + é um métodos do objeto 10.</p>
<p>10.+(20)</p>
<p>ou 10 + 20</p></blockquote>
<p>Um pouco mais de filosofia sobre Orientação a Objetos!</p>
<p>Bem voce deve estar pensando, &#8220;bem se o + e um método do objeto 10, eu poderia sobrescreve-lo, e fazer o + realizar qualquer coisa!&#8221;, Sim isso mesmo voce pode sobrescrever qualquer método e modifica-lo de acordo com suas necessidade.</p>
<p>Ficaria assim:</p>
<blockquote><p><em>class MeuNumero &lt; Fixnum<br />
def +(numero)<br />
42<br />
end<br />
end</em></p>
<p><em>numero = MeuNumero.new(1)</em><br />
# Repare como um operador de soma é um método em ruby, ao contrário de outras linguagens<br />
<em>puts numero+2 # 1+2 = 42</em> ??? Sim, sobrescrevemos o método de soma para retornar 42 sempre.</p></blockquote>
<p>Bem mais isso não e perigoso, imagine um método que chama + e que realiza uma divisao, poderia confundir o programador. Isso é verdade, porém da muita flexibilidade, e deixa tudo Orientado a Objetos.</p>
<p>Muitas linguagens como o Java deixam os operadores dentro da prãpria linguagem e nao como um método do objeto numero, e os númentos também são primitivos e não objetos, com isso se diminui a possibilidade de uso errado das coisas, porém deixa a linguagem muito suja e complexa, pois nao sabe quando deve-se chamar um método ou quando deve-se chamar uma função da linguagem, e também deixa o conseito de Orientação a Objetos errado, por isso que java é PseudoOrientada a Objetos, em alguns pontos ela e totalmente procedural, ou seja:</p>
<blockquote><p>a = 10 + 20</p></blockquote>
<p>Isso é totalmente procedural pois:</p>
<blockquote><p>&#8220;10&#8243; - é um número(primitivo)</p>
<p>&#8220;+&#8221; - é uma função da linguagem java</p>
<p>&#8220;20&#8243; - é um número(primitivo)</p></blockquote>
<p>Essa função em java não é nada orientado a objeto.</p>
<p>Bem essa era a parte filosãfoca do nosso artigo, mais era importante saber e relembrar as bases do Conseito de Orientação a Objetos, pois serão muito úteis no aprendizado da linguagem Ruby.</p>
<p>No proximo artigo veremos mais a fundo na Linguagem Ruby.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=56</wfw:commentRss>
		</item>
		<item>
		<title>Interpretando o Ruby!</title>
		<link>http://www.amapaonrails.org/?p=48</link>
		<comments>http://www.amapaonrails.org/?p=48#comments</comments>
		<pubDate>Tue, 21 Oct 2008 13:54:32 +0000</pubDate>
		<dc:creator>isaacguerra</dc:creator>
		
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=48</guid>
		<description><![CDATA[Acho que é um assunto interessante e por isso vou falar um pouco sobre os Interpretadores Ruby!

Bem antes de falar dos interpretadores de Ruby, vamos falar um pouco sobre interpretadores. Na verdade era interessante deixar bem claro a diferença entre anbiente de execução e instruções executadas.
O que é Ruby, na verdade Ruby é o nome [...]]]></description>
			<content:encoded><![CDATA[<p>Acho que é um assunto interessante e por isso vou falar um pouco sobre os Interpretadores Ruby!</p>
<p><img class="alignleft" style="margin: 5px;" src="http://maxonrails.files.wordpress.com/2008/07/captura_da_tela-modificado.png" alt="" width="221" height="179" /></p>
<p>Bem antes de falar dos interpretadores de Ruby, vamos falar um pouco sobre interpretadores. Na verdade era interessante deixar bem claro a diferença entre anbiente de execução e instruções executadas.</p>
<p>O que é Ruby, na verdade Ruby é o nome que se dá ao conjuto de Interpretador e Linguagem que o interpretador reconhece, ou seja, o Linguagem Ruby é reconhecida pelo Interpretador Ruby.</p>
<p>Bem nem sempre foi assim, a muitos e muito tempo (hehe to brincando), os programas eram compilados, ou seja escrevia-se o código fonte e depois o código era convertido para linguagem de máquina (binarios) e executado diretamente pelo processador, nunca mais necessitando ser lido o código fonte. É assim que a linguagem C faz usando o Compilador GCC. Ou seja Tem a Linguagem C e o Compilador que entende a Linguagem C.</p>
<p>Voltemos a Ruby, no mundo Ruby é um pouco diferente. A diferença logo de cara é que o Codigo Ruby não é Compilado para Binários e sim Interpretado durante a Execução. Fica mais ou menos assim, quando executamos um programa Ruby, primeiramente chamamos um programa que reconhece as instruçoes Ruby (o interpretador ruby), este programa lê as instruções e executa durante a solicitação. O legal é que o Interpretador sempre precisa de ler o código fonte para executar a instrução. O legal disso é:</p>
<p>Primeiro! Seu código pode ser rodado em qualquer ambiente. Basta que haja um interpretador Ruby no ambiente, tails como Linux, Windows, Unix, BSD, etc.</p>
<p>Segundo! Ao Interpretar o codigo pode ser otimizado excessivamente para ser mais rápido e mais eficiente.</p>
<p>Bem mais não acaba ai, linguagens orientadas a objetos tem um grande desafio em uso de memória. Notem que quando se instancia um Objeto ele e repleto de Atributos e isso consome muita memória, porem, também torna as variaveis bem mais regenciaveis, pois elas sempre dependem de um objeto. Bem para resolver este problemas existe um outro programa que auxilia o Sistema Operacional a gerenciar a memória, ele tem por objetivo remover objetos não usados da memória e liberar espaço para outros objetos. Este programa tem o nome de Coletor de Lixo.</p>
<p>Ja notamos que a coisa ta ficando cada vez mais interessante. Então vamos falar dos interpretadores de Ruby.</p>
<p><img class="alignnone" src="http://tbn0.google.com/images?q=tbn:GeKCzSjqdy7F6M:http://rubypal.com/images/ruby-kit/ruby.png" alt="" width="89" height="89" /></p>
<p><strong>MRI - Matz Ruby Interpreter</strong></p>
<p>Como o Próprio nome ja diz é o interpretador que o Matz fez, ele é o primeiro Interpretador Ruby, é lindo em sua forma, porém não é o mais otimizado, talvez porque o Matz não buscasse o que o java buscava, em ser o melhor, mais seguro e mais rápido de todos. O que significa isso, um programa ruby executado pelo interpretador MRI, é bem mais lento que um programa Java ou um programa Smalltalk, quem, porém isso não é necessariamente um grande problema, pois com a facilidade de programação que a linguagem proporciona, é possivel otimizar código tornando a aplicação em si mais rápida idependente do interpretador.</p>
<p><strong>YARV - MRI1.9</strong></p>
<p>Este é o grande esforço da comunidade Ruby para melhorar o MRI, ele tem por objetivo resolver alguns problemas conseituais do MRI e aumentar sua performance, porém isso nao está sendo tão simples assim, por mais interessantes que venham se mostrando os testes a velocidade em si não tem melhorado muito, isto é normal, em alguns casos a otimização de um interpretador leva vários anos para encontrar algo performático e seguro.</p>
<p><img class="alignnone" src="http://farm4.static.flickr.com/3024/2917525709_c34f207f3a.jpg?v=0" alt="" width="157" height="157" /></p>
<p><strong>Rubinius</strong></p>
<p>Este com certeza é o mais elegante e promissor de todos. A idéia do Rubinius é fazer um interpretador de Ruby escrito em Ruby. Como? O jeito é fazer os elementos essenciais em C, e depois o restante todo em ruby puro. É como construir uma ferrovia, os primeiros trilhos usaśe um caminhão pra llevar, quando cabe a locomotiva, ja usa-se a prórpia ferrovia apra levar os proximos trilhos. Qual é a grande vantagem de se escrever um interpretador de Ruby em Ruby, a grande sacada é que escrever em Ruby é muito fácil e rápido, em quanto um interpretador de Ruby em C precisa de 10 mil linha um Escrito em Ruby precisa de 1 mil, e enquanto em um Interpretador escrito em C voce precisa mudar 1000 linhas pra melhorar algo em Ruby voce precisa mudar apesa 10, isso tornaria a evolução do Rubinius algo vertiginoso e inesperado. Porém o inicio ainda é muito lento e singular, talvez ainda demore um pouco para chegar ao estado perfeito da arte.</p>
<p>Bem além disso a idéia do Rubinius é ser um Maquina Virtual, a diferença entre ser uma VM ou somente um Interpretador é que é necessário implementar no interpretador todas as rotinas que o sistema Operacional disponibiliza diretamente ao sistema, ou seja, ao inves de vc pedir ao SO para ler um arquivo, pedesse a MV que por sua vez pede a Sistema Operacional, isso torna a Sua Aplicação bem mais portavel, pois dependendo do Sistema Operacional ele disponibiliza diferentes recusos, e é possivel vc estar usando algum recusrso que nao esteja disponível em todos SO, um exemplo classico é a gerador de imagens MAGIC, que é escrito em C e é possivel usar no MRI, porém nem todos os SO tem o MAGIC instalado e disponível. Voltando uma VM é muito mais capaz de resolver tudo que seu programa pede sem depender o Sistema Operacional, isso torna seu Programa mais portavel.</p>
<p>Além disso tem algo muito legal que aconteceu durante o desenvolvimento do Rubinius. A idéia de compatibilidade, o Rubinius priorizou testes automatizados em seu desenvolvimento, com isso usando os mesmos testes que o Rubinius fez é possivel avaliar a compatibilidade de vários interpretadores, ous eja, é dizer que um MRI 1.8 é compativel com MRI1.9 e compativel com RUbinius, etc. Isso da mais tranquilidade pois é possivel saber se um codigo escrito em Ruby sera bem interpretado por qualquer Interpretador Ruby.</p>
<p><img class="alignnone" src="http://blog.elisehuard.be/wp-content/uploads/2007/12/dukewithrubyax7.thumbnail.png" alt="" width="128" height="126" /></p>
<p><strong>JRUBY</strong></p>
<p>Talvez essa seja a melhor opção hoje para interpretar código Ruby. O que é JRuby? JRuby é um esforço da comunidade e da propria SUM em possibilitar que o interpretador java reconheça código Ruby. A pergunta que nao quer calar! Porque a SUM deseja que o código ruby seja interpretador pela JVM? É porque a Linguagem Ruby é muito melhor que a linguagem Java, eheh, bem não é so por isso, a linguagem Ruby implementa muito bem outros paradigmas que a linguagem Java não é capaz, tais como meta programação, desenvolviemnto ágil, etc..</p>
<p>E o que Ruby ganha com isso? Toda a maturidade, velocidade, segurança da JVM. Sem falar que para a JVM chegasse a ser o que é hoje, formam investidos milhares de milhares dolares e tempo, e quando se executa seu programa Ruby sobre essa estrutura voce automaticamente se beneficia disso.</p>
<p>Outra vantagem é ser Enterprise, bem esse conseito inútil é muito respeitado belas grandes empresas, onde ter uma aplicação em uma linguagem conhecida é muito mais aceitavel que ter uma aplicação melhor em uma linguagem pouco conhecida, quando voce tem um programa Ruby sendo executado sobre a JVM, o programa normalmente é mais aceito. Sem falar que a maioria das empresas que exigem coisas Enterprise não sabem nada sobre tecnologia e seguem o fluxo de todas as outras, e ter a SUM dizendo que acredita em Ruby ja as deixa mais calmas e conformadas, eu sei que isso não é nenhum parametro tecnico mais é muito usado no mundo doente dos Enterprise.</p>
<p>O bom efeito colateral em usar JRuby é a possibilidade de usar toda as Bibliotecas, APIs, escritas em Java em seus programas Ruby, isso é legal até certo ponto, porém em alguns casos reduz a curva de resistencia em se usar uma nova linguagem, onde os programadores Java podem continuar usando sua bibliotecas Java em vez de ter que reescreve-las em Ruby, bem só o futuro dirá se isso é realmente uma boa idéias, eu escrevi um outro artigo falando sobre isso deem uma lida. <a title="Da Vinci Machine Project!" href="http://www.amapaonrails.org/?p=41">Da Vinci Machine Project</a>!</p>
<p><img class="alignnone" src="http://www.lednerd.com/wp-content/uploads/2007/05/ms_ruby.jpg" alt="" width="123" height="109" /></p>
<p><strong>IronRuby</strong></p>
<p>A idéia do IronRuby é fazer que o interpretador .NET da Microsoft reconheça código Ruby, este projeto também é mantido pela comunidade e própria Microsoft. Bem por mais estranho que pareça este projeto deveria ser bem melhor que o projeto JRuby, levando em conta que a VM .NET da Microsoft é bem mais preparada para executar linguagem dinamicas como Ruby. Porém é um projeto apagado e sem muitas grandes novidades, talvez pela antipatica que a comunidade retem pela Microsoft. Existem outras coisas, o projeto .NET é proprietário, fechado bem ao estilo Micro$oft, porém existe um outro projeto que é o Mono que nada mais é que a implementação da VM .NET em software livre, e o IronRuby é capaz de rodar também sobre Mono, mais mesmo assim a projeto IronRUby não decolou ainda, mais eu acredito bastante que seja viavél talvez não seja a melhor opção hoje mais no futuro pode se tornar algo interessante</p>
<p><img class="alignnone" src="http://www.infoq.com/resource/interviews/bryant-smalltalk-dabbledb/en/smallimage/AviBryant.jpg;jsessionid=3EC3DFA83B39858E6A65C84019E79B4019E79B40" alt="" width="100" height="98" /></p>
<p><strong>MagLev<br />
</strong></p>
<p>Uma estrela cadente! Talves essa seja a melhor imagem para descrever o Maglev. A idéia do Maglev e fazer o Interpretador GemsStone de Smalltalk reconhecer código Ruby. Essa idéia veio de Avi Bryant, o cara é muito bom. Tudo começou em um tempo em que a comunidade Ruby vinha sofrendo com a frase &#8220;Rails não escala&#8221;, e Avi Bryant disse, &#8220;Eu vim do futuro e sei como isso acaba&#8221;. Após isso ele me aparece na RubyConf com nada mais nada menos que a Maglev, puxou o Datashow e rodou alguns códigos Ruby sobre a GemStone, o que mais assuntou é que a Maglev chegou a ser 60 vezes mais rápida que o MRI, e algumas grandezas mais rápida que o JRuby. Isso criou um clima estranho, pois centenas de programadores estavam se dedicando em fazer o Jruby que é 2 ou 3 vezes mais rápido que MRI, ou Rubinus que é algumas vezes mais lento que o MRI.</p>
<p>Bem o mais legal é que Smalltalk e uma linguagem dinamica como Ruby, entao um interpretador de Smalltalk e quase a mesma coisa que um interpretador de Ruby, isso torna as coisas muito mais simples de serem feitas, diferente de Jruby que tem que fazer uma JVM interpretar código dinamico, que é muito dificil, a GemStone foi facilmente adaptada para rodar código Ruby com a mesma eficiencia que roda código SmallTalk.</p>
<p>O ruim de tudo isso é que a GemStone é um VM proprietária e tem custo para usa-la, e nao tem o código fonte aberto, tal como o MRI, JVM, Rubinus. Isso me preocupa, mais voltando ao pensamento Interprise pode ser uma solução viável apra alguma empresas.</p>
<p>Bem mais nem tudo são flores, o Avi Bryant, foi mostro o Maglev na RubyConf e depois sumiu, eu venho buscando mais coisas sobre Maglev e nao veja nada na comunidade, talvez seja esse o plano deles ser bombático sempre, mais isso deixa a gente sem rumo, ou pode ser que o projeto ta meio parado mesmo, bem vamos vem.</p>
<p>Este são os projetos mais conhecidos de Interpretadores e VM Ruby. Como o Ruby é OpenSource quanquer pessoa pode pegar o MRI e fazer algumas modificações, sendo assim pode existir vários outros projetos ai que eu não conheço, mais acredito que esses sejam os mais relevantes. Depois a gente fala mais sobre VM, para deixar mais claro as diferenças e caracteristicas de cada VM Ruby tais como Rubinius, Jruby, IronRuby, Maglev.</p>
<p>Valeu!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=48</wfw:commentRss>
		</item>
		<item>
		<title>O Projeto Da Vinci VM!!</title>
		<link>http://www.amapaonrails.org/?p=41</link>
		<comments>http://www.amapaonrails.org/?p=41#comments</comments>
		<pubDate>Sun, 19 Oct 2008 20:44:09 +0000</pubDate>
		<dc:creator>isaacguerra</dc:creator>
		
		<category><![CDATA[JRuby]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.amapaonrails.org/?p=41</guid>
		<description><![CDATA[
A Proxima Grande Revolução da Informática!
De Tempos em Tempos acontecem algumas coisas que mudam o mundo de maneira tão grande que é impossível tentar prever as coisas depois da mudança, e também após a mudança fica dificil lembrar como viviamos sem ela. Bem são essas mudanças que mudam o rumo de nossas vidas e torna [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignleft" style="width: 259px"><img title="Da Vinci" src="http://openjdk.java.net/projects/mlvm/images/helicopter.png" alt="Da Vinci" width="249" height="177" /><p class="wp-caption-text">Da Vinci</p></div>
<p>A Proxima Grande Revolução da Informática!</p>
<p>De Tempos em Tempos acontecem algumas coisas que mudam o mundo de maneira tão grande que é impossível tentar prever as coisas depois da mudança, e também após a mudança fica dificil lembrar como viviamos sem ela. Bem são essas mudanças que mudam o rumo de nossas vidas e torna o mundo diferente.</p>
<p>Talvez voce esteja se perguntando, do que o IsaacGuerra ta falando! Que mudança é essa?</p>
<div class="wp-caption alignright" style="width: 252px"><img title="Revoluçãoda Tecnologia" src="http://www.caglecartoons.com/images/preview/%7B0884C37F-FB3F-49B1-971A-FECD2BE55DAF%7D.gif" alt="Revolução da Tecnologia" width="242" height="215" /><p class="wp-caption-text">Revolução da Tecnologia</p></div>
<p>Sim eu vejo um projeto que pode mudar o modo em que programamos e tratamos a programação!</p>
<p>Só o simples pensamento de que a maioria das coisas que fazemos pode ser bem mais fácil, que  tudo que criamos pode ser mais acessível, ja cria em mim um anseio e uma esperança que me faz ter curiosidade e um pouco de medo do futuro.</p>
<p>Bem vamos falar de programação!! de Código que é o que interessa!</p>
<p>Hoje com certeza vivemos uma mudança interessante mais muito timida da forma que programamos, com o aparecimento de linguagens mais gostosas como Ruby, Smalltalk, Phyton, etc.. Porém, como o Fabio King sempre diz, nao existe a linguagem completa que resolve tudo que agrega em si a solução total para todos os problemas e isso.</p>
<p>É isso que eu busco em uma liguagem, algo que eu possa nao escrer tudo em uma boa linguagem e sim que eu possa usar a linguagem certa na hora certa, onde tudo que eu fizer seja cambiavel entre elas, sem nenhum transtorno. Neste sentido eu busqui muito, hoje eu acedito que possamos fazer muita coisa em muitas linguagens legais, tais como C, C#, PHP, JAVA, RUBY, PHYTON, PERL, LISP, SMALLTALK, JAVASCRIPT, etc.. Em si toda linguagem faz alguma coisa de bom, agrega em amlgum ponto algo memorável e que ajuda o programador fazer algo.</p>
<p>Porem por mais que eu tenha procurado uma linguagem que faça tudo da melhor maneira ainda nao encontrei. Bem mais foi quando eu vi algumas coisas acontecerem meio timidas e elas foram se encaixando e mostrando que este sonho, o sonho de poder juntar tudo varias linguagens em uam só, nde seis Conponentes, APIs, Bibliotecas sejam cambiaves. Bem eu esperava a linguagem completa mais nao é isso que vai ser.</p>
<p>A Algum tempo a SUM a mantenedora do JAVA abriu o fonte de sua maquina virtual, isso nao foi bombastico nem muita novidade, porém, de alguma forma esse movimento esta mudando o mundo. Na verdade o JAVA e um conjunto de tecnologia sendo RunTime, SDK e linguagem, onde a pior parte de tudo isso com certeza e a linguagem, porém a Maquina Virtual ja tem mais de dez anos e muitos bilhoes de dolares de grandes empresas investidos em otimiza-la, com isso criu-se um ambiente seguro e confiável. Bem mais onde entra e revolução.</p>
<p>Notem que a JVM ja e Multiplataforma agora o grande esforço é que ela seja multilinguagem, onde todas linguagens de ante mao ganham o poder de serem multiplatafor, ganham também o poder e as otimizações do Ambiente Java, e por fim o melhor onde as APIs e bibliotecas ja escritas podem ser consumidas por qualquer Linguagem. Bem isso é legal e dizer que eu posso a partir do Phyton acessar um recurso escrito em Java, bem isso e legal, mais o mais legal e que algo escrito em Ruby seja acessivel em Java, e assim por diante, ou seja todos os recursos escritos habitarem um ambente comum e ser acessível por qualquer linguagem, com isso todo esforço será reusado.</p>
<p>Isso e diser que suas bibliotecas escritas hoje possam ser usadas nas proximas linguagens que vc quiser usar, e entendender que seu programa pode ser escrito por várias linguagens onde cada linguagem faça o que tem de melhor e por fim o seu sistema seja melhor.</p>
<p>Bem esse projeto ja existe e se chama &#8220;Da Vinci Machine Project&#8221;.</p>
<p>Uma linguagem que foi extremamente importante para o inicio do projeto Da Vinci foi Ruby com o JRuby, onde é possivel rodar aplicações Ruby sobre a VM Java, e mais legal e poder usar todas as bibliotecas escrita em Java em Ruby, bem é interessante também para equipes multidisciplinares, com a possibilidade de escrita em várias linguagens não obriga a equipe escrever tudo na mesma linguagem. Bem eu vou continuar esse assumto com mais dados tecnicos, falando mais sobre HotSpot, JIT, GC, etc.</p>
<p>Valeu!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amapaonrails.org/?feed=rss2&amp;p=41</wfw:commentRss>
		</item>
	</channel>
</rss>
