Jul 24 2008

A re-introduction to JavaScript

Tag: Javascriptdavid @ 1:30 pm

Javascript ainda é minha linguagem favorita, é um fato inegável, todo mundo tem um hábito ou um gosto esquisito na vida sobre o qual não comenta muito… algumas pessoas gostam de ouvir Jamiroquai, outros gostam de jogar Strategy RPGs ou assistir anime de robô gigante. Eu gosto de Javascript (e de todas as outras tranqueiras citadas).

Estive procurando referências sobre a implementação do objeto Array no Firefox 3 para saber se de alguma forma se assemelhava ao novo Array flexível do IE 8 e acabei encontrando um resumo muito bem feito sobre as características únicas dessa línguagem na própria documentação da Mozilla.

A re-introduction to JavaScript

O melhor resumo rápido em texto que eu já encontrei, mas ainda não bate a série de vídeos do Crockford (que você pode ver no Yahoo! UI Theater).

Why a re-introduction? Because JavaScript has a reasonable claim to being the world’s most misunderstood programming language. While often derided as a toy, beneath its deceptive simplicity lie some powerful language features. 2005 has seen the launch of a number of high-profile JavaScript applications, showing that deeper knowledge of this technology is an important skill for any web developer.


Jun 27 2008

Achievement Unlocked: MCP

Tag: C#david @ 8:22 pm

 

Fiz hoje a prova base do framework .Net (Microsoft .NET Framework - Application Development Foundation 70-536) e felizmente consegui passar. Uma coisa interessante é que algumas pessoas com quem eu conversei disseram que era muito fácil, que o transcender era mais difícil que a prova.

Minha experiência pessoal: Balela.

Foi certamente uma das provas mais complicadas que eu já fiz, as partes de segurança e serialização foram duríssimas, das 40 questões que eu respondi apenas 7 eram similares as mais de 200 questões de preparação que eu respondi antes da prova.

Não tenho vergonha nenhuma de dizer que eu fiquei de olhos marejados ao ver o “Passed”, quem me salvou mesmo foi o Professional C# da Wrox, já que o livro do kit oficial de preparação para a prova e os simulados não foram o bastante para garantir uma “experiência tranquila”.

Não sei se a prova mudou ou se eu sou fraco mesmo, mas recomendo no mínimo 2 meses de estudo dedicado para quem quiser se aventurar.

E que venham a 70-528 e a 70-562…


Jun 23 2008

Acessando QueryStrings por Javascript

Tag: Javascriptdavid @ 8:52 pm

Dei uma alterada no já manjado código para acessar QueryStrings no client (vez ou outra alguém precisa de algo desse tipo) meu objetivo era não poluir o já super lotado escopo global do browser e tornar o acesso ao hashtable de QueryStrings privado por motivos de segur… nah, tornei privado apenas para brincar com clousures.

Uma coisa legal é que se não existirem QueryStrings eu retorno nada, nem mesmo aquele espaço no document.location.QueryString eu ocupo nesse caso.

document.location.QueryString = (function (){
    var params = {};
    var qs=location.search.substring(1,location.search.length)
    if (qs.length == 0) return
    qs = qs.replace(/\+/g, ‘ ‘)
    var args = qs.split(’&’);
    for (var i=0;i<args.length;i++) {
      var value;
      var pair = args[i].split(’=');
      var name = unescape(pair[0]);
      if (pair.length == 2){
          value = unescape(pair[1]);
      }
      else{
        value = name;
      }
      params[name] = value;
    }
   return function(key){
    var value = params[key];
    if (value !=null){
      return value;
    }
  }
})();

Depois é só acessar o valor por:

//retorna o valor associado
location.QueryString(”keyName”);

Se alguém perceber algum bug, por favor comente.


May 21 2008

Percorrendo Javascript Objects como uma árvore binária

Tag: Javascriptdavid @ 2:41 pm

Estive dando uma revisada no meu material antigo nos últimos dias e acabei revendo uma série de vídeos do Doug Crockford (pela décima ou décima primeira vez, não me recordo precisamente, ainda estão no YUI! Theater e vocês deveriam assistir todos eles também, mais de uma vez) e em um dos trechos acabei me deparando com a já bem comentada função walkTheDom, usada para percorrer recursivamente um nó ou toda a árvore do DOM utilizando os recursos de reflection do Javascript de uma forma ou de outra.

function walkTheDOM(node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walkTheDOM(node, func);
        node = node.nextSibling;
    }
}

Uma série de estruturas no browser se encaixam nesse paradigma, os próprios objetos Javascript são estruturas de dados que podem ser percorridas exatamente da mesma forma, e do mesmo jeito que o mestre Crockford percorre o DOM você pode pode percorrer um Objeto interrogando todos os seus elementos filhos a procura de quem interessa, um método de um objeto, um valor, um objeto específico. A coisa pode ficar realmente complexa se levarmos em consideração que um objeto js é uma cadeia de elementos sem um final definido, podemos ter um objeto que contenha um array de objetos que contenha um outro array de objetos e assim por diante. Para um exemplo prático dê uma olhada no objeto YAHOO utilizado como namespace na YUI! (e que na prática é um objeto js como qualquer outro):

Um exemplo inocente:

var walkThatObject = function(object, func){
    for(var prop in object){
        func(object[prop]);
        if(typeof object[prop]== ‘object’){
            walkThatObject(object[prop], func);
        }
    }
}

//Poderia ser uma literal de objeto aqui
var thatObject = {};

thatObject.Nome = ‘David’;
thatObject.Sobrenome = ‘Duarte’;
thatObject.Qualidades = {qualidade1:’Geek’, qualidade2:’Javascripter’, qualidade3:{subqualidade:’Bom filho’}};

walkThatObject(thatObject, function(obj){
    if(typeof obj == ’string’){
        alert(obj);
    }
});

Interessante e “extremamente relevante” não? Pense nisso…


May 20 2008

Cross-Site XMLHttpRequest? Não no Firefox 3

Tag: Javascriptdavid @ 8:30 pm

Veio o RC1 e entre muitas melhorias (o tão falado gerenciamento de memória, e algumas novidades em relação ao Javascript por exemplo) uma decepção ficou aparente, pelo menos a meu ver já ficou claro que podemos perder as esperanças de ver XHR Cross-Domain na versão final do Firefox 3, ou pelo menos as esperanças de ver isso funcionando nas páginas web.

O nada discreto aviso continua na página de documentação da Mozilla dizendo “This feature is available in Firefox 3, but only to extensions and other privileged code; it is not currently available for web content” então pela primeira vez em meses acho que posso dizer que o time do IE saiu na frente em alguma coisa.

Enquanto o pessoal da Mozilla não conseguiu resolver a sua implementação o time do IE simplificou e criou um objeto a parte só para esse fim, o XDomainRequest , particularmente achei inteligente separar as coisas, uma vez que permite que algumas validações sejam incorporadas a implementação nativa ( item 2 do working draft da W3C cita: ” Must not require content authors or site maintainers to implement new or additional security protections to preserve their existing level of security protection.”).

Puxa, bastante tempo sem reclamar de nada, postarei com mais frequência :-P


Feb 26 2008

Como funcionam os timers no Javascript

Tag: Javascriptdavid @ 11:35 am

John Resig (JQuery/Mozilla) postou um artigo muito interessante no seu blog sobre como funcionam os timers em Javascript, vale a pena dar uma olhada porque é uma descrição muito mais detalhada do que a que presente no livro “Javascript - The Definitive Guide”(14.1 - Timers) , a bíblia a programação client-side. O texto é uma amostra do conteúdo do livro “Secrets of Javascript Ninja”, ainda não lançado.

Em um nível fundamental é importante entender como os timers funcionam em Javascript. Frequentemente eles se comportam de maneira não muito intuitiva por estarem todos em uma única thread. Vamos examinar as três funções para construir e manipular timers:

  • var id = setTimeout(fn, delay); - Inicia um timer simples que vai invocar a função depois do intervalo especificado. A função retorna um ID único que pode ser usado para cancelar o timer.
  • var id = setInterval(fn, delay); - Similar a setTimeout mas continua invocando a função aplicando o mesmo intervalo (delay) até ser cancelada.
  • clearInterval(id);, clearTimeout(id); - Aceita um timer ID (o retorno das funções anteriores) e interrompe a execução do timer

Para entender melhor como os timers funcionam internamente existe um conceito importante a ser explorado: O delay não é garantido, o problema é que o Javascript no browser é executado em uma única thread, o que força todos os eventos assíncronos (clicks de mouse e timers) a rodarem apenas quando ouver uma “janela” de processamento. Isso é melhor demonstrado em forma de diagrama:

427px-timers.png

Apesar do nome esdrúxulo parece que esse livro vai ser mais interessante que o primeiro, “Pro JavaScript Techniques”, que eu achei muito fraco (bem aquém das minhas expectativas por ser um livro do criador da JQuery).

O artigo original está no endereço http://ejohn.org/blog/how-javascript-timers-work/


Jan 22 2008

toJSONString() anywhere

Tag: Javascriptdavid @ 11:14 am

Nicholas C. Zakas, autor do livro “Professional Javascript” da Wrox e atualmente trabalhando no Yahoo! como Frontend Engineer (My Yahoo!) é mais um dos que tem alguma coisa a reclamar quando o assunto é EcmaScript 4 (Javascript 2.0). Uma das premissas da nova linguagem é a integração do JSON como formato de dados padrão da linguagem, segundo a especificação do E4X um tipo Object terá o método toJSONString(), o que pode parecer inteligente a primeira vista mas como Object é a base para todos os outros tipos nativos as funções de serialização seriam adicionadas mesmo a tipos onde seriam totalmente inúteis. Onde está a vantagem de serializar um tipo Date ou Regex para JSON?

Obviamente a funcionalidade de serialização como todas as funcionalidades de suporte devem ser providas por uma interface externa, esse é um conceito fundamental e não existe nenhum motivo prático para ser diferente disso.

Um ponto interessante levantado pelo próprio Nicholas é que nunca houve nas especificações anteriores do EcmaScript qualquer referência a um formato de dados padrão, nem mesmo suporte nativo a XML foi adicionado em nenhum momento, então porque tentar empurrar JSON para dentro da linguagem? O correto é prover recursos para que JSON, XML e qualquer outro formato que venha a surgir sejam integrados da forma mais transparente possível, mesmo que por meio de bibliotecas.

Melhor do que apenas jogar pedras é sugerir uma solução melhor, Zakas postou em seu site pessoal a implementação da JSONLib, um modelo contendo 2 classes simples, uma para objetos JSON e outra para uma coleção de objetos JSONList.

1 - The addition of two new global types: JSON and JSONList. JSON represents a JSON object while JSONList represents a JSON array.

2 - Both types have a toJSONString() method that correctly encodes an object into a JSON string. The default toString() method is available but returns a string representation of the object (not a JSON string). This follows the convention set forth in E4X.

3 - The [[Put]] method is overridden in both types such that it will only accept values of type JSON, JSONList, Date, boolean, string, number, or null. Any other data types cause an error to be thrown.

4 - The JSON constructor allows an object to be passed in that has initial properties to add; the JSONList constructor allows an array to be passed in with items to add.

5 - The typeof operator should return “json” when used on a value of type JSON or JSONList.

6 - JSON strings are parsed via JSON.parse(), throwing syntax errors if they are found.

Exemplos simples de implementação:

var obj = JSON.parse(”{\”name\”:\”Nicholas\”,\”age\”:29}”);

var json = new JSON();
json.put(”name”, “Nicholas”);
json.put(”age”, 29);
var name = json.get(”name”);
var str = json.toJSONString();

var list = new JSONList();
list.put(0, “blah”);
list.push(25);
list.push(true);
var val = list.get(1);
var len = list.getLength();
var str = list.toJSONString();

var json = new JSON({name:”Nicholas”});
var name = json.get(”name”);

var list = new JSONList([1, 2, 3, 4]);
var val = list.get(2);
list.push(function(){}); //throws error

O artigo original pode ser visto em:
http://nczonline.net/archive/2008/1/537


Dec 03 2007

Brendan Eich vs The Lambda JavaScript Programming

Tag: Javascriptdavid @ 1:32 pm

beich.jpgQuem aparentemente perdeu a fé no jeito clássico de programar Javascript foi o próprio criador da linguagem, Brendan Eich, hoje trabalhando como CTO da Fundação Mozilla Brendan falou um pouco a respeito do assunto no evento @media Ajax London onde apresentou suas idéias de como e para onde a linguagem criada por ele a mais de uma década (ainda na Netscape) deve evoluir. Os slides da apresentação podem ser conferidos aqui:

Brendan Eich é hoje um dos maiores defensores de mudanças na estrutura da linguagem e acredita que a implementação do Javascript 2 baseado no ES4 (EcmaScript 4) nos browsers já a partir do Firefox 4 pode corrigir problemas antigos que envolvem segurança e performance. Outros especialistas, entre eles Douglas Crockford, acreditam que o modelo proposto no ES4 descaracteriza totalmente a linguagem atual deixando a programação no browser mais parecida com Java e outras linguagens igualmente rígidas.

Eu acredito que exista espaço para muitas melhorias na forma como fazemos as coisas no browser, algumas coisas citadas por Brendan em seu blog fazem muito sentido, mas como foi citado por Douglas Crockford no vídeo The State of Ajax o browser de hoje já está sofrendo os efeitos da idade. Sejamos realistas, o que as pessoas querem são experiências mais ricas e interativas, sistemas operacionais rebuscados e processadores multi-core estão pipocando pelo mundo enquanto no browser ainda ficamos maravilhados a cada drag & drop, toda vez que alguém cria uma interface relativamente inteligente e com recursos que seriam absurdamente banais se o runtime fosse por exemplo o flash e não um browser, nós aplaudimos e o cara ganha seu pequeno artigo no Ajaxian.

Continue lendo: “Brendan Eich vs The Lambda JavaScript Programming”


Next Page »