Criando backups de DVDs

21/11/06

Quem tem criança pequena em casa sabe como é quase impossível ter DVDs sem riscos. Como o meu filho é mestre na arte de destruir DVDs, sempre deixo o backup com ele, ao invés dos originais.

O DVD da semana é o Carros. Normalmente uso o DVD Shrink, mas este DVD veio com uma proteção contra cópias. Se você tentar copiar um DVD protegido, o DVD Shrink irá demorar uma eternidade para fazer a leitura e não conseguirá extrair os arquivos necessários. Mas com o DVD Decrypter fica muito fácil!

Primeiro, precisamos gerar uma imagem do DVD. Abra o programa e selecione a opção Mode > ISO > Read e depois clique no botão "Decrypt".

DVD Decrypt

Ele irá gerar uma imagem de aproximadamente 7GB, então não será possível realizar a gravação através do próprio DVD Decrypt. Mas agora o DVD Shrink conseguirá extrair os arquivos da imagem que criamos, pois ela não contém a proteção contra cópia. Então, teremos que montar a imagem utilizando o DAEMON Tools.

Após instalá-lo, rode-o através do ícone adicionado na área de trabalho. Ele irá aparecer no tray.

Daemon Tools no tray

Clique com o direito do mouse e selecione a opção Virtual CD/DVD-ROM > Set number of devices > 1 drive. Ele irá adicionar um drive virtual de DVD ao seu sistema. Agora, basta montar o DVD utilizando a opção Virtual CD/DVD-Rom > Device 0: [F:] No media > Mount image.

Abra novamente o DVD Shrink e clique em "Open Disc". Selecione o drive que você acabou de montar. Após ele fazer a leitura, basta clicar em "Backup".

DVD Shrink

Pronto! Seu filho pode detonar o DVD de R$2,00 ao invés do de R$50,00!

Atenção: pirataria é crime e totalmente desaconselhada. Apenas crie backup caso você possua o DVD original.

Removendo a div fieldWithErrors no Rails

20/11/06

Se você odeia aquela div (aquela que tem a classe fieldWithErrors) que o Ruby on Rails adiciona quando um campo é inválido, experimente adicionar isto ao seu arquivo conf/environment.rb:

ActionView::Base.field_error_proc = Proc.new { |html_tag, instance| "#{html_tag}" }

Localização de mensagens de erro e datas no Rails

20/11/06

O pessoal da 37signals já apontou que não tem muito interesse em tornar o Ruby on Rails localizado. Até entendo o lado deles, já que estão muito mais preocupados em desenvolver seus próprios aplicativos web. Enquanto isso, existem alguns projetos de localização do Rails, como os plugins Globalize e GLoc. Mas se você não precisa do suporte total à localização (apenas datas e o texto da validação), veja como pode resolver este problema.

Datas

No arquivo config/environment.rb de seu projeto, adicione o seguinte código:

# Include your application configuration below
Date::MONTHNAMES = [nil] + %w(Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro)
Date::DAYNAMES = %w(Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado)
Date::ABBR_MONTHNAMES = [nil] + %w(Jan Fev Mar Abr Mai Jun Jul Aug Set Out Nov Dez)
Date::ABBR_DAYNAMES = %w(Dom Seg Ter Qua Qui Sex Sab)
 
Time::MONTHNAMES = Date::MONTHNAMES
Time::DAYNAMES = Date::DAYNAMES
Time::ABBR_MONTHNAMES = Date::ABBR_MONTHNAMES
Time::ABBR_DAYNAMES = Date::ABBR_DAYNAMES

Mensagens de erro

Eu não gosto da maneira como o Rails exibe as mensagens de erro. Particularmente, prefiro exibir as mensagens de erro dentro de uma dl. Então, modifiquei a maneira como são exibidas as mensagens. Seu arquivo app/helpers/application_helper.rb deve ficar da seguinte maneira:

# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper
  def error_messages_for(object_name, options = {})
    options = options.symbolize_keys
    object = instance_variable_get("@#{object_name}")
    unless object.errors.empty?
      items = []
      object.errors.each { |attribute, message| items << content_tag("dd", message) }
      content_tag("dl",
        content_tag("dt", "Para prosseguir, verifique os itens abaixo:") +
        items.join(""),
        "id" => options[:id] || "error", "class" => options[:class] || "error"
      )
    end
  end
end

Update: Saiu a versão 1.2 RC1 do Ruby on Rails. O mais interessante é que Rails oferecerá suporte nativo a Unicode. Dê uma olhada no anúncio oficial. Se for muito preguiçoso, veja a versão traduzida pelo Akita.

Update 2: Não sei o porquê, mas hoje a substituição feita na classe Time parou de funcionar. Se você enfrentar o mesmo problema, substitua pelo código abaixo. Visto em poocs.net

class Time
  alias :strftime_nolocale :strftime
 
  def strftime(format)
    format = format.dup
    format.gsub!(/%a/, Date::ABBR_DAYNAMES[self.wday])
    format.gsub!(/%A/, Date::DAYNAMES[self.wday])
    format.gsub!(/%b/, Date::ABBR_MONTHNAMES[self.mon])
    format.gsub!(/%B/, Date::MONTHNAMES[self.mon])
    self.strftime_nolocale(format)
  end
end