sábado, 27 de setembro de 2008

III Encontro Nacional do BROffice

Estão abertas as inscrições para o III Encontro Nacional do BrOffice.org, que, apesar de nacional, foi internacional desde a sua primeira edição. Para participar basta se inscrever no portal do Encontro e comparecer em um dos pontos de videoconferência espalhados pelo Brasil, Paraguai, Espanha ou Uruguai. O valor da inscrição é 1KG de alimento não perecível que deve ser entregue no dia do evento. Quem desejar, terá a oportunidade de doar sangue também, no dia do encontro. Veja o portal oficial:

http://encontro.broffice.org/pt-br/inscricao

O evento ocorrerá no dia 3 de outubro de 2008, das 8h às 19h (GMT -0300 - Hora de Brasília). Será transmitido ao vivo pela internet, com interatividade, para todos os estados brasileiros, além da Espanha, Paraguai e Portugal. Espera-se mais de 3000 pessoas, oriundas da Galícia/Espanha, Paraguai, Portugal, Uruguai e de todo o Brasil, e contará com nomes como: Charles Schulz – París/França – Líder do Projeto Idiomas Nativos do Openoffice.org, Michael Bemmer – Hamburgo/Alemanha – Diretor da Sun Microsystems, responsável pela Engenharia de Software do OpenOffice/StarOffice e René Engelhard – Karlsruhe/Alemanha – Desenvolvedor responsável pela manutenção do OpenOffice.Org/BrOffice.Org no Sistema Operacional Debian GNU/Linux.

Vamos participar, gente!!

sexta-feira, 26 de setembro de 2008

Ajude um Orfanato e Ganhe um iPod!!

Vamos todos participar da promoção "Mês (Geek) das Criaças"!! Acessando o link abaixo, você vota em um de três orfanatos que concorrem a um maravilhoso Nintendo Wii e, de quebra, inscreve-se para o sorteio de um iPod!! Acesse:

http://meiobit.pop.com.br/meio-bit/miscelaneas/promocao-mes-geek-das-criancas-meio-bit

Vamos lá: ajudar não custa nada!!

O Pajé: sempre uma dica boa!!

terça-feira, 23 de setembro de 2008

Fazendo um HTTP GET via Telnet

Então, você fez seu sistema web bonitinho, verificou, lustrou, examinou, compilou, empacotou, e colocou (delicadamente!) o pacotinho dele no seu servidor de aplicação. Respirou fundo e iniciou o servidor. Nenhum erro no log. Tudo direitinho. Você então se levanta e diz - está funcionando!! Ótimo! Podemos ir pra casa!
Podemos mesmo?? Será que o sistema está no ar?? Se eu entrar na página inicial, será que ela vai abrir??
Muitas vezes, por mais estranho que pareça, uma ou outra coisa provoca que o sistema não esteja acessível ou visível para o usuário, mesmo estando "no ar"!! Ou o servidor de aplicação está na porta errada, ou a rede tem um redirecionamento faltando, a URL mudou, uma rota caiu, o DNS falhou, o Proxy não ficou bem configurado ou não está ativo... enfim, milhares de coisas podem acontecer para deixar seu sistema inalcançável. E, o mais interessante: como o desenvolvedor está sempre concentrado no sistema em si, grandes chances há que ele não se aperceba das dificuldades e fragilidades de ambiente e arquitetura de redes... o resultado pode ser catastrófico!!
Mas, para todos os grandes males... um pequeno (e singelo) remédio! Uma maneira fácil, simples, rápida e segura de testar se o seu sistema está acessível é fazer uma chamada GET de HTTP via telnet, e observar a resposta.
Funciona assim:

  • Abre-se uma conexão HTTP na porta correta usando o comando TELNET;
  • Faz-se uma chamada GET, digitando um comando muito simples, buscando uma página dentro do seu sistema, ou a raíz;
  • Analisa-se o resultado obtido.
O Telnet é usado apenas para abrir a conexão com o servidor onde está seu sistema, na porta onde ele atende. Assim, deve-se digitar:

telnet www.google.com.br 80

Para abrir uma conexão com o endereço "www.google.com.br". É preciso indicar a porta 80, pois a porta padrão do Telnet é a porta 23, mas queremos acessar a porta 80, que é a padrão do HTTP. A fórmula é sempre esta:

telnet [ENDEREÇO] [PORTA]

Uma vez com a conexão aberta, vamos fazer o comando GET:

GET / HTTP/1.1

O que isto significa?? Bom, vamos ver... a fórmula é:

GET [PASTA/ARQUIVO] HTTP/1.1

Isto significa que estamos fazendo um GET do arquivo que está em "/" (automaticamente, será o "/index.html" ou "/index.htm"), usando o protocolo HTTP, versão 1.1. Poderia ser qualquer outro arquivo, como "GET /index.php HTTP/1.1", ou "GET /isso/aquilo/aquilooutro/index.do HTTP/1.1", etc....
Esta requisição gera uma resposta HTTP, que é enviada em modo texto pelo telnet, e depois o servidor encerra a conexão (sim, as conexões HTTP são encerradas pelo servidor assim que termina a transferência; lembre-se disto!!). Vamos entender a resposta??

HTTP/1.1 302 Found
Location: http://www.google.com.br/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=e74d34b9a8ade746:TM=1222306186:LM=1222306186:S=9-4OKiByoC12DDCV; expires=Sat, 25-Sep-2010 01:29:46 GMT; path=/; domain=.google.com
Date: Thu, 25 Sep 2008 01:29:46 GMT
Server: gws
Content-Length: 222

[HTML DA RESPOSTA]

A resposta da conexão tem, essencialmente, 2 elementos importantes para nós: o cabeçalho (HTTP HEADER) e o texto de resposta. Qualquer página da internet, mesmo esta que você está vendo agora, vem inexoravelmente dentro de uma resposta HTTP, após seu devido cabeçalho. O cabeçalho (ou HEADER) é aquilo que instrui o seu navegador sobre como se comportar em relação a esta resposta (coisas como: o que exibir, se falhou, se funcionou, se pode fazer cache, se tem cookie, etc.). Vamos examinar algumas coisas principais do nosso cabeçalho:

  • HTTP/1.1 302 Found --> Aqui começa tudo! Indica que a URL, o endereço, foi encontrado com o código HTTP 302. Este código significa redirecionamento. Ou seja, a partir daqui, o seu navegador vai ser redirecionado para outro endereço. O servidor HTTP sempre responde com um código HTTP único, definido internacionalmente por especificação oficial do World Wide Web Consortium.
  • Location: http://www.google.com.br/ --> Indica de onde a resposta veio.
  • Cache-Control: private --> Indica que não se deve fazer cache. As informações são direcionadas a um único usuário.
  • Content-Type: text/html; charset=UTF-8 --> Indica que a resposta carrega um conteúdo texto, no formato HTML, codificado em padrão UNICODE UTF-8 (ou seja: pode usar acentos, cedilhas e todos os caracteres europeus). Isto é importante porque, se o conteúdo da resposta fosse um arquivo binário, como um ZIP ou um MP3, o navegador precisa lidar com eles de maneiras diferenciadas.
  • Set-Cookie: PREF=ID=e74d34b9a8ade746:TM=1222306186:LM=1222306186:S=9-4OKiByoC12DDCV; expires=Sat, 25-Sep-2010 01:29:46 GMT; path=/; domain=.google.com --> Pois é... como você viu, a google já coloca um cookiezinho na sua máquina... além deste valor estranho, o cookie tem uma data de expiração (sábado, 25/10/2010, daqui a 2 anos e 1 dia!!) e sabe o domínio de quem o criou (google.com).
  • Server: gws --> o nome do servidor que te respondeu (bom para saber o que o concorrente usa!!).
  • Content-Length: 222 --> O tamanho do corpo da resposta.

Estes são apenas alguns campos. Uma lista completa de todos os campos e suas definições encontra-se aqui. Vale lembrar que todo campo do cabeçalho sempre tem um nome, seguido do caracter ":" e o valor. Cuidado: estes campos são sensíveis a caixa (diferenciam minúsculas de maiúsculas).

Se quiser mergulhar a fundo na especificação do HTTP 1.1, acesse aqui.
Lembre-se: qualquer URL pode ser acessada por um GET via Telnet. Na verdade, o Telnet pode ser usado ainda para URLs de POST de HTTP, embora seja bem mais incômodo de fazer. O Telnet também pode se comunicar com seu servidor de e-mail, e é possível, via Telnet, enviar um e-mail para qualquer endereço de destinatário (e melhor: via telnet, o servidor não valida seu e-mail e você pode informar o endereço de remetente que desejar!!). Embora não seja complicado, isto tem sido cada vez menos utilizado, porque o permitir expõe o administrador da rede e o serviço de e-mail a riscos de segurança desnecessários.


  • Conclusão

Uma simples requisição via telnet lhe oferece um meio fácil e seguro de não só validar a disponibilidade de sua página ou sistema, como também extrair mais algumas informações inerentes a ela, ratificando a validação.

domingo, 21 de setembro de 2008

JavaScript Tutorial: O Objeto Date (Parte 2)

Esta é a segunda parte do tutorial. Você já leu a primeira parte??
Nesta parte, vamos aprender a personalizar o objeto Date, usando a palavra (ou keyword) prototype. O que vem a ser isto? Bom, sabemos que o javascript manipula, na memória, objetos e funções. Cada objeto pode ter propriedades, que são valores simples, ou funções, que são rotinas associadas ao objeto.
Existem objetos inerentes ao javascript, como o objeto Math, Date, etc. Através da palavra prototype, podemos modificar estes objetos, acrescentando a eles (ou a qualquer objeto do javascript previamente existente) propriedades e funções novas, declaradas por nós! Portanto, o prototype é uma excelente ferramenta de otimização e personalização. Vejamos como funciona:

Date.prototype.nomeDaPropriedade = 50;
Date.prototype.nomeDaFuncao = function(){
this.getTime();
};


No primeiro caso, estamos pegando o objeto Date, nativo do javascript, e, através do prototype, declaramos uma nova propriedade para ele, chamada "nomeDaPropriedade" e que terá valor "50". Para acessar esta propriedade, basta instanciar o objeto e usar o operador ponto ".":

var data = new Date();
window.alert(data.nomeDaPropriedade);

No segundo caso, fazemos o mesmo, mas agora estamos declarando uma função nova (e não uma propriedade), denominada "nomeDaFuncao". O código que esta função executará está dentro das chaves. As funções declaradas via prototype podem ou não ter valor de retorno, e podem receber nenhum ou quantos parâmetros quisermos, exatamente como qualquer função de javascript. Podemos, de dentro de uma função declarada via prototype, acessar qualquer propriedade ou função daquela instância do objeto, com o parâmetro "this".

Importante: não esqueça de colocar o ";" no final, após fechar a chave da função!! Muita gente erra isso!!


Para acesar esta função, basta instanciar o objeto e chamá-la:

var data = new Date();
window.alert(data.nomeDaFuncao());

Importante: não esqueça que, sendo uma função, é preciso chamá-la com o "()" no final de seu nome. Parece muito bobo, mas tem gente que erra isso e fica horas perdida procurando o erro...

Agora, vamos aplicar isto ao nosso caso, fazendo algo mais útil ao nosso objeto Date. As funções abaixo fazem:
ajustaDuasCasas: força que o número sempre tenha duas casas, mesmo menor que 10. Isto é bom para manter a formatação em datas e horas com valores menores que 10.
getDataFormatada: transforma a data do objeto (e não a atual!!) em uma String do tipo "07/09/2008".
getDataHoraFormatada: faz o mesmo que a de cima, mas acrescenta a hora: "07/09/2008 13:20:00".
getHoraFormatada: faz o mesmo, mas retorna apenas a hora: "13:20:00".

Date.prototype.ajustaDuasCasas = function(numero) {
if (!isNaN(numero)) {
if (numero < 10) {
return "0" + numero;
} else {
return numero;
}
} else {
return "00";
}
};

Date.prototype.getDataFormatada = function() {
var dia = this.ajustaDuasCasas(this.getDate());
var mes = this.ajustaDuasCasas(this.getMonth() + 1);
var ano = this.getFullYear();
return dia + "/" + mes + "/" + ano;
};

Date.prototype.getDataHoraFormatada = function() {
var dia = this.ajustaDuasCasas(this.getDate());
var mes = this.ajustaDuasCasas(this.getMonth() + 1);
var ano = this.getFullYear();
var hora = this.ajustaDuasCasas(this.getHours());
var minutos = this.ajustaDuasCasas(this.getMinutes());
var segundos = this.ajustaDuasCasas(this.getSeconds());
return dia + "/" + mes + "/" + ano + " " +
hora + ":" + minutos + ":" + segundos;
};

Date.prototype.getHoraFormatada = function() {
var hora = this.ajustaDuasCasas(this.getHours());
var minutos = this.ajustaDuasCasas(this.getMinutes());
var segundos = this.ajustaDuasCasas(this.getSeconds());
return hora + ":" + minutos + ":" + segundos;
};


Utilizando tudo isso:
var hoje = new Date();
window.alert(hoje.getDataFormatada());
window.alert(hoje.getDataHoraFormatada());
window.alert(hoje.getHoraFormatada());


Observe que isto funcionará com qualquer instância do objeto Date, formatando automaticamente qualquer valor que o objeto carregue. Assim, seu código fica bem mais simples e enxuto, claro e fácil de entender. As chances de erro são menores e o desempenho é maior.

  • Implementando um Relógio

O javascript provê uma função denominada setInterval(a, b), onde a é uma String representando uma chamada em javascript que será repetida continuamente e b é um inteiro representando o intervalo em milisegundos que o navegador esperará entre as repetições da chamada. Com isto é possível implementar um pequeno relógio:

function mostraRelogio(campoRelogio) {
if (campoRelogio != null) {
// Recarregando a hora a cada 100 milisegundos, para
// fazer o relógio andar.
setInterval("campoRelogio.innerHTML = (new Date()).getHoraFormatada()", 100);
}
}

CONCLUSÃO: utilizar o objeto Date do javascript é uma forma simples e fácil de diminuir a carga de seu portal, melhorar e otimizar o desempenho de seu sistema de informação e fazer inúmeros testes e validações antes de ir ao servidor. Utilizando a palavra-chave prototype, podemos adicionar ao objeto nativo funções e propriedades úteis, personalizadas e recorrentes em nosso sistema, evitando a aglomeração excessiva de funções externas e garantindo mais agilidade, simplicidade e clareza no código.

JavaScript Tutorial: O Objeto Date (Parte 1)

Quando criamos nosso sistema de informações, é apenas uma questão de tempo até precisarmos manipular, medir, alterar, calcular e comparar datas e horas. Quando nosso sistema é (como a grande maioria!) baseado em web, então grande parte desta etapa é feita no próprio navegador do cliente, via javascript, o que é muito bom, pois aumenta a produtividade, envitando posts desnecessários e diminuindo a carga sobre o servidor.
Interessante que tenho visto pessoas com dificuldade neste assunto, e nem sempre se acha um bom tutorial em português para ajudar. Assim, O Pajé ficou motivado a escrever este artigo, contendo todas as ferramentas básicas para aprender e utilizar o objeto Date do JavaScript sem medo. Como pretendo um tutorial abrangente, dividi-o em duas partes (em breve sairá do forninho a segunda!!).
Bom, vamos do começo: o objeto Date é o objeto responsável, no javascript, por lidar com informações de tempo, desde o ano atual até o último milisegundo, passando pelo dia da semana, mês, hora, minuto, etc. Se seu sistema contiver campos como Período, Data Inicial, Horário, Duração, Diurno, Noturno, Calendário, etc., então freqüentemente você precisará do objeto Date entrando em ação! E não se engane: estes campos são dos mais corriqueiros!!
Manipular as datas no javascript é bom porque evita que o usuário envie para o servidor informações que certamente não vão passar pela validação e vão ter que retornar ao mesmo ponto. Com Date, você pode validar se a data informada está correta, se o período compreende ao menos um valor mínimo, e se a data final é maior que a inicial, por exemplo.
Claro que, no servidor, você deverá revalidar tudo (não seja bobo!! Tem clientes tentando passar a perna também!!), mas, tendo uma validação prévia no cliente, então as chances da validação falhar no servidor e se retornar ao mesmo ponto são menores. Acredite: este tipo de artifício ajuda muito a desafogar seu servidor!!
Então vamos ao que interessa!! Antes de utilizar o objeto, é preciso criá-lo:

var data = new Date();

Isto cria um objeto Date válido, contendo a data e instante atual (do momento da criação). Mesmo que a data desejada seja outra, para começar é preciso instanciar assim.
Abaixo, as funções mais importantes do objeto Date e suas descrições:

var data = new Date();
// Número de millisegundos desde 01/01/1970 @ 00:00
data.getTime();
// Número de segundos (0-59)
data.getSeconds();
// Número de miutos (0-59)
data.getMinutes();
// Número da hora (0-23)
data.getHours();
// Número do dia da semana, sendo 0=domingo e 6=sábado
data.getDay();
// Dia do mês (0-31)
data.getDate();
// Número do mês. CUIDADO: 0=janeiro, e 11=dezembro.
// Muita gente erra achando que janeiro é mês 1!!
data.getMonth();
// Número do ano, com 4 dígitos
data.getFullYear();

Apenas com estes comandos já dá para resolver grande parte dos problemas. Lembre-se de que o objeto date suporta comparações com os operadores ">", "<", ">=", "<=", "+", "-" e que é sempre seguro, quando necessário, convertê-lo para inteiro com a função getTime(). Com estes operadores, podemos somar ou diminuir uma data da outra (importante para cálculo de períodos!!), podemos comparar qual data é maior e qual é menor (importante em validações), etc. Uma referência completa, embora exaustiva, sobre o objeto Date de javascript encontra-se aqui.


  • Definindo uma data específica
Claro que o "var data = new Date()" nem sempre é o que a gente quer. Muitas vezes, queremos que o objeto criado represente uma data específica, seja ela lida de um campo da tela, seja ela calculada de alguma forma. Assim, podemos utilizar outros construtores do objeto Date, conforme mostrado a seguir:

var hoje = new Date();
var anoQueVem = new Date('January 1, '+(hoje.getFullYear()+1));
var diasRestantes = anoQueVem - hoje;

Este construtor recebe uma String com o nome do mês, dia e ano. No código acima, também usamos os operadores para saber quanto tempo resta até o fim do ano. Assim, posso calcular os dias, minutos, segundos e milisegundos para o reveillón!! Se você tem um portal que espera um grande lançamento, é isto que você deve usar!!
Outra maneira de inserir uma data, utilizando apenas valores numéricos, é esta:

var dataNova = new Date(ano, mes, dia[, hora[, minuto[, segundo[,milisegundo]]]]);

Assim é possível se criar um objeto Date com o valor de qualquer data, até a precisão dos milisengundos. Lembre-se de que o valor do mês parece sempre diminuído de 1, porque janeiro=0, fevereiro=1, março=2, ..., dezembro=11!! Até o argumento "dia" é obrigatório, os outros são opcionais. Exemplos:

//Dia de natal: 25/12/2008.
var data1 = new Date(2008, 11, 25);

//Independência: 07/09/2001.
var data2 = new Date(2001, 8, 7);

//Meu almoço, no aniversário do Rio de Janeiro.
var data3 = new Date("March 20, 2008 12:20:00 pm");
var data4 = new Date(2008, 2, 20, 12, 20, 00);


Observe que data3 e data4 são iguais.

Ocorre menos assiduamente, mas, caso você tenha um número inteiro (geralmente advindo do em data.getTime()) e quer convertê-lo para uma data, basta usar a função estática Date.parse, ou o construtor que recebe um único inteiro:

var data1 = new Date(inteiro); //inteiro = número inteiro
var data2 = Date.parse(inteiro); //inteiro = número inteiro

É isso, gente!! Na segunda parte do tutorial, vamos fazer um aplicativo para mostrar a data e hora, e vamos construir um lindo relógio digital para seu portal!! Qualquer coisa (gostou, não gostou, ajudou, foi inútil, etc. e tal...), comentem!! É só clicar aí embaixo!!

Veja a continuação na segunda parte!!

quarta-feira, 17 de setembro de 2008

Emprego e Linguagens de Programação

Se uma coisa é diversificada no mundo da informática, então estamos falando de linguagens de programação. E, na hora de se tornar um desenvolvedor profissional, não basta saber que elas existem. É preciso dominá-las. Porém, dominar implica em dedicação, investimento, tempo e, principalmente, especialização, aprofundamento. Trocando em miúdos: não dá pra dominar muitas linguagens ao mesmo tempo... infelizmente, eu diria que dá pra dominar, na verdade, muito poucas! Embora, durante a trajetória profissional, passemos eventualmente por algumas, quiçá várias, linguagens, o fato é que uma linguagem é como o instrumento que você toca ou a língua que você escreve: você tem uma e pronto. Uma definitiva, uma principal. As outras são casuais, folhas avulsas do livro de sua vida que voam flácidas aos ventos do outono...
Bonito! E agora? Se tenho que escolher uma linguagem para me aprimorar e mergulhar na vida profissional, qual será? Como farei esta importante decisão?
Não se acanhe... O Pajé trouxe a solução para você! Reflita sobre os itens abaixo, e você terá bons parâmetros para começar sua carreira de maneira certa e objetiva!

Onde quero atuar?
  • Se eu quero ser administrador de redes, é bom saber algo de Shell Script, como Bourne Shell ou C Shell. Isto te tornará apto a escrever scripts para qualquer sistema UNIX like. É possível, de fato, escrever maravilhas, programas inteiros, inclusive com interface gráfica!
  • Se eu quero desenvolver sistemas para Web, então preciso aprender as linguagens dos navegadores, como: JavaScript, HTML, CSS (ou, mais profundamente, XHTML e XML), muitas bem documentadas nas especificações do W3C. Além disso, preciso aprender uma linguagem dinâmica, como PHP ou Java.
  • Se eu quero ser web designer, então ainda sim preciso aprender alguma linguagem (embora muitos se recusem)!! Para me ajudar neste ofício, sempre será bom saber HTML, CSS e/ou ActionScript, por exemplo.
  • Quero ser DBA! Então é bom saber SQL e as suas irritantes variações que cada banco de dados oferece, com suas ferramentas próprias para gerar desde simples pesquisas no banco até complexas stored procedures.
  • Meu mercado será o de jogos? Então convém saber Lua!

Onde encontrarei emprego mais facilmente?

Difícil dizer, mas sabemos que o mercado tem procurado muitos profissionais de sistemas de informação, aqueles que programam em PHP, Java, C#, tecnologias web diversas, ActionScript, etc. Por outro lado, sabemos que Python tem crescido e, oportunamente, abrirá novos horizontes àqueles que lhe têm perseverado. É importante observar que, em média, linguagens orientadas a objetos têm crescido muito, enquanto linguagens procedurais têm caído no mercado. Java parece ser a linguagem mais utilizada no mundo, segundo pesquisas, seguida por C e C++. Uma excelente dica está aqui, onde se pode ser levado ao ranking atualizado das linguagens de programação.

Como devo proceder?

Converse com amigos, colegas e professores sobre as oportunidades de trabalho e as características de cada linguagem. Escolha uma que lhe agrade, pois ela será seu objeto de estudo e trabalho intenso durante muito tempo. É essencial (digo: essencial!!) que você, por mais adiantado que se torne, continue estudando e praticando. Busque as novidades da sua linguagem. As novas APIs, novas versões, novas IDEs, etc. Manter-se atualizado é fundamental.
Outra palavra de ordem: integração. O Pascal estava em pleno declínio, daí o OpenPascal surgiu, permitindo integrar Pascal com GTK, e abriu-se-lhe um novo leque de possibilidades, ganhando novo vigor!! Há anos a indústria vem investindo em ferramentas para integrações e troca de informações, exigindo do profissional conhecimento em XML, SOAP (para "falar" com Web Services), etc. Seja um profissional flexível e você terá mais chances!

sábado, 13 de setembro de 2008

Lançado o GWT 1.5!

Depois de vários meses de desenvolvimento intenso e grande expectativa, foi lançada pela Google a mais nova versão estável do GWT, a 1.5.2. O GWT - ou Google Web Toolkit - é um arcabouço de desenvolvimento web para Java que tem conquistado grande número de adeptos desde o seu lançamento, em 2006. A proposta da Google é ter uma abordagem totalmente nova para o desenvolvimento web: ao passo em que os arcabouços tradicionais estão centrados em ampliar e facilitar o uso de JSPs e Servlets, como o Struts, da Apache, e o JSF - Java Server Faces - da Sun, o GWT não lida com JSPs e mal necessita de HTMLs ou javascript diretamente: com ele, o desenvolvedor escreve todo o seu sistema em Java, desde a parte de servidor até a interface do cliente!

O GWT provê uma vasta API para compor e lidar com os objetos de interface (do DOM) e seus eventos, incluindo muitos componentes complexos. Estas classes são compiladas para javascript, que, em tempo de execução, montará a interface dinamicamente, com o bom e velho DHTML. Praticamente todas as classes do GWT estão preparadas para escutar um ou mais eventos, cujos comportamentos podem ser definindos implementando-se classes listeners para eles a partir de interfaces já fornecidas.

Utilizando o GWT, o desenvolvedor escreve a interface como se estivesse programando uma GUI (ao estilo do Swing). Todas as chamadas ao servidor são via AJAX, obedecendo uma arquitetura de alto nível fornecida pelo GWT, que facilita a manutenção e criação das chamadas e garante ser compatível com os principais navegadores do mercado. Sistemas feitos em GWT podem ser construirídos inteiramente sobre um único arquivo HTML de não mais de 10 ou 15 linhas. O sistema todo funciona sem recarregar a tela uma única vez. O desenvolvedor não precisa usar taglibs, jsp, javascript, XML, etc., apenas o seu rotineiro Java, o que lhe proporciona a facilidade de criar e testar a interface toda com breakpoints em sua IDE predileta (como o eclipse ou o netbeans).

O lançamento da nova versão foi ansiosamente aguardado, vez que a anterior, o GWT 1.4, era compatível apenas com Java 1.4, o que frustrava muitas vezes o desenvolvedor, impedido-o de usar anotações, ter a segurança dos generics (como fazem falta!!), dentre outras facilidades do Java 5 (como aqueles fantásticos métodos do objeto String - i.e. o contains - que só entraram no Java 5 e são tão úteis!). Mas a Google não perdeu tempo: o GWT 1.5 aprimora o arcabouço, tornando-o totalmente compatível com Java 5 (já não era sem tempo!!), além de lhe acrescentar muitas outras novidades. O frenesi do lançamento foi tão grande que, nos primeiros dias, dificilmente se conseguia baixar o GWT novo, pois a conexão quase sempre caía devido ao maciço acesso aos servidores!

Interessou-se pelo GWT mas não sabe por onde começar?? Já é usuário avançado e quer algumas dicas?? Por isso - e por você! - o Pajé adinantou-se, disponibilizando os links abaixo:

Página oficial do GWT: http://code.google.com/webtoolkit/. Guarde essa, viu?

Tutorial oficial do GWT, excelente para iniciantes: clique aqui.

Este é um achado: um tutorial riquíssimo em exemplos de todos os componentes, todo feito em GWT! Clique aqui.

Blog do GWT Brasil: Clique aqui.

Se você já usa GWT e quer algo mais avançado, o Pajé lhe recomenda participar deste concurso.

sábado, 6 de setembro de 2008

Firefox: Principais Plugins para Desenvolvimento

Se você é ou quer ser desenvolvedor web, independente de quais linguagens ou tecnologias você vai utilizar, certamente haverá a necessidade perene de testar seu sistema em pelo menos um navegador (dependendo do público a que se destina, será necessário testes em váááários navegadores!!). Entretanto, disto decorre um pequeno problema: os navegadores não foram feitos para testar portais, mas sim para visitá-los!! Por isso existem recursos como cache, armazenamento de senhas, etc..., coisas que podem mesmo atrapalhar o desenvolvedor nos seus testes de comportamento, funcionalidades e desempenho de seu sistema!!
Se é esta a sua situação, seus problemas acabaram!! E isto não é uma propaganda das facas guinço ou das meias vivarina!! Com um bom navegador, como o Firefox, e armado de certos plugins, tarefas como inspecionar o heap do navegador, investigar a estrutura de dados de cookies, manipular os processos de rede, medir posicionamentos, colocar breakpoints em scripts, manipular dados de XMLs, etc., impossíveis (ou hercúleas!) em condições normais, passam a ser simplórias e, muitas vezes, divertidas. Acompanhe como, com um mínimo de plugins, você se tornará um mestre da web:

  • MeasureIt: Este parece ser um daqueles plugins de web designer que um desenvolvedor nunca vai precisar, mas, acredite, como ele é útil!! E simples!! O MeasureIt coloca um singelo botãozinho no extremo esquerdo da barra de status do Firefox. Ao clicar nele, sua tela fica semi-transparente e, com o mouse, você é capaz de desenhar uma régua de qualquer tamanho, capaz de medir a altura e largura de qualquer item na tela. A régua pode ser arrastada e redesenhada. Agora você não precisa mais ficar "chutando" quantos pixels pra lá ou quantos pra cá vc vai colocar até acertar os componentes no lugar certo (ou até perder a paciência e achar que já não tá mais tão torto)... meça, veja o numerinho e reposicione seus componente numa única e certeira vez!!
  • Firebug: Este é tão essencial que, se você não o tem, você não pode ser considerado um desenvolvedor web moderno. O Firebug faz tudo que você sempre sonhou em fazer e nunca achou possível. Com ele, vc pode ler e alterar instantaneamente toda a estrutura DOM da sua página (não o HTML fonte, mas o DOM mesmo, ou seja, tudo que foi montado dinamicamente e está apenas no heap do navegador); pode ler cada arquivo js da página, colocar breakpoints nele, avaliar os valores das variáveis e alterá-los, além de entrar com comando num console simples, acessando o mesmo heap; pode fazer estatísticas e monitoramento de rede e de desempenho de cada requisição HTTP (bom para saber qual imagem vem de outro domínio, ou qual componente demorar mais para carregar); pode avaliar toda a hierarquia de CSS e aterar seus valores; suporta perfis e configurações. Ele ainda marca de azul na tela o componente que vacê tá editando, pra saber que é mesmo este!! Realmente, é o mais importante de todos os plugins!
  • WebDeveloper: Outro plugin muito importante! Com ele, você é capaz de tudo o que o Firebug não se propõe. Você pode configurar tamanhos de tela, para mudar com um clique (800x600, 1024x768, etc...); pode examinar detalhadamente, todos os cookies, ou apagar ou editar os valores de um específico; pode habilitar ou desabilitar qualquer coisa: css, java, javascript, etc... pode até exibir os comentários e os campos hidden em plena página!! Ele tem inclusive uma régua semelhante à do MeasureIt, embora eu não a prefira! Sem dúvida, você não vai querer ficar sem este plugin!!
  • XML Developer: Assim como o Web Developer, o XML Developer segue a mesma linha, porém agora centrado em arquivos XML. Você pode não precisar deste plugin, caso não utilize arquivos XML, mas ele pode vir a ser útil. Com o XML Developer, você pode validar um arquivo XML contra um Schema pré-existente ou mesmo gerar um Schema ou um DTD a partir de um XML pré-existente (fantástico!); pode salvar seu XML ou Schema para o disco (ótimo para quem tem que lidar com tantos WSDLs externos ao seus sistemas e precisa saber o que eles estão fazendo de errado!!); pode gerar estatísticas diversas para um XML, aplicar um CSS à sua visão, dentre outras coisinhas.

Conclusão: com um navegador gratuito e robusto, como o Firefox, e poucos plugins igualmente gratuitos e poderosos, bem selecionados e propriamente instalados, é possível se desenvolver para a web com muitos mais agilidade, facilidade, confiança e, principalmente, qualidade.

Útil: você pode pesquisar outros plugins para o firefox, inclusive os não direcionados a desenvolvedores, olhando aqui!! Se tiver preguiça, veja estas sugestões.

Análise do Chrome: Novo navegador OpenSource da Google

Esta semana, a Google lançou a versão beta de seu navegador web, denominado "Chrome". Trata-se de um navegador open source, desenvolvido há 1 ano e com a intenção de competir com o IE e o Firefox. Bom, o navegador ainda não tem a sua versão final (e a beta está disponível apenas para Windows, argh!!!), mas O Pajé saiu na frente e baixou o bichinho pra testar e já adiantar para todos vocês o que vem por aí!!
O Chrome é um navegador baseado em abas, leve e enxuto, simples, rápido e elegante. A Google investiu muito no aspecto visual, com várias figurinhas de animações para cada ação. Seguem abaixo os principais e mais interessantes pontos:

  • Sua interface não possui menus, barras de ferramentas ou de títulos. É muito bonita, cheia de animações e efeitos;
  • A janela principal abre com uma tabela de botões largos com retratos de telas dos portais mais visitados, bem ao estilo do Opera;
  • Flexibilidade: o Chrome é capaz de importar os favoritos, mecanismos de pesquisa, logins e senhas e histórico de navegação do Firefox e do IE!! Fantástico!
  • Abas são chamadas "Guias", como no IE... péssimo nome!!
  • Excelente console de Javascript, contendo, além de um depurador, totalmente inspirada no excelente plugin "Firebug", para o Firefox. Igualzinho mesmo!! Apresenta uma janela pop-up com uma visão repartida onde temos, à esquerda, o HTML da página, colorido e identado, e, à direita, a caixa de estilos, colorida e com visão de toda a hierarquia de CSS. Abaixo, um console de JavaScript onde se pode inclusive testar comandos.
  • Interpretação de CSS e javascript muito semelhante ao Firefox. Ou seja, o que funcionano IE e não no FF, tb não funciona no Chrome...
  • Se você gosta de inutilidades divertidas, tente apertar Shift + esc... vai aparecer uma janelinha de estatísticas na qual tem um estranho link: "Estatísticas para Nerds". Este link abre uma janela fantástica, muito inteligente, que monitora todos os navegadores abertos no seu ambiente, mostrando o consumo de memória de cada um, inclusive o Chrome (além de outras firulas...). Foi assim que descobri o quanto é importante fechar abas no Firefox, ehehehe...
  • Baixo consumo de memória (mais do que esperado!!). O Chrome, sozinho, consome de 10 a 15 megas de memória. Muito abaixo de outros navegadores...
  • Uma barra semi-transparente muito elegante, no lugar da barra de status, que se mostra apenas quando a informação contida nela muda.
  • Muita coisa não funciona, como algumas coisas em javascript, os applets mais sofisticados, como os utilizados em alguns portais de bancos, etc...
  • Tem um bug terrível na hora de apagar as informações pessoais: ele não apaga direito as senhas reportadas via pop-up ao estilo do JAAS. Eu inclusive reportei este bug para a Google... se vc errar a senha, precisa fechar o navegador e abrir de novo, senão a janelinha pedindo a autenticação não reaparece(!!!!!)... SARAVÁ!!!

Conclusão: parece ser um excelente navegador que está surgindo agora. Ainda tem vários pequenos ajustes a serem feitos, mas tem tudo para ser mais uma boa opção, com o devido amadurecimento, além de ser mais um grande esforço do mundo open source para trazer gratuitamente à comunidade mais uma alternativa para navegação web. Estamos ansiosos para testar a versão Linux, que (pretende-se) sairá em breve.

quarta-feira, 3 de setembro de 2008

Chegando ao Blogspot!!

Pessoal,

Muitos estão se perguntando, martirizando, torturando e se rasgando por não saber por que, afinal, o Pajé saiu do WordPress e veio para o Blogspot... bom, a resposta é rápida e simples: aqui, o Pajé Online terá mais flexibilidade de comunicação e interação com você, leitor amigo, mais opções de configuração e adaptação do blog, tornando-o melhor de todas as formas para todos os convidados do Pajé!!
Obrigado por acompanhar o Pajé!! Seja bem-vindo!!