Para quem usa HAML é mais que comum usar os filtros no código, por exemplo:

  :javascript
    alert('')

  :css
    body { background-color: #000; }

Já senti várias vezes a necessidade de alterar um destes filtros, especialmente porque tornam o código mais limpo.
Para criar um filtro é necessário apenas, montar um modulo e adicioná-lo ao filtros. Veja o exemplo:
#File: lib/meu_filtro.rb # O nome do arquivo não tem importância
module Haml
  module Filters
    module MeuFiltro #Nome do seu módulo
      include Base
      def render_with_options(text, options)
        #Aqui pode ser colocado qualquer execução para compilar seu texto
        "Ola #{text}! <=> !#{text.reverse} alO"
      end
    end
    Filters.defined['meu_filtro'] = MeuFiltro #Adicionando aos filtros do haml
  end
end

Feito isso agora é só incluí-lo nas suas dependências:
#File: config/application.rb
require "../lib/meu_filtro.rb"

E utilizá-lo na view.
  %br
    Abaixo vou utilizar meu filtro.
  :meu_filtro
    mundo
  :meu_filtro
    dannnylo

Assim você pode criar seus filtros pro haml e limpar mais ainda seu código.

O Imagemagick é uma ferramenta muito boa para alteração de imagens, e utilizando ele através do RMagick no Ruby é muito fácil remover o fundo de uma imagem, comparando-a com outra.
No exemplo temos as seguintes imagens:

Original

Fundo

Para remover o fundo é só utilizar o seguinte código:

    img  = Magick::Image.read("teste.png").first
    mask = Magick::Image.read("teste2.png").first
    img = img.composite mask, Magick::ForgetGravity, Magick::ChangeMaskCompositeOp
    img.write("imagem_sem_fundo.png")

Com isso será criada uma imagem com o fundo transparente se utilizado a constante Magick::ChangeMaskCompositeOp, existem outras constantes que geram resultados diferentes. Para mais opções veja a documentação aqui.

Uma funcionalidade adicionada na versão 4 do virtualbox e por sinal muito útil, é o redimensionamento de HDs que possuam expansão dinâmica , possibilitando aumentar o tamanho deles com um simples comando do console.

Caso você não tenha instalado ainda a versão 4 veja como fazer isso aqui.

Por exemplo para alterar um hd para 10G, deve-se utilizar a opção modifyhd com o parâmetro --resize, veja exemplo:

 

VBoxManage modifyhd Debian.vdi --resize 10240 

Obs: Os valores devem estar em megabytes.

Ao tentar atualizar o pidgin me deparei com uma incompatibilidade entre o pidgin-data e o pidgin-facebookchat referente a imagens do protocolo.
Apresentando o erro:

Preparando para substituir pidgin-data 1:2.7.7-1ubuntu0+pidgin1.10.10 (usando .../pidgin-data_1%3a2.7.9-1ubuntu0+pidgin1.10.10_all.deb) ...
Desempacotando substituto pidgin-data ...
dpkg: erro processando /var/cache/apt/archives/pidgin-data_1%3a2.7.9-1ubuntu0+pidgin1.10.10_all.deb (--unpack):
 tentando sobrescrever '/usr/share/pixmaps/pidgin/protocols/16/facebook.png', que também está no pacote pidgin-facebookchat 1.67.1-1
dpkg-deb: sub-processo colar foi morto por sinal (Canal quebrado)
Erros foram encontrados durante o processamento de:
 /var/cache/apt/archives/pidgin-data_1%3a2.7.9-1ubuntu0+pidgin1.10.10_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

O ubuntu sugeriu utilizar o comando:

    apt-get -f install

Porém ele o erro continua. Para resolver este erro é necessário instalar o pacote através do dpkg com a opção --force-overwrite, ficando assim o código:

    dpkg -i --force-overwrite  /var/cache/apt/archives/pidgin-data_1%3a2.7.9-1ubuntu0+pidgin1.10.10_all.deb

Possivelmente a versão do arquivo pode mudar, então atente a isso.
Espero ter ajudado.

Criei um script em ruby utilizando RMagick que redimensiona as imagens de um diretório, deixando-as com um tamanho máximo expecificado.
Para utilizá-lo é necessário apenas alterar a localização das pastas das variáveis from e to, podendo os dois serem o mesmo assim sobrescrevendo o arquivo.
Segue o código:

require "rubygems"
require "RMagick"
require "pathname"

#Diretório das imagens
from = Pathname.new("/var/www/images")
#Diretório destino
to = Pathname.new("/var/www/images/new_size")
#Tamanho máximo da imagem
max_size =  800
#Extensões permitidas
ext = [".jpg",".png",".gif"]

from.entries.each do |file|
  file = from.join(file.basename.to_s)
  #Ignorando diretórios
  next unless file.file?
  #Ignorando arquivos não permitidos
  next unless ext.include? file.extname

  begin
    image = Magick::ImageList.new(from.join(file.basename.to_s).to_s)[0]
    #Redimensionando se ela for maior do que o tamanho máximo
    image.resize_to_fit!(max_size) if image.columns > max_size || image.rows > max_size
    novo = to.join(file.basename.to_s).to_s
    #Gravando ela no novo arquivo
    image.write novo
  rescue=>e
    puts e
  end
end

Espero que tenham gostado.

Uma dica rápida, caso você precise rodar um comando Dos como outro usuário, por exemplo o administrador da máquina, é necessário executar o seguinte comando.

runas /profile /user:NOME_DO_USUARIO "COMANDO_DESEJADO"

Alterando o NOME_DO_USUARIO pelo nome do usuário desejado, caso seja do domínio use da seguinte forma NOME@DOMINIO ou DOMINIO/NOME.

Um exemplo seria este:

runas /profile /user:administrador "notepad teste.txt"

Com este comando consegue-se abrir o bloco de notas com as permissões de administrador.
Espero que tenham gostado.

Encontrei uma gem um tanto interessante a respeito de buscas Google a gem google-search. De uma forma simples e rápida pude pegar as informações das pesquisas e manipulá-las.
Ela utiliza a API disponibilizada pelo próprio google para realizar as pesquisas (veja aqui).
A instalação segue o padrão:

gem install google-search

Para todas as pesquisas podemos passar os seguintes parâmetros:

  • query – Texto para busca
  • language – Língua para a realização da pesquisa
  • safety_level – Define se o resultado será restrito. Os valores que podem ser atribuídos estão presentes na constante Google::Search::Web::SAFETY_LEVELS, que são os seguintes símbolos: active, moderate, off
  • filter – Define se retorna ou não resultados duplicados. (1 – Retorna duplicados. 0 – Não retorna duplicados.)

As formas possíveis de buscas são:

Google::Search::Web

Esta classe retorna os resultados da pesquisa Web do google, trazendo consigo os links dos sites.
Os registros retornados são da classe Google::Search::Item::Web o qual possui as seguintes informações:

  • uri – Endereço da página encontrada.
  • cache_uri – Endereço da página cacheada pelo Google.
  • title – Título da página.
  • content – Uma breve descrição do conteúdo.
  • thumbnail_uri – Url do thumbnail (caso exista).
  • thumbnail_height – Altura do thumbnail (caso exista).
  • thumbnail_width – Comprimento do thumbnail (caso exista).
  • visible_uri – Url visível.
  • index – Número do index.

Com estas opções são vastas as possibilidades, veja abaixo no caso de uma listagem básica.

require "rubygems"
require "google-search"

Google::Search::Web.new({:query=>"rails"}).each do |result|
  puts "#{result.title} - #{result.uri}"
end

Este código realiza uma pesquisa pelo termo rails e imprime os títulos e a url das páginas.

Google::Search::Blog

Esta classe tem como finalidade retornar os resultados referente a posts de blogs com o termo pesquisado.
Os registros retornados são da classe Google::Search::Item::Blog o qual possui as seguintes informações:

  • author – Nome do post
  • content – Uma breve descrição do conteúdo.
  • title – Título do resultado.
  • uri – Endereço do resultado.
  • blog_uri – Endereço do blog.
  • index – Número do index.
  • published – Data de publicação
  • thumbnail_uri – Url do thumbnail (caso exista).
  • thumbnail_height – Altura do thumbnail (caso exista).
  • thumbnail_width – Comprimento do thumbnail (caso exista).

Para a pesquisa em blogs podemos ter um exemplo básico, o qual lista o titulo e o autor que possuam a palavra ruby.

require "rubygems"
require "google-search"

Google::Search::Blog.new({:query=>"ruby"}).each do |result|
  puts "#{result.title} - #{result.author}"
end

Google::Search::Book

Esta classe tem como finalidade retornar os resultados referente a livros com o termo pesquisado.
Os registros retornados são da classe Google::Search::Item::Book o qual possui as seguintes informações:

  • author – Nome do autor
  • pages – Número de páginas
  • title – Título do livro.
  • id – Identificação do livro para o google,
  • uri – Endereço do livro no google.
  • index – Número do index.
  • published_year – Ano de publicação do livro
  • thumbnail_uri – Url do thumbnail (caso exista).
  • thumbnail_height – Altura do thumbnail (caso exista).
  • thumbnail_width – Comprimento do thumbnail (caso exista).
  • visible_uri – Url visível.

Para a pesquisa de livros podemos ter um exemplo básico, o qual lista o titulo e o número de páginas dos livros que possuam a palavra ruby.

require "rubygems"
require "google-search"

Google::Search::Book.new({:query=>"ruby"}).each do |result|
  puts "#{result.title} - #{result.pages.to_i}"
end

Google::Search::Image

Desenvolvida para pesquisa de Imagens com o termo informado.
Os registros retornados são da classe Google::Search::Item::Image o qual possui as seguintes informações:

  • title – Título da Imagem.
  • content – Uma breve descrição do conteúdo.
  • id – Identificação da imagem para o google
  • uri – Endereço da imagem no google.
  • context_uri – Endereço da página que contem a imagem.
  • height – Altura da imagem.
  • width – Comprimento da imagem.
  • index – Número do index.
  • thumbnail_uri – Url do thumbnail.
  • thumbnail_height – Altura do thumbnail.
  • thumbnail_width – Comprimento do thumbnail.
  • visible_uri – Url visível.

Um exemplo de utilização seria um script para baixar as 10 primeiras imagens referentes ao termo pesquisado.

require "rubygems"
require "google-search"
require "open-uri"

i = 0
Google::Search::Image.new({:query=>"ruby"}).each do |result|
  name = result.uri.split("/").last
  file = File.open(name.to_s,"w+")
  file.write open(result.uri).read
  file.close
  i += 1
  break if i == 10
end

Google::Search::Local

Esta classe retorna resultados da pesquisa de um termo, com posições geograficas e links para o google maps.
Os registros retornados são da classe Google::Search::Item::Local o qual possui as seguintes informações:

  • title – Título do resultado.
  • uri – Endereço do resultado.
  • thumbnail_uri – Url do thumbnail.
  • thumbnail_height – Altura do thumbnail.
  • thumbnail_width – Comprimento do thumbnail.
  • index – Número do index.
  • street_address – Endereço onde é localizado o resultado.
  • city – Cidade onde é localizado o resultado.
  • region – Estado onde é localizado o resultado.
  • country – País onde é localizado o resultado.
  • lat – Longitude do endereço.
  • long – Latitude do endereço.
  • phone_numbers – Números de telefone do resultado.
  • address_lines – Array com endereço completo.
  • directions_uri – Link para o google maps.
  • directions_from_here_uri – Como chegar partindo deste ponto.
  • directions_to_here_uri – Como chegar até este ponto.
  • viewport_mode – Modo de visualização.

Exemplo básico de pesquisa mostrando o titulo do resultado e a localização dele.

require "rubygems"
require "google-search"
require "active_support/core_ext"

Google::Search::Local.new({:query=>"ruby",:published=>"2010-01-01"}).each do |result|
  puts "#{result.title} - #{result.address_lines.join(" - ")}"
end

Google::Search::Patent

Particularmente não conhecia a busca de patentes do google e só através desta gem que fui conhecer. Esta classe tem como objetivo retornar os resultados da busca de patentes.
Os registros retornados são da classe Google::Search::Item::Patent o qual possui as seguintes informações:

  • id – Identificação da patente para o google
  • title – Título do patente.
  • content – Uma breve descrição do conteúdo.
  • uri – Endereço do patente no google.
  • assignee – Dono da patente
  • thumbnail_uri – Url do thumbnail.
  • thumbnail_height – Altura do thumbnail.
  • thumbnail_width – Comprimento do thumbnail.
  • application_date – Data de aplicação da patente.
  • status – Situação da patente.
  • index – Número do index.

Exemplo básico de pesquisa mostrando o titulo e o dono.

require "rubygems"
require "google-search"
require "active_support/core_ext"

Google::Search::Patent.new({:query=>"ruby",:published=>"2010-01-01"}).each do |result|
  puts "#{result.title} - #{result.assignee}"
end

Google::Search::Video

Esta classe tem como finalidade retornar os resultados referente a videos com o termo pesquisado.
Os registros retornados são da classe Google::Search::Item::Video o qual possui as seguintes informações:

  • title – Título do vídeo.
  • content – Uma breve descrição do conteúdo.
  • uri – Endereço do vídeo no google.
  • index – Número do index.
  • published – Data de publicação
  • thumbnail_uri – Url do thumbnail.
  • thumbnail_height – Altura do thumbnail.
  • thumbnail_width – Comprimento do thumbnail.
  • rating – Avaliação do vídeo.
  • publisher – Local no qual está publicado.
  • type – ID do Local no qual está publicado.
  • duration – Duração do vídeo em segundos.

Para a pesquisa de videos podemos ter um exemplo básico, o qual lista o título e data de publicação dos vídeos que possuam a palavra ruby.

require "rubygems"
require "google-search"
require "active_support/core_ext"

Google::Search::Video.new({:query=>"ruby",:published=>"2010-01-01"}).each do |result|
  puts "#{result.published.strftime("%Y-%m-%d %H:%M:%S")} - #{result.title}"
end

Assim terminando a explicação sobre as funcionalidades desta gem e com ela as possibilidades de aplicações são variadas, expecialmente se tratando de pesquisas com a gigante Google.

No GTK os eventos são sinais de cada objeto, estaremos vendo os principais sinais e como utilizá-los.
Para quem acompanhou os outros posts sobre janelas com GTK e Ruby, pode ter percebido que muitas vezes utilizei a linha:

window.signal_connect("destroy"){ Gtk.main_quit }

Este comando configura a janela para que ao receber o sinal “destroy” ela execute o comando passado no bloco. No caso acima, o comando fecha o GTK.

Para as janelas Gtk::Window os sinais mais comuns são:

  • destroy – Ao fechar a janela
  • move-focus – emitido ao trocar o foco entre os objetos da janela
  • set-focus – emitido ao dar foco a algum objeto da janela

A utilização dos sinais se resumem a passar uma string com o sinal e um bloco que deve ser executado ao receber o sinal.

require "gtk2"
Gtk.init
window = Gtk::Window.new
window.title = "Janela Exemplo"
window.signal_connect("destroy"){
  puts "destroy"
  Gtk.main_quit
}
#Ao trocar o foco pelo tab
window.signal_connect("move-focus"){|a,b| puts "move-focus #{b.inspect}"}
#Ao colocar foco em algo dentro da janela
window.signal_connect("set-focus"){|a,b| puts "set-focus #{b.inspect}"}

bt1 = Gtk::Button.new "ON"
bt2 = Gtk::Button.new "OFF"

container = Gtk::HBox.new(4)
container.add bt1
container.add bt2

window.add container
window.show_all
Gtk.main

Futuramente ao terminar sobre containers estarei falando dos seus sinais de evento.

Continuando com containers em GTK e Ruby, estarei mostrando mais 3 deles:
* Gtk::HButtonBox
* Gtk::VButtonBox
* Gtk::Fixed

Gtk::HButtonBox

Este container é muito parecido com o HBox, alinhando horizontalmente seus objetos horizontalmente. Sua principal diferença é que ao redimensionar a janela não é alterado o tamanho dos objetos adicionados nele.

require "gtk2"
Gtk.init
window = Gtk::Window.new
window.title = "Janela Exemplo"
window.signal_connect("destroy"){ Gtk.main_quit }

container = Gtk::HButtonBox.new

5.times { |i| container.add Gtk::Button.new "BT #{i}"  }

window.add container
window.show_all
Gtk.main

Gtk::VButtonBox

O VButtonBox é igual ao HButtonBox, com o diferencial de alinhar os objetos verticalmente.

require "gtk2"
Gtk.init
window = Gtk::Window.new
window.title = "Janela Exemplo"
window.signal_connect("destroy"){ Gtk.main_quit }

container = Gtk::VButtonBox.new

5.times { |i| container.add Gtk::Button.new "BT #{i}" }

window.add container
window.show_all
Gtk.main

Gtk::Fixed

Este é um container muito útil, pois ele possibilita o posicionamento dos objetos seguindo uma grade [X,Y]. Podendo assim distribuir como necessário, não importando ordem de adição. E ao contrário dos outros containers que mostrei para adicionar um objeto é necessário utilizar o método put, passando o objeto e a posição x,y.

require "gtk2"
Gtk.init
window = Gtk::Window.new
window.title = "Janela Exemplo"
window.signal_connect("destroy"){ Gtk.main_quit }

container = Gtk::Fixed.new
5.times { |i| container.put Gtk::Button.new("BT #{i}"),i*50,i*50 }

window.add container
window.show_all
Gtk.main

Para mais informações veja a api:
Gtk::HButtonBox,Gtk::VButtonBox, Gtk::Fixed

Espero que tenham gostado, em breve postarei mais.

Foi lançado a versão 3.0 final do Phusion Passenger (veja a notícia Aqui). Para atualizar o seu passenger para a nova versão siga o procedimento abaixo:

Instale a gem.

gem install passenger

Compile o módulo para o Apache

    passenger-install-apache2-module

Compile o módulo para ou Nginx

    passenger-install-nginx-module

Ao rodar o módulo do apache no Ubuntu 10.10 tive o seguinte erro:

    [Mon Oct 18 11:52:02 2010] [notice] child pid 21508 exit signal Segmentation fault (11)

Depois de algum tempo e algumas tentativas, desabilitei o mod rewrite e funcionou como magica.
Ainda não consegui fazer funcionar juntamente com o rewrite, se ele for necessário para suas outras aplicações é preferível continuar com a versão anterior.