Posts de August, 2009

[Rafael Biriba] Evento recomendado: Dev in Rio 2009

Tuesday, August 25th, 2009

 

http://www.devinrio.com.br/

http://www.devinrio.com.br/

O evento (www.devinrio.com.br) que acontece no dia 14 de setembro, traz excelentes conteúdos  para a área de tecnologia.

 alt=De acordo com o blog de um dos organizadores (Guilherme Chapiewski), a programação conta com três palestrantes nacionais e três internacionais falando sobre Open Source, Java, Ruby on Rails, Django e desenvolvimento ágil de software.

A inscrição está saindo por R$ 65,00 e pode ser feitas através deste link: http://devinrio.com.br/inscricoes_bra.php. Se você acha caro, dê uma analisada no conteúdo do evento e verá que vale a pena o investimento. Dá para pagar em até 15x no cartão de crédito.

Abaixo segue uma mini-agenda do evento. A agenda completa pode ser conferifa no site do evento (www.devinrio.com.br)

Agenda:

08:30 h: Credenciamento e visita aos estandes
09:30 h: Abertura Oficial (Guilherme Chapiewski e Henrique Bastos)
10:00 h: … Comunidades do Joomla! e Open Source estão mudando o mundo! … (Ryan Ozimek)
11:00 h: O Java está morto? (Guilherme Silveira e Nico Steppat)
12:00 h: Intervalo para almoço
13:30 h: Ecossistema Ruby on Rails (Fabio Akita)
14:30 h: Django: o framework web para perfeccionistas com prazos (Jacob Kaplan-Moss)
15:30 h: Intervalo
16:00 h: Desenvolvimento ágil e iterativo de produtos - a confirmar (Jeff Patton)
17:00 h: Bate-papo com os participantes! (Vinicius Manhães Teles)
18:00 h: Encerramento e #Horaextra

Dev in Rio 2009Se você trabalha/estuda na área de tecnologia, está mais do que convidado à participar do evento.
Não esqueça de chamar seus amigos
.
De acordo com o Guilherme, as vagas estão sendo preenchidas mais rápido do que o planejado, então corra e garanta logo a sua.

;) Vejo vocês lá ! ;)


Leia também outros assuntos:


[Rafael Biriba] Ubuntu: Configurando teclado ABNT2 no vmware-server-console

Saturday, August 22nd, 2009
http://www.vmware.com/

http://www.vmware.com/

 

Um dos problemas que eu acho extremamente chato, é não poder usar as setas, o ctrl, a barra e outras teclas não habilitadas no vmware-server-console. Você pode ler sobre a instalação do console no ubuntu, clicando aqui.

Se você der uma pesquisada no google, rapidamente vai encontrar formas de resolver o problema. Uma delas é fazer o mapeamento das teclas que devem ser inseridas na configuração do vmware.

A questão é onde está o arquivo de configuração. Isso depende de como você instalou o vmware.
No meu caso está em /etc/vmware-server-console/config.

Adicionem as seguintes linhas no final do arquivo de configuração:
(OBS: Tem que ser root para fazer a alteração e certifique-se que o vmware não está aberto)

xkeymap.keycode.108 = 0×138 # Alt_R
xkeymap.keycode.106 = 0×135 # KP_Divide
xkeymap.keycode.104 = 0×11c # KP_Enter
xkeymap.keycode.111 = 0×148 # Up
xkeymap.keycode.116 = 0×150 # Down
xkeymap.keycode.113 = 0×14b # Left
xkeymap.keycode.114 = 0×14d # Right
xkeymap.keycode.105 = 0×11d # Control_R
xkeymap.keycode.118 = 0×152 # Insert
xkeymap.keycode.119 = 0×153 # Delete
xkeymap.keycode.110 = 0×147 # Home
xkeymap.keycode.115 = 0×14f # End
xkeymap.keycode.112 = 0×149 # Prior
xkeymap.keycode.117 = 0×151 # Next
xkeymap.keycode.78 = 0×46 # Scroll_Lock
xkeymap.keycode.127 = 0×100 # Pause
xkeymap.keycode.133 = 0×15b # Meta_L
xkeymap.keycode.134 = 0×15c # Meta_R
xkeymap.keycode.135 = 0×15d # Menu
xkeymap.keycode.97 = 0×073 # Slash

Se você não achou o arquivo de configuração, veja algumas outras possibilidades:
.vmware/config
,
~/vmware/preferences
,
/etc/vmware/config,
/usr/lib/vmware/config

Espero ter ajudado… ;)


Leia também:


[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? ;)

[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:


[Victor Pantoja] Criando Múltiplos Perfis de User Agents no Firefox para o Selenium

Tuesday, August 4th, 2009

Trabalho desenvolvendo aplicativos e sites para dispositivos móveis e temos algumas maneiras de simular user-agents para testar os sites.

Criamos a cultura de criar uma integração contínua para todos os projetos. Isso envolve testes unitários, funcionais e de aceitação.

Nossos sites possuem dois perfis: iphone e standard (para tudo que não for iphone). Essa diferenciação é feita através de uma regra de apache (mod_rewrite) que inclui /iphone ou /standard na URL sem que o usuário veja. Para rodar os testes de integração contínua, essa regra não é criada e chamamos a url com o /perfil

Pois bem: estamos trabalhando em uma aplicação WEB em que não é possível passar o /perfil
por alguns motivos. Então, nos deparamos com um problema: como testar os múltiplos perfis de handsets?

A solução foi criar dois profiles no Firefox (iPhone e Standard) e passa-los para o Selenium. Separamos os testes de aceitação nos dois profiles e rodamos um após o outro (usamos Makefile).

Um profile pode ser criado com o comando $ firefox -P.

Mas veio a pergunta: como criar um profile iPhone e outro standard? A solução foi usar o about:config do Firefox (digite isso no campo url: ‘about:config’, sem as aspas. Não mexa nos campos se você não souber o que está fazendo).

O campo selecionado de vermelho é exatamente o que deve ser alterado. No momento da criação do profile, alteramos essa propriedade de acordo com o profile que estamos criando. Dê dois cliques e digite o user-agent que você deseja. Eu uso ‘iPhone’ para o profile iPhone e ‘NokiaN90′ para o profile standard.

Eu salvei em /home//iphone e /home//standard. O selenium deve ser inicializado assim:
$ java -jar selenium.jar -firefoxProfileTemplate “/home/usuario/iphone” ou
$ java -jar selenium.jar -firefoxProfileTemplate “/home/usuario/standard”

Depois, joguei esses profiles dentro do projeto e acertei o selenium para chama-los a partir do novo path.

Os testes funcionaram perfeitamente. A título de curiosidade, o trecho do Makefile está abaixo:
selenium_up: selenium_down
@echo “Running selenium server with $(profile) profile…”
@java -jar data/selenium-server/selenium-server.jar -firefoxProfileTemplate data/selenium-server/profiles/$(profile) 2>&1 > /dev/null &

Chame o make passando o profile:
$make selenium_up profile=iphone
$make selenium_up profile=standard

E tudo deve funcionar.

[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.