segunda-feira, 28 de setembro de 2009

Javascript closures

Bom dia!
Tal como tinha dito, irei neste post falar sobre closures. Os closures são uma das features mais importantes do javascript.
É algo dificil de explicar o que é o closure, mas vou tentar dar um exemplo totalmente académico e demonstrar a partir do exemplo:
<script>
function sum(x)
{
return function (y){
return x+y;
}
}
var sumaux=sum(5);
var result=sumaux(4);
alert(result==9); //true
</script>

Neste código, temos uma função sum que retorna uma outra função. Se repararmos "sum" leva x por parametro. À variavel sumaux fica atribuida a função anónima que leva como parametro y. A grande vantagem do closure, é que permite que sumaux, tenha em memória o valor 5 passado para o parametro x na instanciação, portanto, se executarmos sumaux (que é uma função), está irá lembrar-se do valor x pois foi instanciada com x=5.

Penso que estamos em condições agora de perceber o código abaixo:

window.alert = function(native) {
return function(e) {
native(e);
vbalert(e);
}
}(window.alert);

Esta instrução faz um conjunto de tarefas. A primeira linha é uma atribuição da função window.alert a uma função que iremos definir e que leva por parametro a variavel native(que se pretende que seja uma função). Dentro desta função iremos retornar uma outra função que vai invocar a função native com o parametro que for passado (neste caso a variavel e).
Portanto, se passarmos para a função principal o argumento native=window.alert (correspondente á ultima linha), a função que estamos a retornar irá conter:

return function(e)
{
window.alert(e);
vbalert(e);
}

Para finalizar estamos a igualar window.alert ás linhas que estão acima, ou seja, se executar window.alert('xpto'); estamos na verdade a executar as 2 linhas que estão dentro desta função anónima.

sexta-feira, 25 de setembro de 2009

Javascript com VBScript

Há dias colocaram-me uma dúvida engraçada :).
Um colega meu tinha o código todo cheio de alerts, e em vez de mostrar a caixa normal que é apresentada no javascript queria apresentar uma MsgBox do VB sem ter que alterar qualquer código.
Após alguns testes cheguei a este resultado:

<script Language="VBScript">
Function vbalert(e)
MsgBox e
End Function
</script>
<script Language="JavaScript">
function alert(e){
vbalert(e);
}
alert('windows');
</script>

O que estamos aqui a fazer é a "redefinir" a função alert do javascript para fazer chamar a função vbalert que neste caso vai despoletar uma MsgBox. Ao invés disso, poderiamos fazer mostrar uma DIV p.e. ou até utilizar o jQuery Dialog (componente do jQuery que desconhecia até então e que um colega me mostrou).

O contrário também é possivel (chamar javascript a partir do vbscript).

Mas surge agora uma questão. Visto que estamos a fazer override duma função javascript, como fariamos para extender a função nativa, isto é, preservar o que ela faz, mas adicionar comportamento nosso, neste caso invocar a nossa msgbox vb?

Aqui vai a solução:

<script language="javascript">
window.alert = function(native) {
return function(e) {
native(e);
vbalert(e);
}
}(window.alert);
<script>

O segredo aqui é o closure...No próximo post, explicarei o conceito do closure que é bastante util no javascript e explica na perfeição o funcionamento desta rotina

SVN (Subversion)

O SVN é um conhecido sistema de controlo de sources (SCM).
Antes de mais, devo explicar o que é um sistema SCM.
Um sistema SCM,consiste normalmente num servidor, que contêm um conjunto de repositórios (dados) para gestão de source code. Estes tipos de sistemas têm grandes vantagens, tais como:
-A informação encontra-se centralizada num único sitio (servidor).
-Permite gestão de versões de source code.
-Permite reposição de um determinado source code à imagem que ele estava numa determinada data.
-Permite efectuar branches e tags. Uma tag é uma imagem do código a uma determinada data, enquanto que um branch é um desenvolvimento paralelo que é efectuado para além do desenvolvimento principal (HEAD).
-Permite gestão de código por equipa. Podem estar várias pessoas a trabalhar nos mesmos projectos e até no mesmo source-code ao mesmo tempo.
-Gestão de conflitos que possam surgir com o trabalho em equipa.
-Comparação de versões de ficheiros (tipo windiff).

Para se trabalhar com o SVN em particular, aconselho-vos a visitar a página da SVN.
Aqui poderão encontrar plugins para os mais diversos IDEs nomeadamente o eclipse (é o que eu uso).

O SVN tem como intuito substituir um SCM já existente (CVS).
Para além do SVN existem ainda outros SCM tais como o perforce e o GIT que está a evoluir a olhos vistos podendo-se tornar como o SCM mais utilizado.

GIT-SCM

Para aficcionados do mundo .NET existe ainda o ANKH que poderá ser integrado no Visual Studio.

quinta-feira, 24 de setembro de 2009

HSQLDB

O HSQLDB é um sistema de base de dados bastante simples feito em java.
A base de dados fica guardada numa pasta e é portavel para qualquer lado.
Para correr a base de dados corre-se um batchcmd que inicia o servidor da base de dados ficando disponivel um url a usar numa query string para conexão.
Para introdução de dados, existe um ficheiro .sql na pasta da base de dados onde estarão os SQLs a executar.
Gostei muito principalmente pela simplicidade do sistema. É uma alternativa ao Access, Cloudscape/Derby muito viavel.
Ah e tem outra vantagem: É free!

Mais informações ver:
HSQLDB site