Um Manifesto!

...

  • Increase font size
  • Default font size
  • Decrease font size

Blog

IdeasWall no project Kenai (e no GitHub)

E-mail Print PDF

O projeto Kenai é a iniciativa da Sun para prover aos desenvolvedores ferramentas aonde eles podem hospedar seu código fonte e se conectar, comunicar e colaborar com outros desenvolvedores. Basta se cadastrar, e é gratuito.

Você pode colocar seus projetos lá e ganha um repositório(que pode ser SVN, GIT ou Mercurial), ou apontar para um repo externo,  um forum, wiki, IM, lista de email, "bug tracker", downloads e , é claro, se integra com o netbeans(ainda beta). A principal limitação é de 5 projetos por perfil.

Anyway, agora a o IdeasWall.org está no kenai, com um forum e wiki ainda desatualizados. De bônus, o código fonte da interface em JavaFx esta disponivel no Github, para quem quiser fuçar, já atualizado para JavaFx 1.2. 

 

Opera Unite, take the web back.

E-mail Print PDF

O pessoal do Opera pode não ter reinventado a web como anunciaram, mas como sempre lançaram um recurso muito interessante.

 

Opera Unite
 

 

Tudo isso trata-se do Opera Unite, uma especie de recurso de compartilhamento e servidor direto do seu Opera, funcionando de forma semelhante a uma rede P2P (o que é legal) ele permite rodar serviço como compartilhamento, streaming de musica, salas de chat, compartilhar fotos entre outros muitos por vir (documentos, jogos, mais media...). A idéia é oferecer toda essa gama de serviços Web 2.0 sem depender de terceiros (mas tem o Opera) e sem sair da sua maquina, com o já funcional sincronismo do opera.

Obviamente para que o serviço esteja no ar você precisa estar conectado, pode-se controlar o acesso aos serviços por senha ou ainda apenas à você, para por exemplo ouvir suas músicas em outro computador, ou acessar seus arquivos em outros perfis.

Para usar o serviço você precisa, obviamente, do Opera, atualmente apenas com build especifico do Unite, para Linux, Mac ou até mesmo Windows. Depois basta criar ou usar sua conta no My Opera (o mesmo do Opera Link, de sincronismo), e ativar os serviços desejados.

Também é possível desenvolver seus próprios Opera Unite Services, estendo a capacidade do serviço. Alguem duvida que logo entre os primeiros vai ter algo para o twitter?

O serviço é beta e vai dar error qualquer hora, o media player por exemplo não rodou no meu firefox, mas só isso que eu vi até agora. O serviço parece legal, mas esta começando agora, vamos ver aonde isso vai parar. No minimo já conseguiram ser Trending Topic no twitter :)

Para quem quiser dar uma olhada, entre no meu Opera Unite, e se eu ainda estiver online, ouça uma musica legal.

 

Mais sobre programação funcional e clojure

E-mail Print PDF

No último texto tentei explicar o básico para entender um lista em programação funcional, agora vou explicar algumas das estruturas mais essenciais para um programa funcional que seja , bem, funcional.

Vamos começar pela definição de funções, no outro texto expliquei a forma mais simples:

(defn soma [ arg0 arg1 ] ( + arg0 arg1 ) )

Essa é na verdade uma forma especial para a função que cria funções:

(def soma (fn [arg0 arg1] (+ arg0 arg1))

Essa forma original permite a primeira forma de polimorfismo de clojure, por número de argumentos:

(def soma ( fn somador ; somador é um alias opcional que sera usado dentro da funcao
 ( [arg0 arg1 ] (+ arg0 arg1))
 ( [arg0 arg1 arg2] ( somador arg0 (somador arg1 arg2))
))

Algo muito importante em programação funcional é a recursão, usada comumente no lugar de loops tradicionais, que é otimizada por recursos de tail recursion, apesar dessa otimização não ser presente no clojure, a recursividade é essencial, e a forma é com a expressão “recur”:

(defn gimme5 [ x ] 
 ( if (= x 5) 
 x
 ( recur ( + x 1))
))

Veja que vai chamar recur até que x seja igual a 5.

Uma outra forma de implementar funções também muito importante, por ter uma maior capacidade de polimorfismo é com a definição de métodos:

(defmulti hello class)
(defmethod hello String [s] (println “String: “ s))
(defmethod hello Integer [i] (println “Integer:” i))

Mais é possível muito mais que isso, pode mudar a quantidade e tipos de argumentos entre outros.

Uma construção muito importante também é o “let”, ele permite criar um ou mais símbolos e torna-los disponíveis em uma lista, veja:

(let [ x 1 y 2] ( + x y ))
(def hello [name] ( let [ intro “Hello “] (str intro name))
(def n5 (let [ x 1 sum (fn [x y] ( + x y)] (sum 4 x)))

Outra forma importante é a “do”, que executa uma série de funções:

(defn hello [s] (
 let [intro “hello ”]
 do (println “will print hello”) (println intro s) (str intro s)
)); retorna sempre a ultima instrução String de intro + s

 

Meu novo blog, mais pessoal.

E-mail Print PDF

Decidi tentar criar um novo blog, com conteúdo mais variado e pessoal, contando mais história. O Manifesto vai continuar como sempre, com os posts falando mais mão-na-massa com desenvolvimente e linux (posts em falta...), enquanto meu novo blog vai ser assuntos mais aleatório mas ainda nerd, já que no manifesto tenho um bloqueio pessoal :)

Visitem o Hello Nerd, para ler sobre a vida de um nerd atribulado no rio. Vamos ver se da certo ;)

Last Updated on Tuesday, 02 June 2009 02:46
 

Migração para o Joomla 1.5

E-mail Print PDF

Texto rápido, apenas para dizer que migrei o Manifesto.blog.br para o Joomla 1.5 (finalmente!), e deu muito trabalho mas parece que esta tudo ok.

Esta tudo devidamente atualizado, o RSS já aponta para o novo conteúdo sem perder os links, os links antigos estão redirecionando com 301 para os novos (são os mesmos links na verdade, só na pasta diferente), a URL estão amigáveis e o layout parace estar certo. 

Uma dica valiosa: nunca esqueçam do cache!

 

Programação Funcional: Lendo listas e funções

E-mail Print PDF

Entender Programação Funcional é uma tarefa bem complicada no começo, por ser uma mudança extremamente radical na forma de pensar e de programar.

Na minha opinião temos dois pontos fundamentais a considerar: Listas e Funções. Exceto por modificadores de leitura, tudo ou é um ou é outro, e depende de ambos. Claro que há muito mais, mas acho esse o básico para ao menos “Ler” algo funcional.

Uma Lista não é um Array( ou Vetor) como estamos acostumados, mas uma série encadeada de símbolos(que podem ser ou não outra lista ou função). Para construir a seguinte lista : "Maça, Banana, Laranja" é entendida em idiomas LISP assim: (Maçã Banana Laranja).

Para entender um lista encadeada, podemos ter algo assim: (Maçã ("Banana nanica" "Banana D'Água") Laranja). É uma lista de 3 elementos, sendo que o segundo elemento é uma lista de dois elementos, mas se for assim (Maçã (Banana nanica Banana D'Água) laranja) o segundo elemento tem 4 elementos.

O processamento de Listas (LISP é isso) é feito da seguinte forma, supondo a lista:

(somar 1 2 (dividir 6 3))

O primeiro elemento de uma lista é esperado uma função, os elementos seguintes serão seus parâmetros, então temos a função "somar" recebendo os parâmetros inteiros 1 e 2, e como terceiro parâmetro vai receber o resultado do processamento da lista (dividir 6 3), que vai ser processada como uma chamada a função "dividir" recebendo 6 e 3 como parâmetros, o resultado volta como terceiro parâmetro a somar.

Como podemos ter quase qualquer coisa como símbolos, essa linha é implementada assim:

(+ 1 2 (/ 6 3))

"+" é um simbolo comum, que contem(aponta, na verdade) uma função capaz de somar que receber n argumentos, assim como "/" contem a função de divisão. Toda Lista é processada dessa forma, função + argumentos, apesar de termos modificadores (como # ou ') que alteram esse comportamento. Um array por exemplo é feito dessa forma: [ x y z ], logo não é um lista.

Agora chegamos nas funções, são exatamente como as funções matemáticas. Em LISP se define uma função usando a função especial “defun”, aqui vou usar o idioma de Clojure para demonstrar isto. Em clojure temos:

(defn funcao [x] ( processa x ) )

E o que isso quer dizer? Chamo a função “defn” e passo como argumentos o simbolo “funcao”, o array [x] e a lista ( processa x). “defn” vai ligar ao simbolo de escopo local “funcao” uma função que recebe um argumento ([x]) que será ligado a variável “x” do escopo interno da função, e que vai retornar o resultado da lista (processa x).

Como defn é uma função especial, (processa x) não é processado imediatamente, e sim, apenas quando a função for chamada. Assim quando eu chamo (funcao 3) esta lista vai retornar o resultado de (processa 3). Em um exemplo mais prático, temos:

(defn hello [name] ( println “Hello ” name) )
(hello “Diogo”) ; imprime “Hello Diogo”
(hello “Você”) ; imprime “Hello Você”

Este poderia ser implementado assim:

( (fn [name] (println “Hello ” name)) “Diogo” )

Definindo a função na hora, e passando o argumento. Então por exemplo podemos encadear chamadas:

(defn hello-maker [name] (str “Hello ” name)) ; retorna (str “Hello “ name), str constroi a String
(defn speaker [toSpeak] (println toSpeak))
(speaker (hello-maker “Diogo”))  
(defn quick-speak [speaker maker name] ( speaker (maker name))) ; são simbolo, e dentro de um escopo
(quick-speak speaker maker “diogo”)

Lembrando que por padrão somente o primeiro item é interpretado como função, a estrutura acima funciona. Agora um exemplo mais legal, fatorial, formatado:

(defn fac [x] (
  if (= x 1)
  x
  (* x (fac (- x 1)))
  )
)

Aqui temos uma séries de funções, a função ligada ao simbolo “=” recebe dois argumentos e retorna verdadeiro (booleano mesmo) se forem, quem diria, iguais. A função “if” (também é especial) recebe tres argumentos: Um boleano, uma lista(ou simbolo) para retornar em caso verdadeiro e uma para retorna caso falso. Ambas não são processadas até que if seja resolvido.

Então ao chamar (fac 5) temos x = 5, se a função “=” resolver que x e 1 são iguais, fac vai retorna x, se não vai retornar uma lista (* x (fac (- x 1))).

Então temos para retorna a função “*” que recebe x e (fac (- x 1)), processando temos fac recebendo (- x 1), que é a função “-” rebendo x e 1 , e vai retornar(surpresa) x - 1 , então retorna fac 4 (que vai ser 4 vezes factorial de 3), e por ai vai.

No caso do (fac 5) temos, no final:

(* 5 (* 4 (* 3 (* 2 1))))
(* 5 (* 4 (* 3 (2))))
até
120

Então:

(defn fac [x] ( if (= x 1) x (* x (fac (- x 1)))))
(println (fac 5)) ; imprime 120

Como disse, isso é o básico do básico, programação funcional é algo bem complexo e há muito a se aprender ainda, mas é divertido e vale a pena. Ainda bem que não sou professor, por me perdi completamente explicando ;)

Last Updated on Monday, 25 May 2009 20:06
 


Page 5 of 19