Redimensionando imagens com Ruby e Image Science no Mac OS X

02/07/08

Se você precisa criar miniaturas de imagens com Ruby, esqueça o RMagick. Embora ele tenha muito mais funcionalidades que, convenhamos, quase ninguém usa, chegou a hora de conhecer o Image Science que, segundo seus autores, não sofre dos mesmos problemas de memory leak que o RMagick.

O Image Science possui algumas funções específicas para a geração de miniaturas, como redimensionamento e crop, utilizando o Free Image. Segundo os criadores do projeto, ele não sofre dos mesmos problemas de memory leak que RMagick.

Como instalar

Para instalar o Free Image, você precisará do XCode. Não se esqueça de adicionar o SDK para o Mac OS X 10.3.9, que não vem selecionado por padrão.

Tela de instalação do XCode

Instalando o Free Image

Baixe o código-fonte do Free Image na página do projeto SourceForge. A versão que instalei foi a 3.10.0.

Após extrair os arquivos, abra o arquivo "MakeFile.osx" e altere as linhas abaixo de

LIBRARIES_PPC = -Wl,-syslibroot /Developer/SDKs/MacOSX10.3.9.sdk 
LIBRARIES_I386 = -Wl,-syslibroot /Developer/SDKs/MacOSX10.4u.sdk

para

LIBRARIES_PPC = -Wl,-syslibroot /Developer/SDKs/MacOSX10.3.9.sdk/usr/lib 
LIBRARIES_I386 = -Wl,-syslibroot /Developer/SDKs/MacOSX10.4u.sdk/usr/lib

Agora, basta compilar!

make
sudo make install

Instalando o Image Science

Para finalizar, basta instalar o Image Science.

sudo gem install RubyInline
sudo gem install image_science

O Image Science é muito simples. Para redimensionar imagens proporcionalmente, limitando o maior tamanho, faça algo como o exemplo abaixo.

ImageScience.with_image(file) do |img|
  img.thumbnail(100) do |thumb|
    thumb.save "picture-thumb.jpg"
  end
end

Se você quiser redimensionar a imagem sem se preocupar com a proporção, você pode usar o método resize.

ImageScience.with_image(file) do |img|
  img.resize(100, 150) do |thumb|
    thumb.save "picture-thumb.jpg"
  end
end

E, por último, existe o método cropped_thumbnail, que recorta a imagem no tamanho especificado.

ImageScience.with_image(file) do |img|
  img.cropped_thumbnail(100) do |thumb|
    thumb.save "picture-thumb.jpg"
  end
end

Mudança no RSpec 1.1.4 remove inclusão automática de módulos

25/06/08

No RSpec 1.1.4, a inclusão de módulos deixou de ser automática. Você só irá perceber esta mudança se está testando algum módulo, como é o caso dos helpers.

Antes, você só precisava fazer algo como isto:

describe ApplicationHelper do
  it "should render flash[:notice]" do
    flash[:notice] = "Some notice"
    flash_messages.should have_tag('p.notice', 'Some notice')
  end
end

Nesta nova versão, se você tentar testar o método flash_messages, irá receber uma mensagem de aviso: Modules will no longer be automatically included in RSpec version 1.1.4. Called from ./spec/helpers/application_helper_spec.rb:6

A solução é fazer a inclusão manual dos módulos, como este exemplo

describe ApplicationHelper do
  include ApplicationHelper
 
  it "should render flash[:notice]" do
    flash[:notice] = "Some notice"
    flash_messages.should have_tag('p.notice', 'Some notice')
  end
end

ou utilizar o objeto helper, que possui todos os métodos do módulo especificado em describe

describe ApplicationHelper do
  it "should render flash[:notice]" do
    flash[:notice] = "Some notice"
    helper.flash_messages.should have_tag('p.notice', 'Some notice')
  end
end

Em um primeiro momento, eu não tinha gostado nem um pouco desta alteração, mas depois de ler os motivos, acho que ficou muito melhor. Você teria dúvidas de que está testando um helper se utilizar helper.flash_messages? E se você tivesse um módulo com um método describe? As respostas já justificam a alteração por si sós.

Otimizando o Autotest

20/06/08

Toda vez que executo o Autotest, não demora muito para o cooler do meu Macbook[bb] ligar e parecer que vai decolar! O problema é que o Autotest busca alterações nos arquivos a cada segundo, o que ocasiona um uso muito intenso da CPU.

Para resolver este problema, basta você aumentar este tempo de verificação que, no exemplo abaixo, foi definido como 5 segundos. Além disso, podemos ignorar alguns diretórios, diminuindo os arquivos que precisam ser verificados. Abra seu arquivo "~/.autotest" e adicione o código abaixo.

Autotest.add_hook :initialize do |at|
 at.sleep = 5
 %w{.svn .git public vendor}.each { |exception| at.add_exception(exception) }
end

Simples, rápido e, o melhor de tudo, silencioso!