Categoria → coisas legais
Raiva
Esse vídeo não é tão novo, mas representa uma situação que muitas pessoas já passaram. O suporte telefônico… O Rafinha Bastos do CQC falando como foi sua jornada com o suporte da NET.
WTF? Quake II em GWT?
Veja isso…
Um desenvolvedor do Google, nos 20% de tempo que são fornecidos para projeto próprio, resolveu portar o Quake II utilizando os novos recursos do HTML5. E para isso também utilizou o GWT. Não é impressionante? Agora acredito que o Flash possa “morrer”. Vou baixar o código-fonte do projeto e dar uma fuçada…
Escrevendo uma extensão de Twitter para o Google Chrome utilizando o Google Web Toolkit(GWT)
Estava olhando os exemplos de como criar extensões para o Chrome, e vi que assim como o no Firefox, as extensões não são nada mais que Javascript(mas no caso do Firefox tem os XUL envolvidos e etc…). Então pensei eu: “GWT gera Javascript, então ele deve funcionar para criar extensões”. Fiz uns testes básico e conclui. Funcionou. E aqui escrevo um tutorial dizendo como fiz para fazer isso funcionar. O objetivo desse tutorial não é ensinar GWT, é somente mostrar como configurar um projeto do GWT para rodar como uma extensão do Chrome.
Antes de tudo, vou dar um aviso que vai lhe poupar de alguns problemas: Salve todos os arquivos do exemplo com codificação UTF-8.
Como exemplo, criei uma aplicação para twitter bem simples, que só lê as últimas mensagens de um usuário qualquer.
Primeiramente criei uma aplicação no Eclipse chamada “ExtensaoChrome” com o pacote base chamado “com.serathiuk.chrome.extension.teste.client”.
Depois disso, alterei o arquivo ‘ExtensaoChrome.html’ da pasta war, deixando apenas com o seguinte HTML:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<link type=”text/css” rel=”stylesheet” href=”ExtensaoChrome.css”>
<div id=”intro_panel”></div>
<script type=”text/javascript” language=”javascript” src=”extensaochrome/extensaochrome.nocache.js”></script>
Na pasta war, coloquei o arquivo icon.png(o mesmo do exemplo oficial, link no final) e o arquivo manifest.json, que tem o seguinte conteúdo:
"name": "Leitor de Twitter",
"version": "1.0",
"description": "Exemplo de extensão para Chrome utilizando GWT do site serathiuk.com.",
"browser_action": {
"default_title": "Leitor de Twitter",
"default_icon": "icon.png",
"popup": "ExtensaoChrome.html"
},
"permissions": [
"http://www.twitter.com/"
]
}
Depois disso, apaguei aqueles arquivos que são criados pelo exemplo, deixando apenas o “ExtensaoChrome.java”, que é o Entry Point da aplicação. E no EntryPoint, apaguei todas aquelas informações do exemplo, e colocando o código para fazer a aplicação funcionar:
private TextBox txtLogin;
private FlexTable tableTwitter;
public void onModuleLoad() {
HorizontalPanel h = new HorizontalPanel();
txtLogin = new TextBox();
h.add(txtLogin);
Button btn = new Button("Carregar");
btn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
carregarTwitts();
}
});
h.add(btn);
ScrollPanel align = new ScrollPanel();
align.setWidth("100%");
align.setHeight("320");
tableTwitter = new FlexTable();
tableTwitter.setCellPadding(1);
tableTwitter.setCellSpacing(1);
tableTwitter.setBorderWidth(1);
align.add(tableTwitter);
VerticalPanel v = new VerticalPanel();
v.add(h);
v.add(align);
RootPanel.get("intro_panel").add(v);
}
protected void carregarTwitts() {
String url = "http://twitter.com/statuses/user_timeline/"+txtLogin.getValue()+".json";
RequestBuilder req = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
try {
req.sendRequest(null,
new RequestCallback() {
public void onResponseReceived(Request request, Response response) {
preencheValores(response.getText());
}
public void onError(Request request, Throwable exception) {
showError(exception);
}
}
);
} catch(RequestException e) {
showError(e);
}
}
protected void preencheValores(String jsonText) {
tableTwitter.removeAllRows();
JSONArray json = (JSONArray) JSONParser.parse(jsonText);
for(int i = 0; i < json.size(); i++) {
JSONObject obj = (JSONObject) json.get(i);
if(obj != null) {
JSONString str = (JSONString) obj.get("text");
tableTwitter.setText(i+1, 0, str.stringValue());
}
}
}
protected void showError(Throwable e) {
Window.alert(e.getMessage());
}
}
Agora é só compilar o projeto e adicionar a extensão ao Chrome. Para fazer isso, digite o endereço “chrome://extensions/”, clicar em “Load Unpacked Extension” e selecionar o diretório war da aplicação(ou o diretório onde está o manifest.json). Com isso a extensão estará rodando, é só clicar no ícone dela ao lado da barra de endereços.
Exemplo Oficial: http://code.google.com/chrome/extensions/getstarted.html
Código-Fonte deste exemplo: http://gwtchrome.googlecode.com/files/ExtensaoChrome.7z
Antes de tudo, vou dar um aviso que vai lhe poupar de alguns problemas: Salve todos os arquivos do exemplo com codificação UTF-8.
Como exemplo, criei uma aplicação para twitter bem simples, que só lê as últimas mensagens de um usuário qualquer.
Primeiramente criei uma aplicação no Eclipse chamada “ExtensaoChrome” com o pacote base chamado “com.serathiuk.chrome.extension.teste.client”.
Depois disso, alterei o arquivo ‘ExtensaoChrome.html’ da pasta war, deixando apenas com o seguinte HTML:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<link type=”text/css” rel=”stylesheet” href=”ExtensaoChrome.css”>
<div id=”intro_panel”></div>
<script type=”text/javascript” language=”javascript” src=”extensaochrome/extensaochrome.nocache.js”></script>
Na pasta war, coloquei o arquivo icon.png(o mesmo do exemplo oficial, link no final) e o arquivo manifest.json, que tem o seguinte conteúdo:
{
“name”: “Leitor de Twitter”,
“version”: “1.0″,
“description”: “Exemplo de extensão para Chrome utilizando GWT do site serathiuk.com.”,
“browser_action”: {
“default_title”: “Leitor de Twitter”,
“default_icon”: “icon.png”,
“popup”: “ExtensaoChrome.html”
},
“permissions”: [
"http://www.twitter.com/"
]
}
Depois disso, apaguei aqueles arquivos que são criados pelo exemplo, deixando apenas o “ExtensaoChrome.java”, que é o Entry Point da aplicação. E no EntryPoint, apaguei todas aquelas informações do exemplo, e colocando o código para fazer a aplicação funcionar:
public class ExtensaoChrome implements EntryPoint {
private TextBox txtLogin;
private FlexTable tableTwitter;
public void onModuleLoad() {
HorizontalPanel h = new HorizontalPanel();
txtLogin = new TextBox();
h.add(txtLogin);
Button btn = new Button(“Carregar”);
btn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
carregarTwitts();
}
});
h.add(btn);
ScrollPanel align = new ScrollPanel();
align.setWidth(“100%”);
align.setHeight(“320″);
tableTwitter = new FlexTable();
tableTwitter.setCellPadding(1);
tableTwitter.setCellSpacing(1);
tableTwitter.setBorderWidth(1);
align.add(tableTwitter);
VerticalPanel v = new VerticalPanel();
v.add(h);
v.add(align);
RootPanel.get(“intro_panel”).add(v);
}
protected void carregarTwitts() {
String url = “http://twitter.com/statuses/user_timeline/”+txtLogin.getValue()+”.json”;
RequestBuilder req = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
try {
req.sendRequest(null,
new RequestCallback() {
public void onResponseReceived(Request request, Response response) {
preencheValores(response.getText());
}
public void onError(Request request, Throwable exception) {
showError(exception);
}
}
);
} catch(RequestException e) {
showError(e);
}
}
protected void preencheValores(String jsonText) {
tableTwitter.removeAllRows();
JSONArray json = (JSONArray) JSONParser.parse(jsonText);
for(int i = 0; i < json.size(); i++) {
JSONObject obj = (JSONObject) json.get(i);
if(obj != null) {
JSONString str = (JSONString) obj.get(“text”);
tableTwitter.setText(i+1, 0, str.stringValue());
}
}
}
protected void showError(Throwable e) {
Window.alert(e.getMessage());
}
}
Agora é só compilar o projeto e adicionar a extensão ao Chrome. Para fazer isso, digite o endereço “chrome://extensions/”, clicar em “Load Unpacked Extension” e selecionar o diretório war da aplicação(ou o diretório onde está o manifest.json). Com isso a extensão estará rodando, é só clicar no ícone dela ao lado da barra de endereços.
Novidades, novidades, novidades…
Olá. Faz tempo que não posto nada. No último post tinha prometido o ínicio da série de tutoriais sobre GWT. O primeiro estava praticamente pronto, utilizando GWT 1.5 e Cypal Studio no Eclipse. Fui adiando, adiando, até que vi que existia a versão 1.6 Milestone 1 do GWT. Resolvi esperar sair o GWT 1.6 para começar a escrever os tutoriais, pois me atualizo enquanto escrevo.
Pois bem, saiu a nova versão do GWT. A versão 1.6 final. Não verifiquei a fundo as novas features, mas resolvi atualizar aquele antigo tutorial que eu estava escrevendo. Mas vi que era mais fácil reescreve-lo. Pois irei reescreve-lo para utilizar GWT, Eclipse e o novo plugin para GWT, que é oficial do Google, que uma das grandes novidades.
E o plugin “Google Plugin for Eclipse”, além de dar suporte à GWT ao Eclipse, dá suporte ao “Google App Engine for Java”. Sim meninos e meninas, agora o App Engine, como foi prometido a séculos, dá suporte a outra linguagem além do Python(e Fortran 77 segundo a piadinha de 1º de abril deste ano). Isso que o Google teve mais um monte de lançamentos, como Gmail Mobile para Android e IPhone, nova versão do Android, versão nova do Google Reader, e a lista vai.
E saindo da área do Google e indo para a do ExtJS, tivemos um lançamento. O Ext Core, que é o núcleo do ExtJS. Seria um ExtJS sem componentes. Algo com funcionalidades parecidas com a do jQuery, Prototype, etc. A licença não é a famigerada GPLv3 do ExtJS2.1 em diante. É a licença MIT, que pelo o que tudo indica, pode ser utilizada sem nenhum medo de ser feliz. Mesmo não tendo todo poder do ExtJS(que é mais voltado para RIA), me parece uma ótima biblioteca, quando você não necessite criar interfaces, mas sim apenas algo que facilite sua programação em Javascript. Ele tem um esquema bem legal para criação de classes e namespaces em Javascript. Vale a pena conferir.
Aí vai a lista de links:
Google Web Toolkit: http://code.google.com/intl/pt-BR/webtoolkit/
Google Plugin for Eclipse: http://code.google.com/intl/pt-BR/eclipse/
Google App Engine For Java: http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html
Google App Engine For Fortran 77(1º de abril): http://googleappengine.blogspot.com/2009/04/brand-new-language-on-google-app-engine.html
Ext Core: http://www.extjs.com/products/extcore/
Da série: Coisas geniais, mas inúteis
Isso é uma coisa legal que com certeza não irá mudar o mundo. Mas mesmo assim não deixa de ser legal.
Isso está na lista de “coisas que quero tentar fazer antes de morrer”.
Battlestar Galactica – The Face Of The Enemy – Webisódio 1
Saiu sexta-feira o primeiro webisódio de “The Face Of The Enemy”. Para quem não assistiu até o 4×10 é bom não ler o resto. Está “mini-série” irá contar eventos que ocorreram 9 dias depois da chegada da frota colonial na terra e a história dentro de um raptor centrada em “Felix Gayeta Gaeta” e assasinatos que ocorrem dentro desta nave durante esse tempo. A bordo na tripulação temos 2 “Number 8″, o piloto, o co-piloto e o próprio Gaeta. No mais o vídeo do primeiro webisodio:
SmartGWT 1.0b1 lançado
A alguns dias atrás foi lançado(depois de algum tempo que foi anunciado o projeto) o SmartGWT. O SmartGWT é um wrapper dara SmartClient, que traz novos componentes, mais parecidos com desktop, para o GWT(Google Web Toolkit). Esse projeto é de autoria de Sanjiv Jivan, o mesmo que criou o GWT-EXT, que é um wrapper para o ExtJS.
Apesar de não ter utilizado ainda o SmartGWT, o que tenho que dizer é que é um projeto bem promissor e na sua primeira versão parece superar o GWT-EXT em muitos quesitos. O maior dele, acredito eu, seja os memory leak’s. A Isomorphic Software, empresa que desenvolve o SmartClient, diz que o mesmo é livre de memory leak’s. E pelos clientes deles, acredito que eles não iam falar apenas pelo “marketing”. Para quem utiliza GWT-EXT ou até mesmo ExtJS, sabe que o mesmo tem graves problemas com referências circulares em JS, “orphan nodes” e outras coisas. Para aplicações realmente grandes, isso se torna um grande problema, por a aplicação ficar acumulando a memória do navegador com coisas que deveriam ser eliminadas.
Para a versão 3(ou 2.3, não me lembro) do ExtJS, eles prometem acabar com esses problemas. Mas temos um problema aí. A licença. Até a versão 2.0.2 do ExtJS tinhamos uma licença como LGPL. A partir da versão 2.1, a licença foi alterada para GPLv3. E GPLv3 é(me corrijam se eu estiver errado) uma licença que te obriga a compartilhar o código, e “contamina” todos os projetos que utiliza código licenciado com a mesma. Ou seja, é uma licença que não serve para ser utilizada comercialmente, pois nesse caso o código necessita ser restrito, para grande parte das aplicações(não, o mundo não é tão ideal como o Stallman quer). E nesse caso, por caso disso, o GWT-EXT não pode acompanhar a evolução do ExtJS. O GWT-EXT ficou restrito a versão 2.0.2 do ExtJS, a última em LGPL. E no caso do ExtJS, ele tem LGPL misturado com uma licença própria, que impede de criar um fork do ExtJS. Então o melhor a ser feito foi tentar corrigir os problemas do ExtJS via GWT-EXT, para as aplicações que já existem não ficarem ser suporte e criar algo novo que possa ser evoluir para novos usuários. E aí que entra o SmartGWT.
O SmartClient era de código fechado até 2007. Eles da Isomorphic abriram o código e licenciaram como LGPL. E prometem mante-lo assim. E apoiam o projeto do SmartGWT. Ou seja, tudo caminha para que o SmartGWT seja uma ótima alternativa para o GWT-EXT. Tudo isso se os Lordes de Kobol concordarem. heheeh.
Links:
SmartGWT: http://code.google.com/p/smartgwt/
SmartClient: http://www.smartclient.com/
Um bom final alternativo para “Naufrago”
Domingo de tarde, acabei de almoçar e assistindo TV. Na Globo estava sendo exibido “Naufrago”. E eu já tinha assistido esse filme um monte de vezes, mas sempre veio na minha cabeça(e acho que de todo que já assistiu) o que teria dentro daquela caixa. Como já estava com o notebook ligado, resolvi buscar no Google se existia algum “extra” do DVD de algum lugar que responderia essa pergunta. Mas o que achei foi um comercial da FedEX sobre o tema.
Ps.: Sei que muita gente já deve ter visto o vídeo, mas é que como o blog estava as moscas, vai qualquer coisa para “animar” um pouco.
Lançada a versão final do GWT 1.5
Depois quase 5 meses depois do lançamento do primeiro Milestone do GWT 1.5, é lançada a versão final do mesmo. Não cheguei a trabalhar muito com a versão 1.4, pois quando comecei a utlizar esta framework, já comecei na versão 1.5 Milestone 1. Mas a evolução de lá para cá foi bem visível. Suporte a LinkedHashMap, LinkedList, a Java 5(Annotation, Enums, Generics e afins), entre muitas melhorias. O Javascript gerado também ficou melhor e com uma performance melhor. Mais informações podem ser encontradas no blog oficial do projeto.
E para quem ainda não conhece a framework, pode conhecer mais sobre ela e fazer download da mesmaem site oficial.
Novo CD do Weezer e clipe novo
É. Finalmente saiu o Red Album(pelo menos ele já vazou na Net). E a alguns dias saiu um clipe novo do Weezer. Tudo bem, podia ser um clipe qualquer, mas esse clipe eu achei realmente foda(a música também). Eles tiveram a brilhante idéia de pegar tudo que o Youtube tem de melhor a oferecer e fazer um clipe baseado nisso. Tem coisas muito legais no clipe, como o Dramatic Chipmunk, Evolution of Dance, o Unicórnio Charlie, Will It Blend, Coca-Cola com Mentos entre outros.
Ps.: O CD do Weezer no Will It Blend: