1

Gerando um hash MD5 no Rails

O código para calcular o hash MD5 de um valor no Rails é muito simples. Veja um exemplo:

Digest::MD5.hexdigest "texto"

Neste exemplo, será calculado o md5 da palavra “texto”.

Você pode criar uma função que retorne o resultado dessa operação para facilitar o uso da mesma. Exemplo:

def md5(valor)
    Digest::MD5.hexdigest valor
end

Simples assim, como deveria ser.

Unforgettable

O Flex, o Rails e o FMS (embutidos em alguns projetos) estão devorando todo o meu tempo. Para tirar as “teias de aranha” do blog, estou postando a letra de uma música de Nat King Cole, Unforgettable, antiga, mas muito, muito boa.

Unforgettable, that’s what you are
Unforgettable though near or far
Like a song of love that clings to me
How the thought of you does things to me
Never before has someone been more

Unforgettable in every way
And forever more, that’s how you’ll stay
That’s why, darling, it’s incredible
That someone so unforgettable
Thinks that I am unforgettable too

Unforgettable in every way
And forever more, that’s how you’ll stay
That’s why, darling, it’s incredible
That someone so unforgettable
Thinks that I am unforgettable too

Como *não* elaborar uma mensagem de erro

Em design de interfaces, sempre existe um cuidado específico com a elaboração de mensagens de erro. Elas devem ser claras e objetivas, não podem assustar o usuário (ex: “ERRO FATAL”) e nem culpá-lo (ex: “Esta ação é proibida. Tente outra alternativa.”), e devem, no mínimo, dar uma idéia clara do aconteceu e, se possível, indicar uma solução.

Me lembrei desse conceito quando vi uma mensagem de erro apresentada pelo GIMP (editor de imagens um pouco parecido com o Photoshop, porém free). Eu estava montando um gif animado com dois frames para colocar em uma aplicação. Coisa simples. Na hora de salvar, especifiquei o delay entre os frames, o local onde o arquivo deveria ser salvo e cliquei em Salvar. o programa me apresentou a seguinte tela:

Estranha mensagem de erro do GIMP

Confesso que fiquei assustado, confuso e frustrado: assustado por imaginar que um mísero gif de 1KB poderia devorar os dois núcleos do processador ou todos os 2GB do PC que eu estava usando. Confuso porque não tive a capacidade de entender ou imaginar o que poderia ter ocorrido, muito menos uma provável solução. E frustrado porque eu não sabia se o arquivo havia sido salvo ou não.

Olhei a pasta de destino do arquivo, e lá estava ele, salvo. Porém ele não estava são: tinha virado uma combinação dos frames que eu havia colocado no arquivo, ao invés de virar uma animação.

Como a parte de design não é a minha “praia”, criei coragem e voltei a me aventurar pelos menus e opções do programa. Marquei algumas opções que acreditei que poderiam resolver meu problema e mandei salvar novamente. Desta vez, sem nenhuma mensagem de suspeita de erro.

No final das contas, consegui criar o meu arquivo do jeito que eu queria. E também encontrei um bom exemplo do que não deve ser feito ao compor uma mensagem de erro.

Ainda bem que deu tempo terminar o trabalho antes que o PC fosse dominado pelo lado negro da força … 😉

18

Error #2032: Stream Error.

Um dia você ainda vai se deparar com o seguinte erro na sua aplicação Flex:
Error #2032: Stream Error.

Quando esse erro aí acontece, é porque o seu HttpService não está conseguindo chegar à url especificada, por qualquer motivo, por mais idiota que ele possa parecer …

O que eu quero dizer com “por mais idiota que ele possa parecer” é o que aconteceu comigo: sem eu perceber, a droga do o IE marcou a opção pra trabalhar off-line (eu estava com o cabo do speedy desconectado) … e por isso o HttpService não conseguia chegar ao servidor web, que estava na minha própria máquina
(Esse é aquele tipo de erro que deixa você com vontade de sair chutando cachorro depois de descobri-lo…)

Outras causas para esse erro podem ser: servidor indisponível, url incorreta (página inexistente) e cache do browser (só tenho notícia desse último caso no IE6). Para evitar esse problema do cache, podemos criar um parâmetro que não será usado no backend, que conterá um número randômico. Esse “workaround” (aka POG) resolve o problema do cache.

Pluralização “irregular”

A pluralização dos models no Rails é baseado na gramática da língua inglesa. Dessa forma, um model chamado user terá uma tabela chamada users, um model person terá uma tabela people e assim por diante.

No caso dos plurais “irregulares”, como é o caso do person <-> people, é que podemos ter problemas ao usar nomes de modelos em português. Por exemplo, se criarmos um model computador, o rails criará a tabela computadors ao invés de computadores. Ele simplesmente coloca um “s” no final do nome do model quando ele não sabe pluralizar a palavra.

Para isso, podemos configurar o inflector do Rails para que ele saiba como pluralizar algumas palavras. Como fazer isso:

No Rails < 2.0, descomente e modifique o seguinte trecho de código no seu arquivo config/environment.rb (procure o trecho comentado, não tem como você colocar no lugar errado)

Inflector.inflections do |inflect|
inflect.irregular 'computador', 'computadores'
end

No Rails >= 2.0 esse trecho de código fica no arquivo config/initializers/inflections.rb.

Traduzindo o texto do preloader no Flex 3

Em uma aplicação feita toda em português, fica chato o cliente ver o preloader mostrando “Loading” e “Initializing” … dá a impressão que copiamos o software de alguém! 🙂

Para traduzir essas duas palavras que aparecem durante o carregamento, é necessário criar uma classe em AS que estenda a classe DownloadProgressBar, e informá-la como o preloader da sua aplicação. Dessa forma, sua classe ficaria assim:

[as] package
{
import mx.preloaders.DownloadProgressBar;

public class MeuPreloader
extends DownloadProgressBar
{
public function MeuPreloader()
{
super();
downloadingLabel = “Carregando …”;
initializingLabel = “Inicializando”;
}

}
}
[/as]

E o MXML da sua aplicação ficaria mais ou menos assim:

[as]

layout=”absolute”
width=”200″ height=”200″
preloader=”MeuPreloader”>
[/as]

Vale lembrar que o preloader pode ser completamente customizado, incluindo as cores, logo e até um ProgressBar diferente. Você pode ver exemplos disso aqui, aqui e aqui

(Este artigo foi inspirado no artigo da DClick que trata do mesmo assunto. Eu ia colocar somente um link para o site deles, mas vai que por um motivo qualquer o site muda, ou a página é excluída, sei lá … mas ficam aqui os créditos!)

Integrando todos os compromissos do Palm

Quem usa o Palm para organizar o dia-a-dia já deve ter percebido que, apesar de ter diversas funções à disposição, elas são muito desconexas.

Um exemplo claro é a relação entre a agenda e a lista de tarefas (To-Do). Ao determinar a data de uma tarefa, ela não aparece no calendário (o que seria ótimo). Isso obriga você a ter que visitar, diariamente, o calendário e a lista de tarefas. A não ser que você configure alarmes para tudo. Isso se torna outro inconveniente, porque teu Palm vai ficar apitando o dia inteiro, que nem um papagaio louco.

Lidando com esse problema, encontrei uma solução: o Agendus for Palm, da Iambic. Ele integra tudo, provê outras funcionalidades e deixa tudo mais fácil.

Um exemplo é a possibilidade de mostrar as tarefas junto com o calendário, situação que comentei anteriormente. Ele é em português e tem diversas funcionalidades, que vão além do necessário.

Com ele é possível anexar arquivos às atividades, criar conexões com usuários da lista de contatos, gravar uma mensagem de áudio, editar uma anotação à mão, enfim, uma série de possibilidades, atrelando tudo a uma única atividade.

O software custa cerca de US$ 40. É possível baixar uma versão trial no site da Iambic.

GMail com diversas assinaturas

Aqui vai uma dica para quem usa o GMail com múltiplas contas e precisa personalizar a assinatura de cada uma delas: Gmail HTML Signatures.

É um script do Greasemonkey (para Firefox) que permite cadastrar uma assinatura em HTML diferente para cada conta! Quando você seleciona a conta com a qual deseja enviar uma mensagem, ele te dá a opção de cadastrar uma nova assinatura (caso não exista uma) ou editar a assinatura existente.

O script foi criado por Jerome Dane e pode ser baixado aqui.

Thank you, Jerome!

18

Eventos personalizados no Flex

Há um certo tempo tenho visto muita gente com uma certa dificuldade em desenvolver códigos com fraco acoplamento (baixa dependência entre objetos) nos fóruns e listas de discussão. No Flex, um tema ligado a isso é a construção de componentes, que envolve uma série de conceitos, inclusive a criação de eventos personalizados. É sobre isso que vou falar nesse artigo.

Os Custom Events são, como o nome diz, eventos personalizados (ohhh!!!). Uma das vantagem de criar eventos personalizados é a possibilidade de fazer com que um evento disparado carregue consigo uma determinada propriedade (ou várias delas) referentes ao evento ocorrido.

Imagine a seguinte situação: você tem um componente em MXML chamado Teste (caso tenham um nome mais criativo, coloquem nos comentários! :)), e ele tem um botão, que vai incrementar o valor de uma variável privada. O código seria mais ou menos assim (o label serve só pra mostrar o valor da variável):
Read More