Posts de August, 2009

[Fabio M Costa] New changed event

Thursday, August 13th, 2009

Have you ever had problems with the ‘change’ event? I did, in particular on text-inputs.

I’ll list the crazy behaviors i don’t like about it:

  • If you change the value of a text input and submit the actual form by pressing enter, on Opera the change event won’t fire!;
  • If you apply keydown, keypress or keyup and any of them returns false (this is used on meioMask and most of the plugins that filters the input from the user), the change event won’t fire!;
  • If you focused on a text input and some script you made changes the value from this input, when you blur it the change even’t won’t fire!;
  • On IE, if you choose one of the native auto-complete options that is shown when you focus without typing anything, change event won’t fire!

That’s why i created this new glossy ‘changed’ event, which is the change event but fixing all these problems i listed. It uses the power of the Mootools custom events to create this new event that can be used like any other event.

I’ve created a page to show it working.

/**
 * @author Fábio Miranda Costa <fabiomcosta [at] gmail [dot] com>
 * 09-07-2009
 * http://www.meiocodigo.com
 * Changed Event for Mootools 1.2.x
 */</p>

<p>(function(){</p>

<pre><code>var $ = document.id || $;
var STORAGE_VALUE = 'changed-event-value-storage';
var lastFocused = null;
var focusFunc = function(){
    lastFocused = this;
    this.store(STORAGE_VALUE, this.get('value'));
};
var submitFunc = function(e){
    if(check.call(lastFocused)){
        lastFocused.fireEvent('changed');
    }
};
var check = function(e){
    var storedValue = this.retrieve(STORAGE_VALUE);
    // this happens when you focus the input before adding the changed event on the input
    if(storedValue === null) return false;
    return this.value !== storedValue;
};

Element.Events.changed = {
    base: 'blur',
    onAdd: function(){
        var evts = this.retrieve('events');
        if(!(evts &amp;&amp; evts.focus &amp;&amp; evts.focus.keys.contains(focusFunc))){
            this.addEvent('focus', focusFunc);
            var formEl = $(this.form), fevts = formEl.retrieve('events');
            if(!(fevts &amp;&amp; fevts.submit &amp;&amp; fevts.submit.keys.contains(submitFunc))){
                formEl.addEvent('submit', submitFunc);
            }
        }
    },
    condition: function(e){
        e.type = 'changed';
        return check.call(this, e);
    },
    onRemove: function(){
        var evts = this.retrieve('events');
        if(!evts.changed.keys.length){
            this.removeEvent('focus', focusFunc);
            if(lastFocused == this) lastFocused = null;
            if(!submitInputs.length){
                $(this.form).removeEvent('submit', submitFunc);
            }
        }
    }
};
</code></pre>

<p>})();

I’m sorry about the entities errors on the code, its this f…. s…. blog system that simply can’t do it right. If anybody know how to solve this, please let me know.

It won’t hurt if i remember that it should only be used on text inputs (it wont work as expected on radiobuttons and checkboxes) and you should apply the event before you focus the element (its kind of obvious but as i said, it won’t hurt).

Did i tell you that Mootools rocks? ;)

[Rafael Biriba] Ubuntu: Instalação do vmware-server-console

Sunday, August 9th, 2009

http://www.vmware.com/

http://www.vmware.com/

Sempre que preciso, eu perco algum tempo em procurar e instalar vmware-server-console.
Então resolvi postar para facilitar. :)

Primeiro, faça o download pelo site do vmware (http://download3.vmware.com/software/vmserver/VMware-server-linux-client-1.0.9-156507.zip), onde você deve extrair o pacote (23mb) para obter o VMware-server-console-1.0.9-156507.tar.gz

Ou então, baixe o pacote direto pelo link do meu blog: (apenas 9 mb ;) )
http://www.rafaelbiriba.com/VMware-server-console-1.0.9-156507.tar.gz

Ou apenas siga os comandos abaixo pelo terminal:

wget http://www.rafaelbiriba.com/VMware-server-console-1.0.9-156507.tar.gz
tar -zxvf VMware-server-console-1.0.9-156507.tar.gz
cd vmware-server-console-distrib/
sudo ./vmware-install.pl

Caso tenha alguma dúvida/problema na instalação, verifique o link: http://help.ubuntu.com/community/VMware/Server na seção VMware Server Console Installation ou pergunte por aqui mesmo. ;)


Leia também:


[Rodolfo Carvalho] If-else em uma linha de Python

Saturday, August 8th, 2009

Hoje aprendi mais uma forma [tosca] de fazer condicional com Python.

Depois do truque lógico do “condicao and valor_caso_verdadeiro or valor_caso_falso”, o que descobri navegando na Internet hoje foi:

>>> x = 5
>>> ["menor que 10", "maior que 10"][x > 10]
‘menor que 10′

Isso funciona porque o tipo bool (valor booleano) é um subclasse do tipo int, tipo requerido em indices de sequências.

>>> ["menor que 10", "maior que 10"]['not an integer']
TypeError: list indices must be integers

>>> issubclass(bool, int)
True

>>> ["menor que 10", "maior que 10"][True]
‘maior que 10′

Mas é claro que isso é só um “acidente” e não deve ser usado normalmente. A partir do Python 2.5 temos a sintaxe:

valor_caso_verdadeiro if condicao else valor_caso_falso

[Igor Macaubas] Voltando à vida!

Wednesday, August 5th, 2009

Pessoal, faz um tempo que não posto nada aqui. Explico: minha vida sofreu uma série de reviravoltas desde o Scrum Gathering (o último post que fiz foi logo depois do evento). Estarei voltando a escrever aqui no blog a partir dessa semana, e conto com várias, mas várias novidades que irei compartilhar com vocês. :-)

Fiquem atentos; ainda esta semana voltarei a escrever furiosamente!

[Rafael Biriba] Gravatar: Sua foto nos comentários do Wordpress

Tuesday, August 4th, 2009

gravatarApós comentar em vários blogs e também de receber e responder os comentários do meu blog, me dei conta que a maioria não possuem fotos.

O motivo principal talvez seja o baixo número de comentários feitos, que não desperta vontade/interesse na pessoa em utilizar uma foto.

Mas prefiro acreditar que o motivo é a falta de informação, então resolvi postar sobre o Gravatar. ( http://www.gravatar.com/ )

O Gravatar é uma forma simples da sua foto seguir você de site em site, aparecendo ao lado de seu nome, principalmente utiliza-do nos comentários de blogs, neste caso, o wordpress.

Criando uma conta:
Acesse o site do gravatar e clique em Sign up now!
Depois basta colocar um email, e preencher o restante do formulário.

Após criar a conta, acesse seu painel (na opção Log in) onde você tem a opção de adicionar outros emails e fotos.
O serviço consiste em você escolher qual foto deseja associar a cada endereço de email, podendo ter uma foto para vários emails, ou fotos diferentes para emails diferentes.

Para usar sua foto, é ainda mais fácil, basta comentar em algum blog ou site compatível com o serviço, informando um dos emails cadastrados no gravatar. Sua foto será exibida automaticamente de acordo com o que você definiu.

Não é possível escolher quando a foto deve aparecer ou não. Uma vez informado o email, o site/blog irá consultar o gravatar e exibir a foto associada (se houver alguma).

De acordo com a documentação do wordpress: http://codex.wordpress.org/Using_Gravatars
O Gravatar foi definido como padrão a partir da versão 2.5, porém alguns themes/templates podem não ter compatibilidade ou não ter a funcionalidade implementada.

Se você se encaixa num desses quadros (wordpress antigo ou template sem suporte), não há muito o que fazer. Apenas seguir a documentação e inserir direto no código(php) da página de comentários.

Espero que com essa informação, possamos ver as fotos dos comentaristas no lugar das imagens de “Sem foto”… :)


Leia também:


[Tiago Motta] TralhaController notificando obervadores por pattern

Saturday, August 1st, 2009

TralhaController é uma biblioteca javascript que permite que aplicações web que utilizam requisições assíncronas ofereçam URLs para cada contexto de navegação do usuário. Para saber mais sobre ela basta ler o artigo Mantendo contexto usando ajax que o Bruno Carvalho escreveu recentemente.

Porém uma coisa me incomodava no uso dessa classe. Para cada observador registrado eu precisava dentro do método update verificar se ele precisava agir de acordo com a URL. Isso acaba por tornar o código mais confuso pois obrigava-nos a misturar validações e lógica de negócio. Veja um exemplo abaixo:

var observadorBusca = { update:function(url) {  if( url.indexOf("#busca=")!=-1 ) {    //Executa a busca  }} };var observadorLink = { update:function(url) {  if( url.indexOf("#link=")!=-1 ) {    //Executa o link clicado  }} };TralhaController.addObserver(observadorBusca);TralhaController.addObserver(observadorLink);

Para tentar melhorar isso, pus a mão na massa e alterei o TralhaController permitindo registrar observadores que só fossem notificados diante de URLs que tivessem o padrão desejado. Utilizando então a última versão da biblioteca o código acima poderia então ser alterado para ficar da seguinte forma:

var observadorBusca = { update:function(url) { /* Executa a busca */ } };var observadorLink = { update:function(url) { /* Executa o link clicado */ } };

TralhaController.addObserver("\\#busca\=.*", observadorBusca);TralhaController.addObserver("\\#link\=.*", observadorLink);

Bem mais simples certo? É claro que há aqueles que não são muito fãs de expressões regulares e vão achar a primeira forma melhor. Para esses não há problema pois a forma antiga continua funcionando. Observadores registrados sem padrões continuam sendo notificados a toda e qualquer modificação de URL.