jun 22 2010

Trabalhando com o Web SQL Database do HTML5

O joguinho do Pacman do Google mostrou ao mundo que o HTML5 já é uma realidade mas uma das funcionalidades mais legais ainda não foi muito divulgada, é o “Web SQL Database“.

O que é?

O Web SQL Database permite criar e acessar bancos de dados no lado do cliente (client-side) usando uma linguagem SQL.

Ou seja…

É uma alternativa a Cookies para armazenamento de dados no navegador e, mais legal ainda, dá uma independência maior as aplicações javascript, que em tese não dependerão mais de linguagens no lado do servidor (PHP, .NET, etc) para armazenar algo em um banco de dados.

O que não é

Isto tudo é muito legal, mas… é importante frisar algumas coisas:

  • Esta tecnologia não conecta a bancos de dados em servidores externos
  • O método é um pouco “caro” em termos de performance e somente deve ser usado se não houver outras alternativas
  • O navegador do usuário precisa suportar HTML5
  • Como a especificação e respectivas implementações do HTML5 ainda não estão 100% prontas, estes exemplos são mais provas de conceito do que qualquer outra coisa, a API poderá mudar na versão final

Tendo dito isto, vamos dar uma olhada mais a fundo e ver como funciona!  Se ainda não tiver o Google Chrome instalado, baixe ele agora pois é o browser que melhor suporta o Web SQL Database.

Como parto do pressuposto que estamos usando o Chrome, vou usar console.log() para as demonstrações, então abra o console do chrome (clique com o botão direito, em inspecionar elemento e na aba “Console”). Todo o código vai dentro de um tag <script> normal.

Como instanciar o objeto database

// o método OpenDatabase precisa de 4 parametros; o nome do banco de dados, a versão, a descrição e o tamanho estimado (em bytes)
var db = openDatabase("Teste", "1.0", "Teste Web SQL Database", 200000);

// deverá mostrar "Database"
console.log(db);

// de qualquer forma, sempre teste que o objeto foi instanciado direito antes de usá-lo
if(!db){
    alert('deu pau!');
}

O conceito de versões é um pouco enganoso, pois não é possível existirem múltiplas versões do mesmo banco ao mesmo tempo; ele é apenas para facilitar migrações entre versões de bancos.

Executando uma consulta

Para fazer consultas, utilizamos o método transaction do objeto database e, dentro dele, o método executeSql do objeto SQLTransaction:

// o método transaction aceita uma função anônima que recebe um objeto SQLTransaction como parâmetro
db.transaction(function(transaction){
    transaction.executeSql("SELECT COUNT(*) FROM Teste", null, null, null);
});

// os parametros são, respectivamente: a consulta, as variáveis a serem "bindadas", callback de sucesso e callback de erro, ou seja:

db.transaction(function(transaction){
    transaction.executeSql(
        // a consulta
        "SELECT COUNT(*) FROM Teste",
        // variáveis para bind, como é um SELECT, passamos um array vazio
        [],
        // callback de sucesso, uma função anônima que recebe um objeto SQLTransaction e um SQLResultSet
        function(transaction, result){
            console.log('deu certo!');
            console.log(result);
        },
        // callback de erro, função anônima que recebe um objeto SQLTransaction e um SQLError
        function(transaction, error){
            console.log('deu pau!');
            console.log(error);
        }
    );
});

Se rodar o código acima, verá que a consulta dará um erro e retornará um objeto SQLError, para acessar a mensagem de erro é só acessar as propriedades “code” e “message” do objeto.

Dê uma olhada na mensagem de erro… pois é não criamos a tabela!

Como criar e popular uma tabela

O SQL não é nenhuma novidade, só é necessário envolvê-lo nos métodos corretos:
(alias, ele utiliza statements preparados, para proteção contra SQL Injection, mas isto está fora do escopo deste artigo!)

db.transaction(function(transaction){
    // criar a tabela
    transaction.executeSql("CREATE TABLE Teste (id REAL UNIQUE, nome TEXT, timestamp REAL)", [], null, null);

    // num caso de verdade, iríamos incluir callbacks para verificar que deu tudo certo mas para não estender demais o código vou pular esta parte...

    // inserir dados
    // obs - repare que usamos um "statement preparado", colocamos interrogações no lugar das variáveis e as listamos em um array no segundo parametro, fazendo bind delas
    transaction.executeSql("INSERT INTO Teste (nome, timestamp) values(?, ?)", ['Alex', new Date().getTime()], null, null);
});

Pronto! Fácil né? Agora tente rodar a primeira consulta denovo… não deu erro né? Se deu tudo certo, o objeto retornado será do tipo SQLResultSet. Se inspecionar o objeto verá que ele tem algumas propriedades úteis: insertId (no caso de inserts), rowsAffected, rows (no caso de selects).

Utilizando os resultados

Para finalizar o artigo, vou mostrar como interagir com os resultados. Para isto, vamos mudar um pouco a consulta inicial:

db.transaction(function(transaction){
    transaction.executeSql(
        "SELECT * FROM Teste",
        [],
        function(transaction, result){
            console.log('deu certo!');
            console.log(result);

           for(var i = 0; i < result.rows.length; i++){
               console.log(result.rows.item(i)['nome']);
           }
        },
        function(transaction, error){
            console.log('deu pau!');
            console.log(error);
        }
    );
});

Repare que podemos tratar o objeto SQLResultSet como um array e não só ver a propriedade length() mas também fazer um loop e acessar o seu conteúdo!

Legal né?

Espero que tenham curtido o artigo e que se animem com as possibilidades que o HTML5 está trazendo!

[]s


jun 21 2010

Usando easing para animações com jQuery

Eu já havia mencionado o Easing em outro artigo, e me perguntaram estes dias como se usa o plugin para controlar melhor animações, então resolvi escrever um artigo rápidinho para esclarecer e mostrar o poder do easing.

Preparação

Se já não o tiver feito, vá para o site e baixe o plugin.  Vamos utilizar uma página bem simples em HTML:

<html>
<head>
<title></title>
<style type="text/css">
#target {
	background-color: red;
	width: 200px;
	height: 200px;
	position: relative;
}
</style>
<script src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.4.2");</script>
<script type="text/javascript" src="jquery.easing.1.3.js"></script>
<script type="text/javascript">
    // nosso código irá aqui
</script>
</head>
<body>

<div id="target"></div>

</body>
</html>

Até aqui sem novidades, agora vamos fazer uma animação simples:

jQuery(document).ready(function($){
    $('#target').click(function(){
        $(this).animate(
            { left : 100 },
            1000
        );
    });
});

Beleza, quando clicamos no div anima a sua propriedade left até 100 em um intervalo de 1000ms.

E agora, para dar uma variada, vamos usar um pouco de easing!

jQuery(document).ready(function($){
    $('#target').click(function(){
        $(this).animate(
            { left : 100 },
            1000,
            'easeInBounce' // adicionamos um efeito easing
        );
    });
});

Legalzinho né? Bom, é isso ae, não tem segredo! Para o easing por sí só não é tão útil assim, mas pode ser combinado com vários outros plugins por exemplo o Cycle para refinar o controle sobre as animações.

O site do plugin possui alguns exemplos mas é meio confuso, recomendo dar uma olhada aqui para ver exatamente o que faz cada efeito disponível no plugin.

Até mais!

[]s


jun 18 2010

Executando Javascript Automaticamente

Muitas vezes precisamos executar algum javascript assim que a página terminar de carregar e fazer isto não é segredo:

<body onload="minhaFuncao();">

Este método funciona perfeitamente mas ele polui o DOM e é contra boas práticas escrever javascript inline, logo o ideal seria encontrar outro método…

Quem usa bastante jQuery sabe que dá pra fazer a mesma coisa assim:

jQuery(window).load(function($){
    // código
});

Mas e se precisar fazer isto sem o jQuery???

A solução é um truquezinho legal:

(function(){
    // código
})();

Se você colocar este código dentro de tags <script> normais ele será executado assim que o documento for carregado!

OBS: Também é possível fazer do modo tradicional (e bem menos estiloso), bindando o evento ao “onload” do window:

window.onload = function(){
   // código
};

jun 14 2010

jQuery Scratchie

Litebox

EnglishPortuguês

jQuery Scratchie é um plugin completo para criar “raspadinhas”.

Defina uma imagem de fundo (o prêmio) e uma imagem ou cor para cobrir e clique ou arraste o mouse por cima para revelar a imagem debaixo!

Atualizado: 02/06/2010

Demo | Project @ GitHub | Download Link


mar 2 2010

Javascript Orientado a Objetos?

Como assim?  Você quer dizer usando jQuery não é?

Não!

Cada vez que aprofundo os meus conhecimentos de Javascript me vem à cabeça o artigo do lendário Douglas Crockford, aonde ele o qualifica qualifica como  “a linguagem de programação mais incompreendida do mundo”.

E convenhamos, não é a toa!  Como o pessoal do jQuery e outras bibliotecas já descobriu, o javascript pode fazer muito mais do que validar formulários e dar alerts e confirms… O surgimento destas bibliotecas foi uma faca de dois gumes pois apesar de ser enormemente responsável pelo ressurgimento da linguagem e por torná-la popular, também fez com que poucas pessoas de fato saibam usá-lo sem o auxílio de uma biblioteca… e eu me incluo neste grupo!

Recentemente decidi tentar criar algo em js puro e gostaria de compartilhar algumas coisas.

Objetos no Javascript

Quem já trabalhou com JSON com certeza já conhece o tal do “Object Literal”:

{
    nome : 'Alex',
    idade : 26
}

Pois aí está a forma mais simples de um objeto Javascript, o tal do literal! Veja outro exemplo: (e desculpem a falta de criatividade…)

function carro(params){
    this.velocidadeAtual = 0;
    var velocidadeMax = 100;

    this.acelerar = function(){
        if(this.velocidadeAtual < velocidadeMax){
            this.velocidadeAtual += 10;
            alert('vroom');
        }
    }
}

var car = new carro();
alert(car.velocidadeAtual);
car.acelerar();

O objeto pode ser instanciado e os seus métodos e propriedades podem ser acessados pela instância... legal não é? E aí, está se perguntando porque usei var para declarar uma variável e this pra declarar a outra?

Escopo de Métodos e Propriedades
obs - eu uso os termos métodos e funções intercaladamente, assim como propriedades e atributos... :)

Quando se está trabalhando com objetos no javascript, apesar de não existir palavras-chave delimitadoras de escopo como public ou private, é possível obter o mesmo resultado usando this e var, respectivamente.

Tal como o PHP e outras linguagens orientadas a objetos, o this se refere à instância do objeto, até aí sem novidades... Já o var tem a sua visibilidade delimitada ao escopo atual, ou seja, se for declarada dentro da função não será visível fora dela. Neste caso, o efeito resultante é o de uma variável privada.

E finalmente...

Herança

Antes de mais nada, não dá pra frisar o suficiente que o javascript não possui um sistema de "herança clássica". Na verdade nem possui classes e os seus objetos são "prototipados", ou seja: são definidos na hora para atender a uma necessidade. Existem várias formas de obter o efeito de herança entre objetos e isto é até hoje um tema para o qual não há uma só solução. Veja um exemplo simples:

function ClassePai() {
    this.teste = function(){
        alert('teste da classe pai');
    }
}

function ClasseFilho() {

}

// agora a parte legal, vamos herdar os métodos da classe pai
ClasseFilho.prototype = new ClassePai();

// testando
var filhote = new ClasseFilho();
filhote.teste();

Em conclusão: O javascript é uma linguagem bastante subestimada e poderosa, que pode ser usada para agregar bastante valor e transformar completamente a experiência do usuário no seu site. E claro, use o jQuery, YUI, MooTools, etc... só não se esqueça como programar em javascript! :)

Leia mais
http://ejohn.org/blog/simple-javascript-inheritance/
http://javascript.crockford.com/prototypal.html
http://www.sitepoint.com/blogs/2006/01/17/javascript-inheritance/
http://ajaxpatterns.org/Javascript_Inheritance
http://www.kevlindev.com/tutorials/javascript/inheritance/index.htm


dez 6 2009

jQuery Litebox

Litebox

EnglishPortuguês

jQuery Litebox é uma implementação ultra-leve e sem firulas de “lightbox”. O plugin não precisa de nenhum CSS e requer configuração mínima para funcionar.

Após usar praticamente todos plugins de lightbox de jQuery por aí resolvi criar um que atendesse às minhas necessidades: que fosse leve, simples e que funcionasse sem dor de cabeça. Esta aí!

Atualizado: 07/12/2009

Demo | Project @ GitHub | Download Link


set 6 2009

jQuery SHA256

SHA256

EnglishPortuguês
jQuery SHA256 é um plugin baseado na implementação em Javascript do algoritmo SHA256 feita por Angel Marin e Paul Johnston. Permite obter o SHA256 de qualquer valor e tabém gerar um keyed-Hash Message Authentication Code (HMAC) usando uma chave (key) e o valor.

O plugin é leve e funcional.

Atualizado: 06/09/2009

Demo | Project @ GitHub | Download Link


set 5 2009

Nova versão do plugin jQuery CoolInput

Finalizei hoje a provável versão final do plugin de jQuery CoolInput!

Para quem ainda não conhece, veja a página do projeto.

A nova versão traz a possibilidade de especificar a dica (ou ‘hint’) manualmente sem ter que usar algum atributo e também permite que esta mesma configuração seja feita de uma maneira mais prática.

Como sempre, estou aberto a críticas e sugestões!


ago 28 2009

jQuery CoolInput

CoolInput

EnglishPortuguês

CoolInput é um plugin extremamente simples inspirado no tutorial do Remy Sharp sobre criar um text-hint plugin. Após ler o seu artigo percebi que gostaria de adicionar algumas opções adicionais e também queria criar o meu primeiro plugin, então aqui está o CoolInput!

CoolInput é usado para criar dicas (hints) para campos de texto. O plugin é altamente customizável se necessário mas pode ser usado sem nenhuma configuração. Simplesmente funciona.

O plugin é absuradamente simples e leve!

Atualizado: 05/09/2009

Demo | Project @ GitHub | Download Link


ago 26 2009

Typekit, o fim das Web-safe Fonts?

Está no ar o beta do Typekit, um serviço que promete revolucionar como web designers encaram o processo de desenhar e implementar sites.

O problema:

Hoje em dia são poucas as fontes que são padrão para usuários de diferentes sistemas operacionais e as suas respectivas versões.  O que acaba acontecendo, para que tenhamos a segurança de que um site aparecerá da forma como planejamos, é que usamos as fontes mais comuns como Arial, Georgia e Verdana.

A solução?

O Typekit é um serviço que promete permitir total liberdade a desenvolvedores na hora de implementar o design de seus sites, permitindo o uso de qualquer fonte na web, sem a necessidade do usuário a ter instalada.  É só se cadastrar no site, incluir a biblioteca de Javascript deles e pronto!

Veja alguns exemplos:

Fonte “Edding 780″:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce quam erat, feugiat sed suscipit ac, lacinia sit amet ligula? Nulla facilisi. Mauris et leo tellus. Integer ante leo, eleifend tincidunt ornare non; lacinia quis nisl.

Fonte “CarbonType”:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce quam erat, feugiat sed suscipit ac, lacinia sit amet ligula?

Percebeu que não é flash, nem imagem, é texto mesmo! Dá pra selecionar, copiar, etc…Revolucionário, não?

Na verdade, nem tanto! Após investigar um pouco, percebi que o Typekit nada mais faz do que utilizar a nova propriedade de CSS3, @font-face, que permite a inclusão de qualquer fonte em uma página, contanto que seja especificada uma url para a mesma.

@font-face {
    font-family: Fenwick;
    src: url('fenwick_ol_free.ttf');
}
.ff-fenwick {font-family: Fenwick;}

Veja um exemplo usando somente a propriedade @font-face:

Fonte “Fenwick”:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce quam erat, feugiat sed suscipit ac, lacinia sit amet ligula? Nulla facilisi. Mauris et leo tellus. Integer ante leo, eleifend tincidunt ornare non; lacinia quis nisl.

Se você está não está vendo nenhuma diferença provavelmente é porque está usando Internet Explorer! Firefox, Opera, Safari e Chrome já oferecem suporte, porém em alguns casos é necessário habilitar a funcionalidade. Leia este artigo para saber mais sobre a compatibilidade dos navegadores.

Para satisfazer a curiosidade do pessoal do Internet Explorer, segue uma foto:

Demonstração da propriedade CSS3 @font-face

Conclusão
Em relação ao Typekit, não dá para culpá-los. Eles de fato cumprem o que prometem, apesar do método deles não ser estritamente necessário, já que algumas linhas de css produzem o mesmo resultado.

A sacada e proposta de valor deles se dá em relação às fontes comerciais que não podem ser distribuídas de graça: a partir da utilização de 2 fontes, é cobrada uma taxa mensal.

Quanto ao CSS3, que não era nem o assunto deste artigo, fica uma surpresa agradável. Para ser sincero até agora eu nem havia me inteirado muito (apenas com as bordas arredondadas que aparecem pelo site) mas percebi que a hora do CSS3 é agora! E, de fato, estamos chegando ao fim da era das chamadas “web-safe fonts”. RIP.

E você, o que acha?  Será mesmo o fim das web-safe fonts, ou é mais uma modinha que não vai dar em nada?  Comente!

Agradecimentos: Josh Salverda e CSS3.info

Veja aonde baixar a fonte gratuita Fenwick