WolframAlpha, um novo modo de acessar informação

O mundo está prestes a mudar o conceito de acesso a informação. Mudanças profundas nas sociedade geralmente estão associadas a gênios, e o gênio da vez é conhecido como Stephen Wolfram. Ele já revolucionou o mundo da matemática aplicada criando o programa Mathematica, e agora irá revolucionar o mundo da informática com o WolframAlpha.

Stephen Wolfram teve uma visão de uma máquina de cálculo algébrico com manipulação simbólica e com esta idéia ele criou o SMP (Symbolic Manipulation Program), que serviou como a versão zero do programa Mathematica. A idéia, por alto, é reduzir equações a elementos primitivos (fundamentais) e realizar operações algébricas somente nesses elementos. Stephen Wolfram resolveu aplicar o mesmo conceito a manipulação de informação e está criando o WolframAlpha. A idéia é pegar uma frase, identificar elementos fundamentais (palavras), analisar o significado de cada termo (a semântica), deduzir o relacionamento (álgebra) entre eles e descobrir (inferir) a informação que o usuário quer ver.

A apresentação da informação é mais impressionantes ainda, com muitos gráficos gerados sob demanda e apresentação de links para muitas outras fontes de informação (wikipedia, dicionários, web-sites), variando de acordo com o tipo de informação que se pretende obter. Ainda é possível combinar fontes de informações de diferentes fontes.

O sistema estará disponível ainda neste mês em: http://www.wolframalpha.com

Uma demonstração em inglês sobre o sistema pode ser vista aqui.

Comments

Knowledge Management for You S.A.

I have a lot of extraordinary friends. They’re awesome and I learn a lot with them by exciting discussions through email about many assorted and interesting topics. I was wondering what if I could put all these conversations online such way other people could take advantage of that.

While I was thinking about this problem, I found that the knowledge representation is a hard problem and there’s a discipline only to study that, called Knowledge Management.

As time goes by, I am more pragmatic about applying all this science in my daily life. So, after some talk to my friends and loosely define our community, I started to think about the technology to implement this. Some results from my initial research include that blog is inappropriate to store knowledge that can evolve, and the best system for that is Wiki. Twitter s*cks. RSS is very cool and to create a mashup is a great way to spread the word (we don’t need twitter). Forum boards are an appropriate place to discussions, but most of users need to receive alert by emails – they go to their mail box, but don’t go to forum system without a reason.

Even very good willing people don’t have time to spend reading long and boring text, and nobody has time to moderate a community. The solution we found is to create a closed community to post information for a public audience.

We are still settling down our systems and rules. It requires a lot of time, but I hope we can just start something meaningful that we can use later. It’s a sparkle for a better way to spend our time online and share information. I hope that the know-how of this project can be used to help other people to manage their knowledge in a digital way, so they can reuse in other to create more sophisticate systems to help with their daily tasks. More information about it is coming soon.

Comments

Como colocar vídeos no seu iPod?

Faz pouco tempo que comprei um iPod nano, e meu primeiro já veio na terceira geração. Achei fantástico que ele também toca vídeo e logo já pensei em três coisas. A primeira foi colocar vídeos que eu já tenho no computador, a segunda em baixar vídeos do YouTube e a terceira foi palestras filmadas como um vídeo podcast. Comecei testando com os vídeos que eu tenho no computador e, para minha decepção, o meu iPod não suportou nenhum dos arquivos.

Uma busca rápida no site da Apple nos leva à página Creating Vídeo for iPod que ajuda um pouco, mas não resolve, pois o QuickTime também não suporta todos os meus vídeos. De qualquer forma, nessa página explica quais os padrões suportados pelo iPod.

* By following the steps in this tutorial, QuickTime 7 Pro will automatically create an .m4v file containing H.264 video and AAC audio that is optimized for iPod. iPod can play the following video formats:

  • H.264 video, up to 1.5 Mbps, 640 x 480, 30 frames per sec., Low-Complexity version of the H.264 Baseline Profile audio up to 160 kbps, 48 Khz, stereo audio in .m4v, .mp4, and .mov file formats
  • H.264 video, up to 768 kbps, 320 x 240, 30 frames per sec., Baseline Profile up to Level 1.3 with AAC-LC audio up to 160 kbps, 48 Khz, stereo audio in .m4v, .mp4, and .mov file formats
  • MPEG-4 video, up to 2.5 Mbps, 640 x 480, 30 frames per sec., Simple Profile with AAC-LC audio up to 160 kbps, 48 Khz, stereo audio in .m4v, .mp4, and .mov file formats

Voltei na web para procurar um conversor de vídeos para iPod. Encontrei exatamente o que estava procurando no programa Videora iPod Converter. O programa é tão fantástico que vem junto no pacote um módulo para extração de vídeos do YouTube! Aplicação perfeita para o que preciso.

O programa é gratuito e possui constante desenvolvimento. A última atualização foi no mês passado e está disponível para download em: http://www.videora.com/en-us/Converter/iPod/download.php

 

Comments

Zeitgeist, o filme

Um filme brilhante que mudou meu conceito sobre o mundo, isso é que penso quando me lembro de Zeitgeist, o filme. Mostra uma realidade nua e crua sobre a nossa sociedade, sobre nossos mitos e organizações. Não é um filme para românticos que estão em busca de verdade fácil e bonita, ele mostra os problemas que enfrentamos pela nossa incapacidade de lidar com o desconhecido. Também mostra como a classe dominante se aproveita disso para dominar e controla as populações (a massa). Somente no adendo, após explicar a falácia do sistema financeiro atual, o projeto começa a dar possíveis soluções para nossa sociedade e o que você, como cidadão, pode fazer e contribuir para um mundo melhor.

Click aqui e assista ao filme

O que é o Movimento Zeitgeist?
O Movimento Zeitgeist é uma campanha de base para unificar o mundo através de uma ideologia comum baseada em fundamentos de vida e natureza. Este movimento ignora política, religião e similares e, ao invés disso, tenta se comunicar como todos os humanos são o mesmo no nível fundamental e como é hora de começarmos a trabalhar juntos em escala global para encerrar o aparente interminável conflito e sofrimento em nossa atual sociedade mundial.

A revista Galileu publicou uma reportagem de Claudio Tognolli sobre o filme. A matéria tem o título “É tudo verdade?”, em que ele responde a essa pergunta. Eu prefiro apenas fazer um convite à leitora para que assista ao filme e publique sua opinião própria como comentário deste post.

Click aqui e assista ao filme

Comments

Data extraction from social network applications

Nowadays, there are several social network applications available on the web. Some of these social network has a specific propose to gathering people, others are just general propose and competing for the user attention. For example, my favorite social applications are Facebook (helps you connect and share with the people in your life), Orkut (Connect with friends and family, Discover new people through friends of friends and communities, Share your videos, pictures, and passions all in one place), and LinkedIn (Stay informed about your contacts and industry, Find the people & knowledge you need to achieve your goals, Control your professional identity online). In these systems, people share information freely, with restriction about privacy, but there is lack of a common interface to use the available data o build new systems.

Motivation
People are creating and maintaining great data sources of social information. These data are available in different systems. However, there’s no way to build new systems to use this data split among all these sites. E.g., you moved to a new city and are looking for friends living close to you. All this data should be available to the user, so it support the development of new application, like personal agents to help users in specific tasks.

Goal
Build a common sense platform to extract data from social network web applications. The data will be available to support the development of new application, like personal agents to help users in specific tasks.

Methodology
Create a multi-agent system platform. Each social network application has an agent that knows how to extract information from the web application database. There’s an aggregated database that stores minimal information about users contacts (e.g. ids in the different systems.)

New applications can use the social network agents to get information, or just use a proxy agent that access all the other agents looking for the requested data (e.g. address, birthday, skills, work).

In the future the agents can evolve to support actions. They will be sensor and actuators working in the user behalf. The users can use them to create more sophisticated applications, so transforming the social networks from toy web apps into work web apps.

Comments

Diferença de algoritmo e programa

Tive um professor que dizia que “Matemática só é matemática quando não aparecem números, só letras.”
Parafraseio afirmando que: “Algoritmo só é algoritmo até ser implementado.” Depois de implementado é um programa. Algorimos são provados, programas são testados.
Fernando Henrique Bezerra Cardoso

Comments (2)

verdade em lendas urbanas

George Bernard Dantzig (8 de Novembro de 1914 – 13 de Maio de 2005) foi um matemático estadunidense, que introduziu o algoritmo simplex e é considerado “pai da programação linear”. Recebeu muitas honras, incluindo a Medalha Nacional de Ciência em 1975 e o prêmio a teoria John von Neumann em 1974.

Um evento na vida de Dantzig tornou-se a origem de uma famosa lenda urbana em 1939, enquanto ele era um aluno de pós-graduação na Univesidade de Berkeley. Ao início de uma aula em que Dantzig estava atrasado, o professor Jerzy Neyman escreveu no quadro negro dois exemplos de problemas famosos sem solução em estatítica. Quando Dantzig chegou, ele entendeu que os dois problemas eram para trabalho de casa e anotou-os. De acordo com Dantzig, os problemas “pareciam ser um poucos mais difíceis do que o normal”, mas alguns dias mais tarde ele escreveu soluções completas para os dois, ainda acreditando que eles eram trabalhos que estavam atrasados. Seis semanas depois, Dantzig recebeu uma visita de um emocionado Prof. Neyman, que havia preparado uma das soluções de Dantzig para publicação em um periódico matemático. Anos mais tarde outro pesquisador, Abraham Wald, estava preparando para publicar um artigo que chegava a uma solução para o segundo problema, e incluía Dantzig como seu co-autor.
 
Esta história começou a se espalhar e foi usada como lição motivacional demonstrando o poder do pensamento positivo. Ao longo do tempo o nome de Dantzig foi removido e os fatos foram alterados, mas a história básica permanece na forma de uma lenda urbana, e como uma cena introdutória do filme Gênio Indomável.
 

Fonte: http://en.wikipedia.org/wiki/George_Dantzig

Comments

“otimização prematuara é a raiz de todo mal”

“Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97 percent of the time: premature optimization is the root of all evil.” —Donald Knuth (adapted from C. A. R. Hoare)

That is one of my beliefs on why Lua is a revolution in software development. Implements in C/C++ only the functions you need performance, all the other code write in a fast pace script like language.

Já que este blog está em português, farei uma tradução livre do texto do Knuth.

“Programadores gastam enormes quantidades de tempo pensando, ou se preocupando, com a velocidade de partes não críticas de seus programas, e essas tentativas de melhorar a eficiência atualmente tem um forte impacto negativo quando depuração de erros e manutenção são consideradas. Nós deveríamos evitar pequenas melhorias de eficiência, digo acerca de 97 por cento do tempo: otimização prematuara é a raiz de todo mal.” —Donald Knuth (adaptado de C. A. R. Hoare)

Este pensamento representa muito bem uma das minhas crenças de porque Lua é uma revolução no desenvolvimento de software. Programe em C/C++ somente as funções que necessitem de desempenho, todo o resto de código escreva rapidamente em uma linguagem script como Lua.

 

Comments

Aprendendo Lua com o Problema da Mochila

Neste post, apresento uma introdução à linguagem Lua (Lua 5.1) com uma abordagem prática baseada em técnicas de programação para a resolução do problema da mochila (0-1 knapsack problem).

O problema da mochila é um problema de otimização combinatória. Seu nome é derivado do problema maximização que consiste em encontrar a melhor escolha de itens para serem levados em uma viagem que caibam em uma mochila. Em outras palavras, dado um conjunto de itens, cada qual com um custo e um valor, determine quais itens incluir em uma coleção tal que o custo seja menor do que um dado limite e o valor total seja o maior possível. Problemas similares aparecem frequentemente em negócios (business), combinatória, teoria de complexidade, criptologia e matemática aplicada.

Um exemplo em Lua de uma instância do problema da mochila é apresentado abaixo:

0-1 Knapsack problem example instance
W = 10 — capacity
p = {4, 3, 2, 1, 5, 2, 1, 4, 3, 1} — item profit
w = {2, 3, 4, 5, 1, 5, 4, 2, 3, 7} — item weight
n = #p — the total of items

Em Lua, é comum representar cada comando em uma linha e os comandos podem ou não ser finalizados com ‘;’. Neste caso, não utilizamos o ‘;’. As variáveis tem seu tipo definido dinamicamente, e por isso não precisamos nos preocupar com isso. A variável W é um número inteiro de valor 10. As variáveis p e w são vetores e a variável n possui como valor o comprimento do vetor p, que é obtido com o operador ‘#’. Para acessar o elemento de um vetor utiliza-se a notação v[i].

– Describing the problem
print(“Find the most valuable subset of ” .. n .. ” items ” ..
“to put into a pack without exceding the capacity ” .. W .. “.”)

Para imprimir mensagens para o console utiliza-se a função print. O operador ‘..’ serve para concatenar strings, e quando o operador encontra uma variável com valor numérico, esse valor é convertido automaticamente em string.

Uma solução trivial para o problema da mochila é realizar uma enumeração de todas as combinações possíveis de itens na mochila. Para implementar uma solução assim em Lua, precisamos dos conceitos de funções (funções recursivas) e de controles condicionais (ifs).
 
Em Lua, funções são definidas da seguinte forma:

function nome ( [parameters,..] )
 [statments...]
 [return  value]
end

Nota: o que aparece entre colchetes é opcional.

Controles condicionais são definidos como:

if ( condition ) then
[statments...]
[else
statments...]
end

Lua possui um modificador de escopo para as variáveis. A princípio uma variável é global, exceto se seu escopo for modificado para ‘local’. Já como uma boa prática de programação deve-se reduzir o escopo de todas as variáveis que não devem ser necessariamente globais.

A seguir apresentamos uma solução baseada nesta idéia:

– Naive solver
function naiveSolver(p, w, W)

 local function recursiveSolver(i, p, w, W)
  –print ( “trying ” .. i .. ” with W=” .. W )
  if (i < #w) then
   local p1 = 0
   if ( W >= w[i] ) then — if we can put the item inside the knapck
    p1 = p[i] + recursiveSolver(i+1, p, w, W-w[i]) — item inside knapsack
   end
   local p2 = recursiveSolver(i+1, p, w, W) — item inside knapsack

   return (p1 > p2) and p1 or p2
  end
  
  if ( W >= w[i] ) then — if we can put the item inside the knapck
   return p[i]
  end
  return 0
 end

 print “**********************”
 print “Naive solver…”
 local t = os.time()
 local profit = recursiveSolver(1, p, w, W)
 print(“runtime: ” .. os.difftime( os.time(), t ) .. “s”)
 print(“best profit: ” .. profit)
end
 

Resolve o problema, mas seu poder é limitado a pequenas instâncias do problema. Técnicas mais sofisticadas podem obter o mesmo resultado consumindo menos recursos (tempo, memória). Abaixo apresentamos um algoritmo baseado na técnica de programação dinâmica:

Dynamic programming
function dynamicProgrammingSolver(p,w,W)
 print “**********************”
 print “Dynamic programming solver…”
 local t = os.time()
 local T = {}
 T[0] = {}
 for c=0,W do
   T[0][c] = 0
 end

 for i=1,n do
  T[i] = {}
  for c=0,W do
   if c>=w[i] then
    T[i][c] = max(T[i-1][c], T[i-1][c-w[i]] + p[i])
      else
    T[i][c] = T[i-1][c]
      end
   end
 end
 print(“runtime: ” .. os.difftime( os.time(), t ) .. “s”)
 print(“best profit: ” .. T[n][W])
end

Em programação dinâmica não é utilizado o conceito de função recursiva para avaliar todas as combinações. As iterações são realizadas de forma explícita pelo iterador ‘for’ e as combinações são armazenadas em uma tabela, representada por um vetor de vetores.

Para se ter uma idéia da diferença entre as duas técnicas abaixo está uma saída da execução dos algoritmos para uma instância de apenas 100 itens.

Find the most valuable subset of 100 items to put into a pack without exceding the capacity 32001.
**********************
Naive solver…
runtime: 23s
best profit: 32121
**********************
Dynamic programming solver…
runtime: 1s
best profit: 32121
**********************

Quando você trabalha com instâncias muito grandes, ou seja, com muitos itens para serem avaliados, o método trivial não será mais viável por consumir muito tempo. O mesmo acontece para o algoritmo de programação dinâmica. Maiores detalhes do por que isso acontece podem ser encontrado na análise de complexidade de problema. Só a título de exemplo, a técnica de força bruta possui complexidade assintótica de O(2^n) e o de programação dinâmica O(n W), onde n é o número de itens que podem ser colocados na mochila e W o tamanho da mochila. Por ter uma solução com programação dinâmica aparentemente de complexidade polinomial, este problema é também conhecido como pseudo-polinomial, mas só digo isso para motivá-lo a estudar complexidade de problemas.

A partir da necessidade de resolver instâncias grandes, ou com restrições de recurso (tempo, memória), são propostas outras técnicas, algoritmos, baseadas em algum conhecimento sobre o problema. Essas técnicas são chamadas técnicas heurísticas.

Para o problema da mochila, temos a heurística clássica proposta por Dantzig em 1957. A idéia é ordenar os itens em relação a um critério de eficiência, definido como o benefício dividido pelo custo, ou seja, a razão valor / peso. A partir dessa ordenação, adicionam-se os itens mais eficientes à mochila, sempre respeitando a capacidade da mochila. Cada item é avaliado apenas uma vez, e a solução obtida pode não ser necessariamente a melhor possível. Contudo, a solução obtida geralmente é boa e esse método é muito mais rápido que os anteriores.

Greedy method
function greedyMethod (p, w, W)

– objective function value calculation
function fo(W,x,p,w)
 local weight = 0
 local profit = 0
 for i=1,#x do
  if x[i] then
   profit = profit + p[i]
   weight = weight + w[i]
  end
 end
 if weight > W then — is infeasible?
  profit = -math.huge, weight
 end
 return profit, weight
end

function aggregate(T1, T2)
 local T = {}
 for i, v in ipairs(T1) do
  T[i] = {T1[i]/T2[i], T1[i], T2[i], i}
 end
 return T
end

function disaggregate(T)
 local T1 = {}
 local T2 = {}
 local T3 = {}
 for i, v in ipairs(T) do
  T1[i], T2[i], T3[i] = T[i][2], T[i][3], T[i][4]
 end
 return T1, T2, T3
end

 print “**********************”
 print “Greedy method…”
 local t = os.time()

 – sort objects in decreasing efficiency
 local items = aggregate(p, w)
 table.sort(items, function(a,b) return a[1]>b[1] end)
 local vo, wo, index = disaggregate(items)
 local x = {} — answer 0-1 array
 local _w = 0 — weight
 for i=1,#wo do
   if wo[i] + _w <= W then
     x[i] = true
     _w = _w + wo[i]
   else
     x[i] = false
   end
 end
 print(“runtime: ” .. os.difftime( os.time(), t ) .. “s”)
 print(“Greedy method result”)
 local profit, weight = fo(W, x, , vo, wo)
 print(“Total profit ” .. profit .. ” weight ” .. weight )
end

A complexidade assintótica desta heurística é dominada pela função de ordenação, em que os melhores algoritmos conhecidos são O(n log n) (Quicksort, Mergesort). Note que aproveitamos a função de ordenação disponibilizada pela linguagem Lua, e fornecemos uma função para a comparação de dois itens. Funções em Lua são elementos de primeira ordem, e por isso podem ser passados como parâmetros.

Outro conceito interessante em Lua é o de múltiplas atribuições, o que possibilita também que funções retornem mais de um valor.

a, b, c = 1, 2, 3
print(a, b, c) –> 1 2 3
function f ()
return 1, 2, 3
end
a, b, c =  f()
print(a, b, c) –> 1 2 3

O desempenho dos métodos pode ser percebido através dos resultados obtidos na resolução de uma instância de 100 e outra de 300 itens:

Find the most valuable subset of 100 items to put into a pack without exceding the capacity 32001.
**********************
Naive solver…
runtime: 23s
best profit: 32121
**********************
Dynamic programming solver…
runtime: 1s
best profit: 32121
**********************
Greedy method…
runtime: 0s
Greedy method result
Total profit 30562 weight 30442

Find the most valuable subset of 300 items to put into a pack without exceding the capacity 46437.
**********************
Naive solver…
runtime: + 30 minutes – I killed it by hand
best profit: x
**********************
Dynamic programming solver…
runtime: 6s
best profit: 46707
**********************
Greedy method…
runtime: 0s
Greedy method result
Total profit 44173 weight 43903

O código apresentado aqui está disponível para download.

Obs: As simulações foram executadas em um computador Pentium Core 2 Duo E4500 @ 2.20 GHz com 960 MB de DDR2 RAM rodando Windows XP Professional compartilhando processamento com outras aplicações leves. As instâncias de testes foram obtidas a partir do gerador de David  Pisinger.

Comments (1)

« Previous Page « Previous Page Next entries »