JQuery

Linguagens funcionais ainda são pouco utilizadas comparadas com as imperativas, isso deve-se em parte a um pré-conceito que muitos ainda tem com relação a linguagens funcionais e recursividade. Atualmente um código compilado em Haskell pode ser mais rápido do que em linguagens como Python, Perl e JavaScript: The Computer Language Benchmarks Game. Entretanto, muitos dos seus recursos tem sido utilizado em implementações recentes de JavaScript, como por exemplo o JQuery:Apresentação JQUERY

Tipos recursivos

Em cursos de algoritmos é comum trabalharmos com dois tipos de dados recursivo, listas e árvores. Tipos de dados recursivos são aqueles que são definidos em termos de si mesmo. Entretanto, o tipo de dados recursivo mais comum não é nenhum destes dois, e sim os números naturais. Os números naturais são descritos por Giuseppe Peano, é um autor italiano, cujo nome é lembrado até hoje em conexão com os axiomas por ele introduzidos, dos quais dependem tantas construções rigorosas da álgebra e da análise. Segue seus axiomas (Obs: a Definição original parte do UM)
  1. Zero é um número.
  2. Se a é um número, o sucessor de a é um número.
  3. Zero não é o sucessor de um número.
  4. Dois números cujos sucessores são iguais são eles próprios iguais.
  5. Se um conjunto S de números contém o zero e também o sucessor de todo número de S, então todo número está em S.
É possível encontra a definição destes axiomas em linguagens funcionais, como Haskell. Neste post eu demonstro a implementação usando uma linguagem imperativa, no caso C. Nesta linguagem, tipos recursivos são implementados a partir de ponteiros.

Por exemplo, a seguinte definição em Haskell:

 data Nat = Zero | Succ Nat

Pode ser mapeado para C:

typedef struct Nat { struct Nat* succ; }* Nat;
Nat Zero () {
return NULL;
}
Nat Succ (Nat a) {
Nat n = malloc (sizeof (Nat));
 n->succ = a;
return n;
}

Operação de soma em Haskell:

soma Zero n = n
soma (Succ m) n = Succ (soma m n)

Operação de soma em C:

Nat sum (Nat a, Nat b) {
if (a == Zero () )
 return b;
else
 return Succ ( sum (a->succ,b) );
}

Operação de multiplicação em Haskell

mult Zero m = Zero
mult (Succ m) n = soma n (mult n m)

Operação de multiplicação em C

Nat mult (Nat a, Nat b) {
 if (a == Zero () )
 return Zero ();
 else
 return sum (b, (mult (b, a->succ)));

}

No exemplo acima destaco um dos recursos mais importantes do Haskell. Casamento de padrões. Este recurso permite construir e “deconstruir” (não é destruir) um objeto a partir do seu construtor. Mais sobre Haskell:http://www.haskell.org/

Returning function as the result of a subroutine

In the C language, function are not firt-class objects, “a first-class object (also value, entity, and citizen), in the context of a particular programming language, is an entity that can be constructed at run-time, passed as a parameter, returned from a subroutine, or assigned into a variable”.wikipedia – http://en.wikipedia.org/wiki/First-class_object. However, given that pointer are first-class object , the we can to associate pointer to functions, simulating “first-class function”. Passign functions as a parameter to a subroutine is usual, there are several functions int the standard libray, like bsearch (http://www.cplusplus.com/reference/clibrary/cstdlib/bsearch/). However, we can return pointer to functions as the result of a subroutine:

typedef int (*intint)(int); 
intint addk (int k){ 
 int f (int n){ k = k+1; return n + k; } 
 return f; 
} 

After that , we can use it in our programs, for example:

intint f = addk(10); 
printf ("%d\n", f(4)); // 14 
printf ("%d\n", f(4)); // 15 

Lista Funcional em JavaScript

JavaScript apresenta algumas caracteristicas de linguagens funcionais, como tratar funções como cidadões de primeira classe. Neste post, mostro uma implementação de uma lista funcional em JavaScript. Definição da lista:

// construtoras
function Nil () {
 return []
}
function Cons (e,l) {
 return [e].concat (l);
}
// acesso
function empty (l) {
 return l.length == 0
}
function head (l) {
 return l[0]
}
function tail (l) {
 return l.slice (1, l.length)
}

A partir destas operações podemos tratar o array do JavaScript como listas funcionais. A seguir é apresentado a função foldr presente em Haskell. Ela descreve um comportamento comum a diversas operações, como somatoria, produto e até mesmo a operação de inserção:

function foldr (f,z,l)
{
 if (empty (l)) return z
 else return f (head (l), foldr (f,z,tail (l)) )
}
function sum (l) {
 return foldr (function (a, b) {return a+b},0,l)
}
function prod (l) {
 return foldr (function (a, b) {return a*b},1,l)
}
function insert (e, l) {
 if (empty (l) || e < head(l) ) return Cons (e, l)
 else return Cons (head (l), insert (e, tail (l)))
}

function insertion_sort (l) {
 return foldr (insert,[],l)
}

Usando as funções acima:

var l = Cons (8, Cons (5, Cons (10, Nil()))) // 8, 5, 10
var lo = insertion_sort (l) // 5,8, 10

JavaScript é o futuro ?

Todo mundo que desenvolve para WEB, já devem te usado JavaScript. O modelo usualmente empregado é: copy, paste e run. Onde o programado apenas copia, cola e manda executar. Entretanto, não contentem apenas
copiar e colar, entenda o seu funcionamento. Estudem a LINGUAGEM e depois voltem nos códigos que já usaram e tentam identificar o uso dos conceitos. JavaScript foi muito criticada no passado, o que fez com que ela ficasse restrita a pontos específicos dentro das antigas páginas web. Preciso validar uma dada entrada, preciso de um calendário …nesses casos copiar e colar funciona muita bem. Entretanto, com AJAX, apps web, Html5 (Canvas e animação CSS3), o uso de JavaScript é intenso.

Vocês não irão encontrar um app web pronto para copiar e colar, precisaram saber programar (ou alguém da equipe). Muitas das tecnologias recentes fazem uso intenso dessa linguagem, e ela está em uma situação de conforto, pois diferentemente do mundo desktop onde existem muitas opções, no browser JavaScript (EcmaScript) reina. Se o
browser se tornar o sistema operacional do futuro JavaScript (EcmaScript) se tornará a linguagem do futuro.

Para finalizar. Tutoriais web costuma ser replicas de replicas, desatualizadas. Cuidado, busquem fonte com os inovadores (ex. Google) e com os criadores dos padrões (W3C)

Para se ter uma idéia melhor veja alguns videos do Google I/O 2011.

Excelente vídeo, observem que ele falará de muitos dos conceitos de linguagens funcionais, como funções de alta ordem, objetos, closures …

Google I/O 2011: Learning to Love JavaScript
http://www.youtube.com/watch?v=seX7jYI96GE

JavaScript
http://www.youtube.com/user/GoogleDevelopers#p/u/18/M3uWx-fhjUc

HTML5 And The Future Of Everywhere
http://greenido.wordpress.com/2011/05/20/html5-and-the-future-of-everywhere/


Esse vídeo é bem interessante, me perguntava bastante sobre isso quando vejo o chrome OS e o Android. Duas estratégias contrárias. Google I/O 2011: HTML5 versus Android: Apps or Web for Mobile Development?
http://www.youtube.com/watch?v=4f2Zky_YyyQ

Um artigo interessante: Are Chromebooks the Future of Notebooks? http://www.slashgear.com/are-chromebooks-the-future-of-notebooks-12151597/

Um livro moderno sobre javascript.

http://eloquentjavascript.net/

Nas palavras do criador do JQuery:

“Considered a “toy” language by serious web developers for most of its lifetime, Java-Script has regained its prestige in the past few years as a result of the renewed interest in Rich Internet Applications and Ajax technologies”.

Até mesmo a Microsoft já rendeu a WEB e JavaScript:

“With all the emphasis on HTML5 and JavaScript being the basis of Windows 8 apps, what will become of app development of to-the-metal binary apps? And if the new apps are really just HTML5 and JavaScript, doesn’t that mean they should run in Chrome, Firefox, or any other browser that complies with those standards? I wouldn’t hold my breath, given the disparity among HTML5 implementations in browsers, but a couple years down the road we may see this promised interoperability.”

Alguns slides de JavaScript e JQuery:
https://sites.google.com/site/skosta/presentations-lectures/cursoweb

Todo mundo que desenvolve para WEB, já devem te usado JavaScript. O modelo usualmente empregado é: copy, paste e run. Onde o programado apenas copia, cola e manda executar. Entretanto, não contentem apenas
copiar e colar, entenda o seu funcionamento. Estudem a LINGUAGEM e depois voltem nos códigos que já usaram e tentam identificar o uso dos conceitos. JavaScript foi muito criticada no passado, o que fez com que ela ficasse restrita a pontos específicos dentro das antigas páginas web. Preciso validar uma dada entrada, preciso de um calendário …nesses casos copiar e colar funciona muita bem. Entretanto, com AJAX, apps web, Html5 (Canvas e animação CSS3), o uso de JavaScript é intenso.

Vocês não irão encontrar um app web pronto para copiar e colar, precisaram saber programar (ou alguém da equipe). Muitas das tecnologias recentes fazem uso intenso dessa linguagem, e ela está em uma situação de conforto, pois diferentemente do mundo desktop onde existem muitas opções, no browser JavaScript (EcmaScript) reina. Se o
browser se tornar o sistema operacional do futuro JavaScript (EcmaScript) se tornará a linguagem do futuro.

Para finalizar. Tutoriais web costuma ser replicas de replicas, desatualizadas. Cuidado, busquem fonte com os inovadores (ex. Google) e com os criadores dos padrões (W3C)

Para se ter uma idéia melhor veja alguns videos do Google I/O 2011.

Excelente vídeo, observem que ele falará de muitos dos conceitos de linguagens funcionais, como funções de alta ordem, objetos, closures …

Google I/O 2011: Learning to Love JavaScript
http://www.youtube.com/watch?v=seX7jYI96GE

JavaScript
http://www.youtube.com/user/GoogleDevelopers#p/u/18/M3uWx-fhjUc

HTML5 And The Future Of Everywhere
http://greenido.wordpress.com/2011/05/20/html5-and-the-future-of-everywhere/


Esse vídeo é bem interessante, me perguntava bastante sobre isso quando vejo o chrome OS e o Android. Duas estratégias contrárias. Google I/O 2011: HTML5 versus Android: Apps or Web for Mobile Development?
http://www.youtube.com/watch?v=4f2Zky_YyyQ

Um artigo interessante: Are Chromebooks the Future of Notebooks? http://www.slashgear.com/are-chromebooks-the-future-of-notebooks-12151597/

Um livro moderno sobre javascript.

http://eloquentjavascript.net/

Nas palavras do criador do JQuery:

“Considered a “toy” language by serious web developers for most of its lifetime, Java-Script has regained its prestige in the past few years as a result of the renewed interest in Rich Internet Applications and Ajax technologies”.

Até mesmo a Microsoft já rendeu a WEB e JavaScript:

“With all the emphasis on HTML5 and JavaScript being the basis of Windows 8 apps, what will become of app development of to-the-metal binary apps? And if the new apps are really just HTML5 and JavaScript, doesn’t that mean they should run in Chrome, Firefox, or any other browser that complies with those standards? I wouldn’t hold my breath, given the disparity among HTML5 implementations in browsers, but a couple years down the road we may see this promised interoperability.”

Alguns slides de JavaScript e JQuery:
https://sites.google.com/site/skosta/presentations-lectures/cursoweb

Lua – Uma linguagem interessante para conhecer

Lua é uma linguagem brasileira, desenvolvida e mantida pela PUC-Rio (http://www.lua.org/). Usada principalmente em jogos. Agora ela é a linguagem para criar a interatividade na TV digital e é a 12 linguagem mais utilizada no MUNDO, segundo tiobe index. Ela já mais utilizada que Delphi (tecnicamente não é uma linguagem), Pascal, Fortran, Matlab .. No mesmo nível que linguagem como JavaScript e Ruby. Junto com Ruby são as unicas linguagens que não nasceu nos USA e nem na Europa.

Padrões de Projetos

Sabemos o valor da experiência em qualquer profissão e o quanto ela representa para o sucesso ou o fracasso de uma empresa. Essa situação não é diferente no desenvolvimento de sistemas, onde um programador experiente pode ganhar salário bem superior em relação aos demais. Esse salário é justificável pela produtividade, dado que um programador experiente é capaz de oferecer boas soluções rapidamente para diferentes sistemas. Essa sua capacidade deve-se ao fato dele já ter passado por um problema similar em algum momento da sua vida profissional. Desse modo, ele simplesmente adapta a solução conhecida para o novo domínio de aplicação. Então, o que diferencia um analista experiente de um recém formado é o fato do primeiro já conhecer as soluções para os problemas recorrentes na computação. Enquanto, o recém formado deveria passar pelos mesmos problemas até encontrá-las. Para contornar esse problema, um grupo de quatro pesquisadores (Gang of Four) propôs um meio de documentar essas soluções ou estratégias denominadas padrões de projeto (ou design patterns). Diferentemente da programação orientada a objetos que possibilita o reuso de códigos ou componentes, os padrões de projeto permitem o reuso de soluções e registro de experiências de modo que um novato possa agir como um especialista. A combinação de programação orientada a objetos com padrões de projeto permite o desenvolvimento softwares mais rápido e com melhor qualidade.
Erich Gamma mais seus três “comparsas” que formam a gangue dos quatro (Gang of Four – GoF), publicaram o mais importante livro sobre padrões de projeto, intitulado: “Padrões de Projeto: Soluções Reutilizáveis de software Orientado a Objetos ”. Neste livro os autores descreveram vinte e três padrões, que ficaram conhecidos como “padroes GoF”, por referência aos autores. Cada padrão GoF é formado por quatro elementos:
  • Um nome, que serve como referência a um padrão de projeto, facilitando assim a comunicação e a documentação do mesmo.
  • O problema, que descreve onde e quais as condições que aquele padrão pode ser aplicado.
  • A solução, descrição abstrata de como usar os elementos da programação orientada a objetos na solução de um determinado problema.
  • As conseqüências, que descrevem os custos e benefícios de se aplicar um padrão incluindo o impacto sobre a flexibilidade, extensibilidade ou portabilidade de um sistema.
Os padrões podem ser classificados de acordo com sua finalidade ou propósito: criação, estrutural ou comportamental. Os padrões de criação se preocupam com o processo de criação de objetos. Alguns exemplos de padrões de criação são: Factory, Builder, Prototype e Singleton. Os padrões estruturais lidam com a composição de classes ou objetos, por exemplo, Adpter, Bridge, Decorator e Composite. Os padrões comportamentais caracterizam a maneira pela qual as classes ou objetos interagem e distribuem responsabilidades. Exemplos de padrões comportamentais incluem: Mediator, Iterator, Visitor e Strategy. Um padrão também é classificado segundo o seu escopo: de classe ou de objeto. Nos padrões com escopo de classe os relacionamentos que definem este padrão são definidos através de herança e em tempo de compilação. Nos padrões com escopo de objeto o padrão é encontrado no relacionamento entre os objetos definidos em tempo de execução.
Os padrões de projeto atacam em dois pontos que não são diretamente resolvidos através de modelagem orientada a objetos. O primeiro é que muitos objetos não são descobertos na fase de análise, dado que eles não têm paralelo no mundo real. Esses objetos são encontrados em diversos sistemas e podem influir na flexibilidade dos mesmos. Por exemplo, objetos que representam algoritmos, serviços e objetos de baixo nível (vetores, matrizes). Um exemplo deste tipo de padrão é o Composite. Este padrão permite lidar com objetos em estruturas de arvore para representarem hieraquias partes-todo. A chave para o padrão Composite é uma classe abstrata que represente tanto os objetos primitivos como os recipientes.
Um exemplo de uso é em editores de desenhos, onde é possível ter diversos componentes e ao chamar o método desenha de um objeto composto este chama os métodos desenha dos demais. Desse modo, a aplicação cliente tem uma única interface para lidar tanto com componentes primitivos, como compostos
Todo desenvolvedor sabe o perigo de usar variáveis globais em um sistema, dado que diferentes partes de um sistema podem acessar e modificar o seu valor afetando todo o sistema. Entretanto, em muito caso precisamos de um ponto de acesso global que pode ser acessado em qualquer parte do sistema. O padrão Singleton garante que se tenha uma única classe de um determinado objeto que poderá ser acessada por todo o sistema. A Idéia geral é dar a classe à responsabilidade de manter o controle de sua única instância.
Este é um dos padrões mais simples, dado que não incluem muitos objetos e classes, mesmo assim é muito utilizado e importante em diversos sistemas, como controle de logg ou spooler de uma impressora.
Um outro ponto importante é com relação a construção de objetos fracamente acoplados, dado que o uso excessível de herança acaba tornando essas classes muito amarradas. De modo que a mudança em uma pode afetar a outra. Os padrões de projetos tendem a favorecer a composição de objetos em relação a herança de classe. Desse modo, estendemos as funcionalidades através de montagem de componentes ao invés da reutilização de funcionalidades das classes ancestrais. O padrão strategy é um exemplo de um objeto que não tem paralelo na natureza e também um modo de garantir um fraco acoplamento entre os objetos. Este padrão permite que o algoritmo varie independentemente dos cliente que o utilizam. Ele é aplicado sempre que se tem um algoritmo que pode ter diferentes comportamento, em vez de usar muito comando condicionais, mova-os para uma classe.
Observe que uma classe pode ter uma strategy para cada método, a vantagem da strategy é não alterar a estrutura da classe cliente. Em alguns casos é necessário manter duas hierarquias de classes separadas, uma para a interface e outra para sua implementação, de modo que uma não afeta a outra. Isso é muito importante em drivers de banco de dados, por exemplo o JDBC do Java, onde uma mudança em uma implementação não pode afetar o modo de como ele é acessado pelo cliente. Para isso o padrão utilizado é o padrão Bridge, também conhecido como Handle/Body.
Desse modo, tanto a interface quanto a implementação podem ter estruturas de classes distintas, onde a inserção ou remoção de uma classe não afeta a outra.
Por fim, o padrão factory method é utilizado quando não tem como antecipar a classe de objetos que devem criar, deste modo a instanciação das classe é adiada a subclasse.
Os padrões de projeto deram uma outra dimensão ao desenvolvimento de software, indo além da modelagem orientada a objetos. O uso de padrões de projeto permitiram o desenvolvimento de verdadeiros componentes reutilizáveis e é o responsável em grande parte pelo sucesso das aplicações JavaEE que utilizam muitos destes padrões em seus frameworks. Por exemplo, um EJB Container em termos de Design Pattern, é uma combinação de: Proxy (controla o acesso a um Bean, ex. segurança) e Decorador (adiciona funcionalidade a um Bean). Os padrões de projeto foi um grande salto em engenharia de sistemas, e deixará para sempre sua marca.

Criando um Makefile Genérico – C++ e Haskell

O melhor modo de criar projetos compiláveis em diferentes sistemas Linux é utilizar a dupla automake e autoconf. Entretanto, as vezes temos um projeto ainda inicial e nao queremos gerar todos os arquivos de configuração, ou estamos usando o mingw no Windows e não temos como usar o automake e autoconf. Todo mundo que ja usou o makefile, sabe o quando pode ser chato adaptá-lo para um novo projeto. Depois de muito apanhar, consegui gerar um makefile adaptável para vários projetos:

CFLAGS= -I\usr\local\src
LDFLAGS= -LC:\MySQL\lib -lmysql
CC=g++
SRCS= main.cpp Hello.cpp
OBJS=$(SRCS:.cpp=.o)
TARGET= main
all: $(TARGET)
# regras para gerar o executavel
$(TARGET) : $(OBJS)
$(CC) $(OBJS) $(LDFLAGS) -o $@
# regras de compilação
.cpp.o:
 $(CC) -c $&lt; $(CFLAGS)
clean:
 rm -f *.o *.hi *~

Agora, todo novo projeto é preciso apenas alterar quatro váriaveis: (1) CFLAGS, (2) LDFLAGS, (3) CC e (3) SRCS. O mesmo makefile basico pode ser usado para outros compiladores, como ghc.

HC= ghc
HC_OPTS= -fglasgow-exts
LD_OPTS= -lstdc++
CC=gcc
SRCS= Exemplo2.hs
OBJS=$(SRCS:.hs=.o)
INT=$(SRCS:.hs=.hi)
TARGET= main
all: $(TARGET)
LIB=-L/usr/lib/mysql/ -lmysqlclient

$(TARGET) : $(OBJS)
 $(HC) $(LD_OPTS) -o $@ $(OBJS) $(LIB)
.o.hi:
 @:
.hs.o:
 $(HC) -c $&lt; $(HC_OPTS)
clean:
 rm -f *.o *.hi *~