terça-feira, maio 30, 2006

[Python] Hello World

Meu primeiro programa em Python:

print "Hello World!"

UAU !

domingo, maio 28, 2006

Comunidades Software Livre

Eu acho que em algum post antigo deste blog eu já reclamei da falta de documentação decente da maioria dos projetos de software livre. Até projetos do porte do Eclipse e jakarta-Apache são bem fracos nesta parte. A Jakarta fornece uma documentação geral bastante interessante, sobre conceitos dos sub projetos deles, e sobre instalação básica, quick install, etc... Mas quando se precisa de detalhes de configuração e coisa mais profissionais, aí a documentação não dá conta (por exmplo: até hoje não consegui encontrar uma lista completa dos validadores disponíveis no struts, com sintaxe, parâmetros e coisas do gênero). Nessas horas, essa falta de documentação é compensada pelas listas de discussão dos projetos. Uma característica muito forte da comunidade OpenSource/Software livre é a facilidade com que se consegue trocar informações e idéias com usuários e desenvolvedores. Recentemente, tive dificuldades pra resolver um problema da minha aplicação struts: pesquisei durante dois dias em documentação, blogs, artigos, e simplesmente não conseguia encontrar a forma de fazer o que eu queria. Daí resolvi me cadastrar na lista de usuários e desenvolvedores do projeto: em duas horas consegui uma resposta, e de quebra ainda tirei dúvida de duas pessoas e treinei meu inglês. Eu já tinha tido a oportunidade de usar estas listas quando trabalhava com programação de barramento Firewire em Linux. Aconselho fortemente o uso deste recurso, mas sempre respeitando as regras das listas. E sobretudo: uma boa pesquisa prévia sobre o assunto é sempre bem vinda.

Objetos em Javascript

Javascript fornece mecanismos básicos para criação de objetos. Digo básico porque os objetos em Javascript podem ser encaradas como estruturas de dados "anabolizadas": apenas variáveis e funções para mexer nestas variáveis. A linguagem não permite mecanismos mais complexos de orientação a objetos, como criar restrições de acesso (variáveis e métodos públicos e privados), polimorfismo, herança (até encontrei alguns exemplos de mecanismos de simulação de herança, mas que me parecem muito exagerados) e construtores múltiplos. Mas se levarmos em conta que o objetivo de Javascript é tornar as páginas HTML mais dinâmicas adicionando pequenos programinhas client-side, então podemos concluir que os mecanismos de OO oferecidos são mais do que suficientes. Segue abaixo um código simples, de um objeto que simula o comportamento de um StringBuffer em Javascript (cujas vantagens foram discutidas neste post):
function StringBuffer() {
this.buffer = [];
};

StringBuffer.prototype.append = function append(string) {
 this.buffer.push(string);
return this;
};

StringBuffer.prototype.toString
= function toString() {
return this.buffer.join("");
};

O código acima cria um objeto do tipo StringBuffer, com um construtor vazio e com um atributo buffer. Depois cria 2 métodos: append e toString. Dois pontos são interessantes no código acima:
  1. Um objeto em Javascript é no fundo uma função, e o construtor é a lista de parâmetros desta função.
  2. O objeto prototype, interno a qualquer objeto Javascript, permite que se adicione métodos e atributos em runtime em qualquer objeto Javascript, incluindo objetos da biblioteca padão.
Uma outra forma de escrever o objeto acima seria com a seguinte sintaxe:
function StringBuffer() {
this.buffer = [];

append = function append(string) {
    this.buffer.push(string);
    return this;
};

toString = function toString() {
    return this.buffer.join("");
};
}

Qualquer instrução que estiver fora de alguma função interna será executada automaticamente quando se criar um novo objeto do tipo StringBuffer, sendo portanto o equivalente à um construtor. Minha opinião: o uso de objetos em JS é altamente recomendado para suprir a falta de estruturas de dados mais sofisticadas e para organizar certas partes do código

quinta-feira, maio 25, 2006

Apple Store - 5th avenue, New York

As imagens falam por si só...o design dessa nova loja da Apple é um tanto quanto impressionante. Pelo menos a entrada !

http://www.apple.com/retail/fifthavenue/gallery/index.html

Um dia ainda vou visitar (daí aproveito e visito a Big Apple também...)

quarta-feira, maio 17, 2006

Google WebToolkit

A Google é uma das poucas empresas que eu conheço que consegue superar minhas espectativas a cada novo lançamento. É incrível a capacidade que eles tem de desenvolver produtos interessantes, e sobretudo a capacidade que eles tem de oferecer ferramentas de alto nível para desenvolvedores.

O mais novo exemplo é o Google WebToolkit, que acaba de sair do forno. A idéia é fornecer uma API para facilitar a programação de aplicativos WEB AJAX em Java. Eu só li a documentação, e portanto tenho no momento uma visão superficial do sistema. Mas basicamente a idéia é que o desenvolvedor escreve uma interface gráfica em Java, como se fosse um programa desktop com interface SWING, e o Google WebToolkit compila sua página em código Javascript. Se não me engano, o funcionamento é muito parecido com o Java Server Faces da Sun.

Vantagens desse mecanismo:

  1. Torna o processo de desenvolvimento de interfaces mais rápido, sobretudo para aqueles que não são experts em Javascript (e nem querem se tornar), e para aqueles que querem manter a compatibilidade de browsers
  2. Facilita o processo de debug, uma vez que pode se utilizar JUnits e  debuggers de Java para testar a interface
  3. Permite acesso a todas as funcionalidades da API Java...eles que se virem pra traduzir isso em  Javascript.

Para aqueles que trabalham com Eclipse, mais um ponto interessante: o  GWT já vem com um  script projectCreator, que cria toda a árvore de arquivos, scripts e classpath necessários para criar um projeto dentro do IDE. 

Bom, por enquanto é só pessoal. Assim que tiver mais detalhes, entro em contato.

segunda-feira, maio 15, 2006

Captura de teclas em Javascript - Parte 2

Demorei pra escrever a segunda parte desse pequeno tutorial, mas antes tarde do que nunca. No post anterior eu expliquei brevemente o funcionamento da captura de teclas em Javascript. Neste vou colocar uma receitinha de bolo.

Segue o código, compatível com IE e Firefox. Qualquer dúvida com os comentarios, entre em contato:


document.onkeyup=handleKeyboardAction;

function handleKeyboardAction(e){

var code;

// Obtém o evento. No caso do Firefox, este
// evento é passado como argumento, e no caso do IE,
// deve ser obtido através do objeto window.
if (!e) var e = window.event;

// Detecta o target da tecla
var targ;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;

// Este código previne um erro do navegador Safari:
// Se o usuari clica num DIV com texto, os outros browsers
// retornam o DIV como sendo o target. Safari retorna o nó contendo
// o texto (nodeType 3). Nesse caso, o target que nos interessa é o pai.
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;

// Obtém o nome da TAG HTML do target do evento
tag = targ.tagName.toUpperCase();

// Verifica se o evento não esta sendo acionado em nenhum
// campo como campo de texto e combobox.
// Esta verificação é importante, pois o handler pode bloquear
// o funcionamento adqueado desses campos (por exemplo, em vez de escrever
// a letra no campo, executa uma função).
if (tag == "INPUT")
return;

if (tag == "SELECT")
return;

// Detecta o codigo da tecla
if (e.keyCode) code = e.keyCode;
else if (e.which) code = e.which;

var character = String.fromCharCode(code);

// Executa o procedimento associado à uma letra.
if(character == "R"){
}

//Seta para cima
if(code == 38) {
...
return;
}

//Seta para direita
if(code == 39) {
...
return;
}

//Seta para esquerda
if(code == 37) {
return;
}
}