Novidades Rails E Mootools

Julho, 4 - 2008

Pessoal, está muito dificil continuar mantendo o blog, estou totalmente sem tempo, as postagens já diminuiram consideravelmente. Peço desculpas e paciência a todos que lêem (liam) o blog, um dia voltarei ao ritmo de antes. Mas para não deixar passar, vou deixar links para dois assuntos sobre os quais eu queria falar mas não consegui:


Método Para Traduzir String

Maio, 2 - 2008

Sempre pensei em um método que traduzisse uma String, na linguagem mesmo, encapsulado, sem precisar de classes de terceiros, etc. Há algum tempo atrás resolvi fazê-lo em Ruby e ficou guardado um bom tempo, até eu realmente precisar usá-lo, aproveito e mostro a vocês.


require "net/http";
require "uri";
require "hpricot";

class String

  def translate(from, to, opts={})
    params = {
      "text" => self,
      "langpair" => "#{from}|#{to}",
      "ie" => opts.delete(:encode) || "UTF-8",
      "hl" => "pt-BR"
    }.merge(opts);
    text = Net::HTTP.post_form(URI.parse("http://translate.google.com/translate_t"), params).body;
    Hpricot(text).search("#result_box").inner_html;
  end

end

"A simple text to be translated".translate(:en, :pt);  #=> "Um simples texto a ser traduzido"

Ele faz uma consulta ao Google Tradutor e retorna o resultado traduzido. O primeiro parâmetro é a abreviação da língua na qual a String foi escrita e o segundo a língua para qual ela será traduzida, há também um terceiro, um hash com dados a serem enviados via POST. Ele usa a biblioteca Hpricot para buscar o trecho correspondente à tradução no documento HTML, poderia ser feito com expressões regulares, mas ficaria feio.


Diz Que Até Não É Um Mau Blog

Março, 17 - 2008

O Júlio Greff nomeou meu blog como uma de suas referências. Valew Júlio, muito obrigado, e tomara que um dia meu blog chegue a altura do seu! Como parte do meme, tenho que indicar blogs dignos de tal “selo”:

Termino por aqui, esses blogs são muito bons, vale a pena dar uma conferida!


RadRails 1.0 Lançado

Março, 17 - 2008

Há algum tempo foi lançada a versão 1.0 do RadRails, que agora faz parte do projeto Aptana. A vantagem é que o Aptana já era uma ótima IDE para XHTML, CSS e Javascript, depois que integrou o RadRails e suporte a PHP ficou melhor ainda. Nessa nova versão do RadRails vieram algumas melhorias e acertos, além de uma interface um pouco melhorada. Algumas das novas funcionalidades:

  • Suporte ao Rails 2.0
  • Suporte a JRuby nativo (viva!)
  • Aba de vizualização RDoc
  • Code Completion agora sugere argumentos de métodos

O suporte, via IDE, dos servidores foi melhorado, agora eles iniciam automáticamente com a criação do projeto. Falando nisso, a tela de criação de projeto melhorou, foram adicionadas novas opções muito úteis como a versão do Rails que vai ser usada no projeto, o tipo de banco de dados (fim do sqlite como default), e os servidores que serão criados. Novo Rails Shell, para quem prefere usar a linha de comando às janelas da IDE. Vale a pena conferir!

Para instalar/atualizar o RadRails no Aptana: Help > Software Updates > Find and Install… > Search for new features to install > Next > Selecione “Aptana: RadRails Development Enviroment” > Finish


Efeitos Na Mootools

Março, 12 - 2008

Voltei pessoal! E falando da Mootools, que andei estudando recentemente, mais especificamente sobre efeitos, uma parte muito divertida e legal.
Os efeitos na Mootools são divididos em algumas classes, que estão dentro de Fx, cada uma delas com um objetivo diferente. Falarei hoje nesse post da Fx.Style, Fx.Styles e inevitávelmente da Fx.Transitions, as duas primeiras basicamente mudam uma propriedade de estilo CSS gradualmente ao longo de um tempo de acordo com uma determinada transição, que está contida dentro da última classe referida. A principal diferença entre as duas classes é que a primeira só aplica efeito sobre uma propriedade e a segunda sobre mais de uma propriedade, as duas relacionadas a um elemento.

Transições

A classe Fx.Transitions nos fornece uma lista de transições, que alterarão a animação, para serem usadas em nossos efeitos. Transições são responsáveis por modificar os valores intermediarios entre o inicio e o fim de uma animação. Por exemplo, quando se quer modificar a largura de um elemento de 10 a 15 pixels, a transição será responsável por definir que, por exemplo, no 300º milissegundo da animação a largura terá 12 pixels. Cada transição, exceto a linear, contem 3 opções de easing:

  • easeIn: o efeito é mais intenso no ínicio da animação
  • easeOut: o efeito é mais intenso no final da animação
  • easeInOut: o efeito é mais intenso no ínicio e no final

Escolhida a transição e o método easing, você pode obte-lá desse modo:


// Fx.Transitions.[tipo de transição].[método easing]
Fx.Transitions.Sine.easeInOut

A dica pra escolher a combinação certa é testando, verifique cada transição nesse demo de transições.

Alterando Uma Única Propriedade CSS Com Fx.Style

Primeiro nos precisamos decidir o elemento que receberá o efeito, depois disso temos dois meios de criar o efeito. O primeiro, clássico, usando o construtor, que aceita três argumentos: o primeiro o elemento em si, o segundo a propriedade CSS que será modificada e o terceiro uma lista de opções:


var obj = $("box");
var fx = new Fx.Style(obj, "height", {
	"transition": Fx.Transitions.Sine.easeInOut, // Transição a ser usada na animação
	"duration": 1000, // Duração em milissegundos
	"unit": "px", // Unidade usada para alterar a propriedade
	"wait": true, // Aguardar ou não a animação anterior de mesma instância para começar
	"fps": 50 // Quadros por segundo da animação, quanto maior melhor e mais lento
});

O segundo meio, que eu prefiro, é um atalho no próprio objeto (instância de Element), o método effect, que recebe os argumentos 2 e 3 iguais do construtor acima:


var obj = $("box");
var fx = obj.effect("height", {
	// Mesmas opções
});

Terminada a criação do efeito, temos que iniciá-lo efetivamente, para isso temos o método start. Ele aceita 1 ou 2 argumentos, no primeiro caso o primeiro argumento é o valor final da propriedade, o inicial será o valor atual:


fx.start(350); // O objeto terá a largura igual a 350 pixels no final

Já no segundo caso, o primeiro argumento é o valor inicial e o segundo o final:


fx.start(10, 350); // O objeto terá 10 pixels no ínicio do efeito e 350 depois de terminado

Dica: Se você for alterar a mesma propriedade várias vezes não crie uma nova instância a cada vez, use a que já foi criada e chame o método start pra cada efeito.
Pronto, bem mais legal do que mudar propriedades sem efeito, né?!

Alterando Várias Propriedades CSS Com Fx.Styles

Quase a mesma coisa que a classe Fx.Style, porém algumas diferenças. Continuamos com 2 meios de se obter a instância, ou pelo construtor, que aceita 2 argumentos iguais ao anterior: o elemento e as opções, a exeção é o nome da propriedade que será modificada, já que são mais de uma propriedades elas serão definidas na hora de iniciar o efeito:


var obj = $("box");
var fx = new Fx.Styles(obj, {
	// Mesmas opções
});

Ou pelo método effects do objeto:


var obj = $("box");
var fx = obj.effects({
	// Mesmas opções
});

Agora vamos iniciar o efeito, a diferença principal para Fx.Style é que é aqui que serão definidos os valroes das propriedades atrávez de um objeto (JSON):


fx.start({
	"height": 350, // Efeito iniciará com altura atual e terminará com 350 pixels
	"width": [10, 350], // Efeito iniciará com largura 10 pixels e terminará com 350 pixels
	"background-color": ["#FF0000", "#0000FF"], // Cor de fundo vermelha no início e azul no final
	"color": "#FFFFFF" // Cor do texto atual no início e branca no final
});

Como se pode perceber, se você fornecer um Array como valor da propriedade, o primeiro elemento será o valor para ser usado no início do efeito e o segundo no final, ou se fornecer somente um valor, esse será o valor final e o inicial será o valor atual da propriedade.
A mesma dica anterior também vale aqui, porém como aqui se modificam várias propriedades, a regra é: se você tiver que aplicar vários efeitos a um elemento várias vezes, use a mesma instância e chame o método start.

Viu como não é difícil brincar com a Mootools, gostei muito do suporte a efeitos, animações, esse tipo de coisa, é muito transparente, quem já implementou (ou tentou implementar) algo assim sabe como é difícil fazer um trabalho bem feito e ao mesmo tempo simples de se usar. Esse é um ponto forte da Mootools.

Flws pessoal, até a próxima!


Contando Troco No Ruby Quiz

Janeiro, 30 - 2008

Vindo do blog Nome Do Jogo, fiquei sabendo do novo desafio do Ruby Quiz. Há um tempo atrás acompanhava cada novo desafio, alguns que eu achava interessante, tentava resolvê-los, mas nunca cheguei a enviar a solução pra lá. Mas esse desafio é simples e bastante divertido.

O desafio é criar um método que recebe dois argumentos, um deles é um valor que deve ser dividido em moedas fornecidas no segundo argumento, o método tem que retornar um array com a menor combinação possível de moedas. Imagine ter que dar 37 centavos em moedas de 25, 10, 5 e 1? O certo seria receber uma de 25, uma de 10 e duas de 1, veja o código pra entender melhor:


irb(main):005:0> make_change(37, [25, 10, 5, 1])
=> [25, 10, 1, 1]

Entendeu?! Agora vamos implementar o método, somente o método, não farei nenhuma classe. Primeiro vamos fazer alguns testes antes de criar o método:


require "test/unit";

class ChangeTest < Test::Unit::TestCase

  def test_should_raise_error_when_change_is_impossible
    assert_raise(ChangeError) do
      make_change(23, [10, 5]);
    end
  end

  def test_should_accept_diferent_coins
    assert_equal [17, 17, 4], make_change(38, [17, 4]);
    assert_equal [52], make_change(52, [52]);
  end

  def test_should_give_minimun_number_of_coins
    assert_equal [25, 10, 1, 1], make_change(37);
    assert_equal [1, 1, 1], make_change(3);
    assert_equal [3, 3], make_change(6, [3]);
  end

end

Se a troca for impossível com as moedas fornecidas, o método vai devolver uma exceção do tipo ChangeError. O método também tem por default moedas de 25, 10, 5 e 1 para serem usadas. Feitos os testes, vamos partir para a implementação, para isso precisaremos adicionar um método sum na classe Array que soma os elementos de dentro do Array:


class Array

  def sum
    inject(0){|sum, n| sum + n;};
  end

end

Pronto, agora podemos partir para a implementação:


class ChangeError < StandardError; end

def make_change(amount, coins=[25, 10, 5, 1])
  change = coins.sort.reverse.inject([]) do |change, coin|
    change << coin until change.sum + coin > amount;
    change;
  end
  raise ChangeError unless change.sum == amount;
  change;
end

Na linha 4, eu ordeno o Array de maior para menor e uso o método inject, que é basicamente responsável por reduzir o Array a um valor. Nesse caso dentro do bloco de código eu coloco as moedas no Array change até que elas ultrapassarem o valor total, e devolvo esse Array. Na linha 8 eu checo se a soma do Array change é igual ao valor pedido, se não for retorna uma exceção ChangeError.

Não foi muito difícil, tem desafios mais elaborados no site, vale a pena dar uma conferida. Fiquei sabendo também que parece que esse é um dos últimos desafios do Ruby Quiz.

Powered by ScribeFire.


Ruby 1.9

Janeiro, 1 - 2008

Antes de tudo um feliz ano novo para todos! Como todos já devem saber o Ruby 1.9 já foi lançado, e como um presente de natal, justamente no dia 25. Como o próprio Matz disse, essa ainda não é uma versão totalmente estável e nem para ser usada em produção, não a receba como substituta do Ruby 1.8, ela é experimental ainda. Tivemos grande mudanças como YARV, threads nativas, mais splats de Arrays, UTF-8, métodos de Enumerable sem bloco e etc, veja mais mudanças e um tutorial para instalar o Ruby 1.9.

Powered by ScribeFire.


Internet Explorer 8 Nos Padrões

Dezembro, 20 - 2007


Esse vídeo não é falso (espero!), o Internet Explorer 8 passou no teste Acid2. Finalmente podemos ver uma luz no final do túnel em relação aos padrões e o Internet Explorer. Isso será um fato histórico se a versão final comprir o que promete. Há quanto tempo você xinga a Microsoft enquanto desenvolve um layout?! Isso vai acabar! Isso não quer dizer que usarei IE agora, nem perto disso, Firefox está a anos-luz dele, mas é uma notícia que merece ser comemorada. Fiquei sabendo no Revolução Etc, notícia original no site da evangelizadora dos padrões, que foi contratada pela Microsoft, Molly: Sim senhoras e senhores, nós temos um sorriso.

Powered by ScribeFire.


Rails 2.0 Chegou

Dezembro, 7 - 2007

Finalmente chegou o tão esperado Rails 2.0, na versão 2.0.1 com algumas correções de última hora. Muitas novidades chegaram, confira algumas aqui mesmo ou veja alguns vídeos sobre o Rails 2.0 no Railscasts (Simplificando Views com Rails 2.0, Fixtures no Rails 2.0 e Autenticação HTTP). Para instalar é só rodar:


gem install rails -y

Ou se o de cima não funcionar:


gem install rails -y --source http://gems.rubyonrails.org

Se a versão do RubyGems não for a mais nova pode estar dando erros (como aqui), então rode antes:


gem update --system

Prometo que voltarei a postar mais regularmente.

Powered by ScribeFire.


Aptana Studio 1.0

Outubro, 30 - 2007

Finalmente a fase beta do Aptana (agora Aptana Studio) acabou! Depois de dois anos de desenvolvimento e mais de 1 milhão de downloads, eles chegaram a versão 1.0. Agora o Aptana vem em duas versões, Community e Professional. Algumas das funcionalidades adicionadas:

  • Pré-visualização de CSS
  • Arrastar e soltar códigos
  • Tons da interface acabados
  • Sistema de ajuda dinâmico aperfeiçoado

O que realmente espero é que seja mais estável. Dá uma passada lá no site do Aptana, to baixando agora.

Powered by ScribeFire.


Quebra-Pau De Linguagens! Copa Do Mundo

Outubro, 16 - 2007

Galera, como havia dito anteriormente, o Webly lançou seu 1º Quebra-Pau De Linguagens. O objetivo é avaliar a linguagem e o programador. O tema é Copa Do Mundo, o participante deverá fazer um programa que crie jogos entre os 16 paises citados e defina os vencedores, fazer o mesmo com os vencedores até chegar ao campeão! A idéia foi do Luis, que participará também (acho). Me aguardem que também vou participar com Ruby e quem sabe Javascript também. Passem ! Se tudo der certo e muitos participarem faremos um campeonato!

Powered by ScribeFire.


Rails 2.0 Chegando

Outubro, 1 - 2007

Acabou de sair do Riding Rails o Preview Release do Rails 2.0. Antes de se lançarem a versão 2.0 final eles lançarão o Rails 1.2.4, que vai ter muitos bugs consertados e warnings de métodos deprecados para sua aplicação estar prontar para o novo Rails.
Nessa nova versão tivemos mudanças no ActionPack, não tantas no ActiveRecord, o ActiveWebService saiu e entrou ActiveResource, e etc. Praticamente o framework ficou mais limpo, mais coeso. Vou listar algumas delas que achei interessante la do post, lembrando que não testei nenhuma delas:

ActionPack

Organização Da View

Agora os templates tem um novo formato para serem nomeados, ele é action.formato.renderizador. Exemplos:

  • Páginas que serão renderizadas para HTML com o ERB: action.html.erb.
  • Usar o Builder que renderiza aquele XML para um feed: action.atom.builder.
  • Renderizar usando outro renderizador como o HAML: action.html.haml.

Tratamento de erros

Antes você redefinia um método para tratar os erros que ocorriam, tendo que fazer um case para identificar o tipo de cada erro. Agora você ganhou um método declarativo nos controles chamado rescue_from, que chama um determinado método para cada tipo de erro. Exemplo:


class PostsController < ApplicationController
  rescue_from User::NotAuthorized, :with => :deny_access

  protected
  def deny_access
    #...
  end
end

Sai O Paginator Clássico

O paginator clássico agora só está disponível como um plugin (classic_pagination), foi retirado do core do Rails. Aproveitando que ele saiu, aconselho vocês a usarem o plugin will_paginate.

ActiveRecord

Migrations Mais Atraentes

Agora ao invés de ter que ficar chamando column para cada novo atributo na coluna, você pode chamar o tipo do atributo (string, integer, datetime, etc.). Isso já implorava por um method_missing há um tempo, mais Ruby/Rails Like.
Antes você usava:


create_table :posts do |t|
  t.column :body, :string, :null => false;
  t.column :user_id, :integer;
  t.column :created_at, :datetime;
end

Agora pode usar:


create_table :posts do |t|
  t.string   :body, :null => false;
  t.integer  :user_id;
  t.datetime :created_at;
end

Alguns Quilos A Menos

Para deixar o ActiveRecord um pouco mais limpo removeram os acts_as_etc do core, eles estão disponíveis como plugins, para instalar o acts_as_list, por exemplo, é só rodar script/plugin install acts_as_list. Removeram também os adaptadores de bancos de dados comerciais, agora o Rails só vem com adaptadores para os bancos MySQL, SQLite e PostgreSQL. Mas se quiser usar os outros bancos, os adaptadores estão disponíveis como gems, para instalar o adaptador para o Oracle, por exemplo, é só dar um gem install activerecord-oracle-adapter.

Vale lembrar que ainda não é a versão final, algumas coisas ainda podem mudar. Ah, não precisa dizer que os métodos hoje deprecados serão eliminados. Essa nova versão promete ser mais estável, mais divertida e mais limpa.

Powered by ScribeFire.


Feeds Favoritos

Setembro, 23 - 2007

Mais um Meme hoje, hehe… Fui convidado pelo Rodrigo Fante do Fazedor De Site (ótimo blog por sinal) para listar os meus feeds favoritos, os que mais gosto e leio. Não caberia aqui citar todos os que gosto, ainda que não tenha muitos feeds, mas vou listar alguns deles:

É isso aew pessoal, vocês tem a obrigação de colocar estes blogs na sua lista de feeds, são muito bons. Os convidados pra dar continuidade são os que estão aí em cima e o Micox, no novo endereço dele.

Powered by ScribeFire.


The Power Of Schmooze Award

Setembro, 23 - 2007

Ok, ok, demoro, to com tempo apertado (juro!). Tem um tempo que o Júlio Greff me premiou com o The Power Of Schooze Award, é uma espécie de meme, vê lá no post dele que ele explica melhor hehe, você premia outros 5 blogs. Vlw Júlio! Ai vai a lista dos cinco:

  • Luis Henrique: Conhecia lá do GNUtopia, agora com blog novo.
  • Cau Guanabara: Já leio faz tempo, ótimos textos sobre Js.
  • Tomás: Comecei a acompanhar e gostei.
  • Leandro Mercês Xavier: Firefox e Javascript, ótimo blog, apesar de precisar de atualização, hehe.
  • O Torto: Pra discontrair, também precisa de um update.

Esses blogs são ótimos podem ter certeza. Se ainda não estão na sua lista de feeds deveriam estar.

Powered by ScribeFire.


Ganhe Dinheiro Com O Seu Tutorial

Setembro, 23 - 2007

Agora ficou fácil ganhar uma grana, é simples e pode te deixar rico (ok, sem exageros hehe), é só postar um tutorial (decente) no Webly, e colocar seu código do Google AdSense. Cada pessoa que ler o seu tutorial poderá clicar no seu anúncio, gerando ganhos em sua própria conta do AdSense. Não é ótimo? Imagine isso em um dos fóruns mais acessados sobre desenvolvimento e design na Web!

Corra e poste o seu!

Powered by ScribeFire.