Dart, webapps nativas e de maneira estruturada

Recentemente comecei alguns estudos em uma nova tecnologia da google chamada Dart. Uma linguagem orientada a objetos e com recursos funcionais concebida para criar aplicativos para a web. Dart oferece uma ide onde é possível depurar código, ter recursos como refatoração, code completion, etc…

O interessante dessa nova aposta é que as aplicações web executam nativamente dentro de uma vm chamada dart vm. É possível construir aplicações cliente e também servidor. O compilador de dart pode gerar código para dartvm ou javascript para fazer cross browser.

O código dart pode mapear quase totalmente o html5(ou totalmente) e css3.

Escrevi uma pequena aplicação de captura de vídeo em um dos estudos, quem que utiliza a webcam como fonte de mídia, aplica efeitos e o mais importante, “faz a captura” de um snapshot:

[code]import ‘dart:html’;

var filtros = [‘sepia’, ‘invert’, ‘contrast’];

bool hasCamSupport(){
return MediaStream.supported;
}

void main() {
//recupera componentes das tags html5 por meio do css selector #
var cmdStart = query("#cmdStart");
var cmdStop = query("#cmdStop");
var cmdSnapshot = query("#cmdSnapshot");
var cmdSepia = query("#cmdSepia");
var cmdInvert = query("#cmdInvert");
InputElement rgContrast = query("#rgContrast");
InputElement rgBrilho = query("#rgBrilho");
CanvasElement canvas = query("#screenshot");
ImageElement imagem = query("#imagem");

//esconde a tag da imagem
imagem.hidden = true;

//verifica se o browser oferece suporte para WebRTC
if(hasCamSupport()){
print(“Api de vídeo suportada”);
VideoElement video = query("#vid");
CanvasRenderingContext2D ctx = canvas.getContext(“2d”);

window.navigator.getUserMedia(audio:false, video: true).then((stream) {
    video.src = Url.createObjectUrl(stream);

    //inicia preview
    cmdStart.onClick.listen((event){
      video.classes.removeAll(filtros);
      video.play();
      
    });
    
    //pausa preview
    cmdStop.onClick.listen((event){
      video.pause();
    });
    
    //adiciona o filtro sepia
    cmdSepia.onClick.listen((event){
      video.style.filter = "";
      video.classes.removeAll(filtros);
      video.classes.add(filtros[0]);
    });
    
    //adiciona o filtro invert
    cmdInvert.onClick.listen((event){
      video.style.filter = "";
      video.classes.removeAll(filtros);
      video.classes.add(filtros[1]);
    });
    
    rgContrast.onChange.listen((event){
      String val =  event.target.value;
      video.classes.removeAll(filtros);
      String contraste = "contrast(${val}%)";
      video.style.filter = contraste;  
      print(contraste);
    });
    
    rgBrilho.onChange.listen((event){
      String val =  event.target.value;
      video.classes.removeAll(filtros);
      String brilho = "brightness(${val}%)";
      video.style.filter = brilho;  
      print(brilho);
    });
    
    //captura snapshot do preview
    cmdSnapshot.onClick.listen((event){
      if(stream != null){
        ctx.drawImage(video, 0, 0, 300, 150);
        imagem.src = canvas.toDataUrl("image/webp");
      }
    });
    
});

}else{
print(“Api de vídeo não suportada”);

}
}[/code]

Dart é uma tecnologia recente mas já concebeu o google plus e vários webapps da chrome store.

Código fonte em anexo.




Legal. [=

A google realmente gosta de jogar o código para javascript viu…

[quote=Hebert Coelho]Legal. [=

A google realmente gosta de jogar o código para javascript viu…[/quote]

Pelo livro que li dart é justamente a reestruturação da bagunça que é o javascript. Esse código acima pode compilar javascript ou gerar um executável. Quem puder fazer um teste verá que o desempenho da captura é incrível. Acho que consegue mais que 24 fps.

Tem como você colocar o código gerado aqui? Da página?

No source tem o html e o javascript que foi compilado. Você pode testar aí na sua casa com o chromium ou chrome, por enquanto os que suportam webrtc.
Vou expandir esse exemplo para pintar o vídeo em uma superfície 3d com webgl posteriormente.

Como fonte se você se interessar, pode começar a estudar aqui:

[youtube]https://www.youtube.com/watch?feature=player_embedded&v=5KlnlCq2M5Q[/youtube]

Estudar por agora tá complicado, mas olhei o código aqui.

O HTML fica limpo, o problema é se o javascript começar a dar pau em outros browsers. aí fica tenso.

Mas achei legal a idéia deles.

A página é um simples html5.

Dart consegue fazer a parte dinâmica usando os selectors do css3 e alterando o dom.

[code]

Teste

WEBRTC Snapshot estudo

<video id="vid"></video>
<canvas id="screenshot"></canvas>
<button id="cmdStart">Start</button>
<button id="cmdStop">Stop</button>
<button id="cmdSnapshot">Snapshot</button>
<button id="cmdSepia">Sepia</button>
<button id="cmdInvert">Invert</button>
<input id="rgContrast" title="Contraste" alt="Contraste" type="range" max="200"/>
<input id="rgBrilho" title="Brilho" alt="Brilho" type="range" max="100"/>
    
<script type="application/dart" src="teste.dart"></script>
<script src="packages/browser/dart.js"></script>
[/code]

Javascript gerado em anexo

Eu olhei aí, mas depois também olhei o dart.js e vi muuuuuito “if” lá. [=

É, engenheiros da Google trabalhando fortemente nisso.
Na apresentação dela, comentavam que seria a substituta da javascript para os browsers.

A linguagem é bem recente (foi lançada em 2011). Li comentários de que tinha como objetivo principal sistemas web alta escala.
Tinha alguns comparativos entre as linguagens mas não cheguei a ler/estudar a fundo sobre ela.

Só acho difícil remover parcialmente ou completamente o Javascript como a linguagem web nativa.
Ela está embutida a bastante tempo e tem sido evoluída constantemente. Também tem API´s muito interessantes como jQuery, que tem facilitado ainda mais o seu uso.
Mas enfim, veremos…

Existem outros arquivos que são usados pelo debugger. Eles fazem o mapeamento para a linguagem poder ser depurarada.

Uma “varrida” para baixo do tapete né? rs

É bem interessante, porém eu li em alguns lugares que essa tal de “Dart VM” não será suportada em browsers como o Mozilla Firefox. Isso ainda é verdade, ou já mudaram de ideia?

Uma “varrida” para baixo do tapete né? rs[/quote]

O if pode implicar na falta de “legibilidade” mas não do desempenho. O objetivo é o compilador fazer o código mais otimizado possível até porque sua atenção é para o código da linguagem dart. Javascript vai ficar como assembly para web.

É verdade, mas aí você compila para javascript. :slight_smile:

[quote=Hebert Coelho]Estudar por agora tá complicado, mas olhei o código aqui.

O HTML fica limpo, o problema é se o javascript começar a dar pau em outros browsers. aí fica tenso.

Mas achei legal a idéia deles.[/quote]

Eu cheguei a testar até no rekonq, e no que ele suporta de tags, algumas aplicações rodam perfeitamente. No mais, opera, mozilla e webkits +(chrome, chromium, web, etc…) rodam perfeitamente.

[quote=juliocbq][quote=Hebert Coelho]Estudar por agora tá complicado, mas olhei o código aqui.

O HTML fica limpo, o problema é se o javascript começar a dar pau em outros browsers. aí fica tenso.

Mas achei legal a idéia deles.[/quote]

Eu cheguei a testar até no rekonq, e no que ele suporta de tags, algumas aplicações rodam perfeitamente. No mais, opera, mozilla e webkits +(chrome, chromium, web, etc…) rodam perfeitamente.[/quote]O x da questão é na hora que começarem com códigos complexos.

JSF é uma marvilha para mostrar um valor ou outro na tela, na hora que o sistema cresce os problemas aparecem. O mesmo para struts, spring mvc e assim vai.

O que eu fico pé atrás é justamente ser tudo em javascript e cada browser interpretar isso como quiser.

[quote=Hebert Coelho][quote=juliocbq][quote=Hebert Coelho]Estudar por agora tá complicado, mas olhei o código aqui.

O HTML fica limpo, o problema é se o javascript começar a dar pau em outros browsers. aí fica tenso.

Mas achei legal a idéia deles.[/quote]

Eu cheguei a testar até no rekonq, e no que ele suporta de tags, algumas aplicações rodam perfeitamente. No mais, opera, mozilla e webkits +(chrome, chromium, web, etc…) rodam perfeitamente.[/quote]O x da questão é na hora que começarem com códigos complexos.

JSF é uma marvilha para mostrar um valor ou outro na tela, na hora que o sistema cresce os problemas aparecem. O mesmo para struts, spring mvc e assim vai.

O que eu fico pé atrás é justamente ser tudo em javascript e cada browser interpretar isso como quiser.[/quote]

Pelo menos o google plus tá firme e forte. Toda a infraestrutura dele é feita no dart. O jsf na minha humilde opinião e falando pela experiência que tenho nele é a pior tecnologia de web que já usei. O resultado é isso que você falou, código cheio de blobs e requisições desnecessárias no servidor. Com dart o processamento em sua maioria fica todo no cliente, que se comunica com o server somente para trafegar json. Então é muito rápido.

[quote=juliocbq]Pelo menos o google plus tá firme e forte. Toda a infraestrutura dele é feita no dart. O jsf na minha humilde opinião e falando pela experiência que tenho nele é a pior tecnologia de web que já usei. O resultado é isso que você falou, código cheio de blobs e requisições desnecessárias no servidor. Com dart o processamento em sua maioria fica todo no cliente, que se comunica com o server somente para trafegar json. Então é muito rápido.[/quote]Pois é, toda ferramenta má utilizada pode ferrar tudo.

É a mesma coisa que dar um caviar para um cozinheiro (que nunca estudou sobre isso) fazer.
Por isso vejo muita gente falando do JSF coisa errada… (ñ sei se foi seu caso)

Do mesmo modo esse cara aí pode ser utilizado de modo errado, ou interpretado de modo errado pelo browser.
Vamos ver até onde vai. Diversas coisas surgiram para ficar e estão morrendo. [=

Por esses dias estava disponível um Refcardz da DZone sobre Dart. Para quem quiser, é só ir no site da DZone e se cadastrar. Eu já tinha a visto antes, mas ainda não parei para dar uma olhada melhor.

Para quem quiser, há a linguagem CoffeScript também que gera JavaScript, mas creio que a abordagem da Dart e CoffeScript sejam diferentes, já que a Coffe está mais para uma wrapper language para o JS.

[quote=Hebert Coelho][quote=juliocbq]Pelo menos o google plus tá firme e forte. Toda a infraestrutura dele é feita no dart. O jsf na minha humilde opinião e falando pela experiência que tenho nele é a pior tecnologia de web que já usei. O resultado é isso que você falou, código cheio de blobs e requisições desnecessárias no servidor. Com dart o processamento em sua maioria fica todo no cliente, que se comunica com o server somente para trafegar json. Então é muito rápido.[/quote]Pois é, toda ferramenta má utilizada pode ferrar tudo.

É a mesma coisa que dar um caviar para um cozinheiro (que nunca estudou sobre isso) fazer.
Por isso vejo muita gente falando do JSF coisa errada… (ñ sei se foi seu caso)

Do mesmo modo esse cara aí pode ser utilizado de modo errado, ou interpretado de modo errado pelo browser.
Vamos ver até onde vai. Diversas coisas surgiram para ficar e estão morrendo. [=[/quote]

Eu acabei tendo que portar a aplicação para extjs por causa do desempenho. O gargalo todo fica em requisições desnecessárias no servidor por causa de alguns componentes do jsf. Com o dart você edita o html5 na mão ou pode criá-lo dinâmicamente. Então é menos abstração e mais controle no código.

Portar o código deu trabalho muito grande mas aumentou em muito a qualidade da aplicação.