Robôs criativos são possíveis?

Filmes como Inteligência Artificial de Steven Spielberg, ou o Exterminador do Futuro sempre despertam questões como se softwares e robôs um dia serão mais parecidos com os seres-humanos. Depois de assistir a uma entrevista com Marvin Minsky, diria que a resposta é sim. Por exemplo, algo bastante inerente aos humanos, como criatividade pode sim ser emulado.

Marvin Minsky é o maior pesquisador de Inteligência Artificial e considerado um o pai da área. O mais interessante não é apenas a pesquisa dele propriamente dita mas também suas idéias. Por exemplo, numa entrevista dada por ele que eu assisti em aula certa vez (que eu não achei no youtube pra linkar), ele é perguntado sobre o que é criatividade e se computadores podem tê-la. A resposta dele é genial. Ele diz que criatividade é fácil de recriar. Basta tentar todas as possibilidades. Por exemplo, se eu pintar todos os possíveis quadros numa folha, de digamos, tamanho A4 (o que é possível, apesar de inviável, devida a grandiosamente absurda quantidade de possibilidades), certamente sairão Monalisas, e outros quadros “criativos”.

Ou seja, um robô pode ser criativo, basta ele ir criando quadros exaustivamente na sua memória (mudando pixel por pixel), e ter uma boa função de avaliação para dizer se aquele quadro é bom ou ruim. Ou melhor ainda, o robô possuir uma boa heurística para poder de cara descartar os quadros que certamente são ruins, como um quadro todo branco.

Anúncios

Programação em placas gráficas, área quente na pesquisa em CG

Uma das áreas da computação que está vislumbrando mais inovações é a computação gráfica. Por quê ? Além da pesquisa tradicional, no qual tarefas difíceis como a pesquisa e o desenvolvimento de novos métodos de calcular iluminação cada vez mais realista e rápidos, métodos para calcular fluídos em movimento (especialmente água), pêlos, cabelos, grama (vegetação em geral), etc, são estudados, existe um campo quase que inteiramente novo (ou que pelo menos aumentou as possibilidades de abordagem de temas antigos): a programação de placas gráficas, GPU em inglês (graphic processor unit).

Pra quem não sabe, as GPUs estão no nível de desenvolvimento absurdo. Isso fica claro quando vemos para vender por preços relativamente acessíves placas gráficas com 512 Mb de Ram. Pensem bem, 512 só para lidar com a parte gráfica. É muita coisa. Mas não é só o tamanho da memória que as GPUs estão altamente desenvolvidas. Alguns dizem que, a Nvidia (a maior desenvolvedora de placas gráficas do mundo, a Geforce por exemplo, é dela) já gastou tanto em pesquisa de tecnologia para fazer placas gráficas cada vez melhores, que atualmente, eles estão num nível que seriam capazes de criarem processadores (CPUs) melhores que os da lider no mercado, a Intel, e que só não começaram a vender porque desembolsar rios de dinheiro para entrar numa competição onde o concorrente tem mais de 90% do mercado é ou dar tiro no próprio pé ou suícidio.

Essa afirmação acima, pode parecer exagerada para alguns, mas o nível de complexidade que as GPUs tem hoje está muito próximo do nível que as CPUs têm. Não é nenhum absurdo pensar que a Nvidia poderia fazer CPUs.

geforce placa poderosa
Vamos programar esse bichinho?

Mas além da velocidade e tudo mais que as GPUs estão oferencendo, a parte realmente legal é que ela agora está ficando parcialmente programável. Parcialmente porque, a GPU utiliza a arquitetura pipeline. Arquitetura pipeline, resumidamente, é um hardware que é composto de vários módulos menores, e esses módulos devem funcionar concorrentemente. A vantagem da arquitetura de pipeline é que enquanto um dado está sendo tratado no segundo módulo, outro pode ser tratado no primeiro (se esse não depender do dado que está sendo tratado no segundo módulo). Por exemplo, uma fábrica que monta carros usa a arquitetura de pipeline, pois num módulo, o os pneus são colocados, em outro o carro é pintado. Com essa arquitetura, é possível que dois carros(ou mais, depende de quantos módulos tem o seus sistema) sejam produzidos quase ao mesmo tempo, evitando subutilização dos recursos de hardware.

A GPU permite a programação de dois desses módulos.

A grande diferença é que dessa vez, usaremos os recursos da GPU e não da CPU, ou seja, vamos usar a memória da GPU e as instruções da GPU, não a memória RAM da CPU, e tampouco suas instruções. Em outras palavras, você vai progamar para o processador da placa gráfica, e não para o processdor de propósitos gerais do seu PC (a CPU).

As vantagem é que como a placa gráfica é processador dedicado para gráficos, ele tem muito mais vantagens que a CPU. Por exemplo, ela possui comandos nativos para lidar com vetores, pixels, etc. Mas a grande vantagem, na realidade, é que a placa gráica consegue lidar com mais de um pixel por vez, ou seja, é uma placa que pode processar vários pixels em paralelo.

Para programar a GPU temos agora a disposição várias linguagens, e a mais usada é a C for graphics, que como o nome dá a entender, é bastante similar a C, mas para placas gráficas ; )

Na realidade, antes já existiam linguagens, mas era muito similares a um assembly, o que inviabilizava a programação para a maior parte das pessoas porque programar em assembly é um saco : P

Mas voltando, C for graphics permite atualmente a programação de dois módulos das GPUs atuais, o vertex shader, e o fragment shader. Num próximo post eu entro em detalhes sobre o pipeline das placas gráficas e consequentemente falo das vantagens e possibilidades programando o vertex e o fragment shader.

Orientação a objetos

Muito se fala em orientação a objetos no mundinho da programação. É a modinha atual. Parece que toda linguagem precisa ter. A famosa linguagem C não tinha. Fazer o que? Meta por cima tudo que precisa para ter orientação a objeto e temos C++. PHP também não tinha. Solução? PHP5 incorporou tudo (e por causa disso é quase uma linguagem distinta das versões anteriores). Qualquer linguagem nova quase sempre apresenta essa facilidade. Até Javascript, que era pra ser bem simplezinha, já tem.

Mas afinal, o que é exatamente orientação a objetos?

Orientação a objetos é um paradigma de programação. Um paradigma de programação é uma forma de pensar na hora de codificar. Em geral, a primeira linguagem que aprendemos são linguagens com o paradigma procedural (como Pascal, C, Ada, Cobol, Fortran, Clipper). Linguagens procedurais são aquelas no qual nosso código é dividido em subrotinas (procedures) ou function (funções). Uma procedure é uma função sem retorno (pode ser visto como uma função que não retorna nada, void). Se você realmente quiser modularizar seu programa, o melhor que você pode fazer é dividi-lo em várias subrotinas/funções, e num nível maior, em várias bibliotecas. Antes da programação estruturada, usava-se nos códigos o recurso do goto, que tornava a maior parte dos programas ilegíveis. Os famosos códigos espaguete.

A programação orientada a objetos é uma outra visão de como programar. Quando for pensar na estrutura e lógica do programa, você não vai pensar apenas em quais váriaveis você vai ter, e quais funções você vai aplicar nelas. Você deverá pensar em quais os objetos que formam seu programa. Você decide o que é o objeto. Num cadastro de uma faculdade, seus objetos podem ser alunos, professores e matérias, por exemplo. Você escolhe quantos objetos terá, de forma que facilite na sua implementação.

Cada objeto seu será uma classe (que você pode pensar como um Record do Pascal ou Struct de C). Entretanto, você não vai apenas declarar quais são as váriaveis que farão parte de sua record (ou Struct). Você dirá também quais são as funções que podem ser aplicadas nesse objeto (essas funções que são declaradas dentro da classe são chamadas de métodos). Seus métodos só poderão ser aplicados nos objetos aos quais eles pertencem.

Ou seja, a partir de agora você não vai dividir seu programa apenas em funções, você vai dividi-lo em objetos (classes pra ser mais específica … um objeto é uma instância de uma classe). Essa pequena mudança parece mínima, e talvez de pouca valia, mas faz muita diferença.

Uma linguagem considerada orientada a objetos também deve proporcionar modificadores de acesso (para facilitar encapsulamento de dados e depuração), herança (facilita a legibilidade do código e facilita o reuso dele). Pode também oferecer sobrecarga, polimorfismo, entre outras facilidades.

Em suma, a principal vantagem é que com orientação a objetos é muito mais fácil organizar o teu programa.

Claro que um programador MUITO organizado pode fazer programas lindos em linguagens procedurais, legíveis e organizados (assim como pode fazer um programa lindo com goto). Mas se um paradigma (no caso, a orientação a objetos) ajudar, melhor. Assim como se um compilador consegue detectar erros em tempo de compilação, melhor. Uma vez aprendida essa “nova” forma de programar, horas de trabalho podem ser economizadas.

Mas veja bem, orientação a objetos, só vai trazer uma vantagem substancial se seu programa não for muito pequeno. Se for muito pequeno, você não conseguirá dividir seu programa em muitas classes, e não conseguirá fazer muito reuso de código. E nesse caso talvez ela aparentemente não pareça útil. Assim como metodologias de engenharia de software como RUP e XP parecem que mais atrapalham do que ajudam para projetos MUITO pequenos.

A título de curiosidade, existem outros paradigmas, não tão populares quanto a procedural e orientado a objetos. Um deles é o paradigma funcional (exemplos são linguagens como Haskell, ML, Ocaml). Outro paradigma é o lógico, e sua linguagem mais famosa é o Prolog. São paradigmas bem mais complexos que a orientação a objetos, e que possuem ainda algumas limitações que não permitiram seu uso em grande escala.

O iPod touch é incrível !

Quando o iPod começou a popularizar, achava um absurdo paga MUITO mais caro por um tocador de mp3 só porque ele é mais bonitinho. Isso até o meu namorado comprar um e eu ver como era de perto: apesar dos contras como a necessidade de usar software proprietário da Apple, o iPod é realmente muito melhor do que qualquer outro player, e não era apenas um tocador com design legal.

Depois de usar um iPod, você simplesmente não consegue usar outros players sem achar uma pilha de defeitos do tipo: a clickwheel faz falta, como esse negócio é lento, que telas feias, que tela pequena, etc. Logicamente, tive que comprar o meu, branquinho de 30 GB.

Mas ai lançaram iPhone. E todo um blá blá blá em cima. Novamente achei outra bobagem. Achei uma besteira tanta falação em cima de um negócio que não tem nada de revolucionário, apenas agregou um monte de coisa que já existia num aparelho só. Nem mesmo o Steve Jobs fazendo maravilhas com ele na apresentação do produto tinha me empolgado.

Bom, não tive exatamente a chance de mexer num iPhone, mas tive a de mexer num iPod Touch, que um colega do meu trabalho comprou. Pra quem não sabe ele é exatamente igual ao iPhone, exceto pelo fato de não fazer o principal: as ligações.

Ao contrário de minhas expectativas, fiquei encantada. A tela sensível ao toque funciona magicamente bem. É pequenininho e cheio de features, praticamente um palmtop com muito mais estilo.

ipod touch

Mesmo assim não pretendo compra-lo, meu iPod classic atende a todas as minhas necessidades, mas pelo menos agora entendo todo esse auê ao redor do iPhone/iPod Touch: O negócio ao vivo impressiona mesmo.

O Easy Recovery salvou a minha vida

Estava eu, feliz e contente, em mais um dia de trabalho. Pra quem não sabe, sou estagiária e programadora de uma empresa de Porto Alegre. Trabalho com Java para web. Bem. Estava eu quase terminando minha tarefa (porque os desastres só acontecem quando o trabalho está quase pronto), quando minha IDE, o Eclipse aponta um erro numa das classes.

Eu tinha uma classe que o Eclipse apontava problema. Olhei o nome e vi que não precisava mais dela. Então resolvi apagá-la para sair aquele x vermelho feio. Só que ao invés de selecionar a classe, selecionei sem querer, o package inteiro, ou seja, selecionei um conjunto inteiro de classes (umas 15 no total). Foi pedida a confirmação, e confirmei bem bela pois achei que estava sendo apagada só UMA classe. Ledo engano. Quando me dou conta da bela porcaria que aconteceu, quase tenho um surto. Eram justamente as classes que eu tinha gasto dias trabalhando e eu não tinha backup e nem tinha subido no CVS. Perguntei para alguns programadores mais experientes se não tinha alguma solução, e bem, não tinha. Nem na lixeira o negócio tava, tinha sido apagado por completo.


Queria apagar só a classezinha com x vermelho (ConsignaçãoDO), mas o mouse selecionava o package inteiro

Conformada com o acontecido, fui comunicar ao meu chefe. Digo a ele que perdi tudo e que não vou cumprir o prazo. Mas eis que ele diz: tenta usar esse CD, o Easy Recovery.

Como todos sabem, ou deviam saber, o Windows nunca apaga os arquivos do seu pc. O que ele faz quando você deleta é marcar o arquivo como apagado. Assim quando você instalar algo novo no pc, ele vai usar aquele espaço marcado e instalar por cima. O Windows não troca os número binários do arquivo que você quer apagar por zero. Isso porque, fazer isso, que seria “apagar de verdade” levaria muito tempo, desnecessariamente. Ou seja, o sistema operacional só apaga os arquivos logicamente e não fisicamente. Logo, quando você apaga a pornografia do seu computador, alguém com o Easy Recover pode pegar tudo de volta : P

O que softwares como o Easy Recovery fazem é procurar na memória por todos os arquivos marcados como apagados e mostrá-los para o usuário.

Mesmo parecendo tão seguro, nunca acreditei que funcionasse bem mesmo. Parei de acreditar em programas que tentam gerenciar o disco rígido quando ao usar o Partition Magic uma vez, ele ao invés de particionar o que eu queria, apagou uma partição, mesmo com eu fazendo tudo certinho.

Mesmo assim a situação era de emergência, então usei o Easy Recovery. Apenas alguns passos, totalmente intuitivos e bum, meus arquivos são recuperados (exceto por dois, mas eles não eram muito importantes) .

Só uma coisa pra dizer depois de tudo isso: viva a tecnologia !

Alan Turing, o pai da computação e da máquina de Turing

Alan Turing foi um geniozinho inglês que ajudou a definir os limites da computabilidade. Uma das perguntas que ele ajudou a responder foi: O que deve ser capaz de fazer uma máquina para possuir o poder máximo de expressão que os algoritmos fornecem ?

Turing definiu uma máquina abstrata que mais tarde ficou conhecida como máquina de Turing que respondeu a essa pergunta. A máquina de Turing é uma máquina abstrata, o que nada mais é do que um modelo de computador ( de preferência extremamente simples), no qual detalhes de implementação e físicos são deixados de lado, dando ênfase apenas na parte lógica. Como uma máquina abstrata é extremamente simples, fica mais fácil fazer provas formais ou conjecturas sobre vários aspectos da computação. A máquina de Turing é uma máquina abstrata com memória infinita que segue este funcionamento.

Uma das provas obtidas (graças a essa simplificação que leva em conta apenas a parte lógica) foi que nenhuma outra máquina é mais poderosa. A máquina de Turing é capaz, dado um tempo suficientemente grande, de emular qualquer outro computador. Logo tudo que é computável, uma máquina de Turing é capaz de computar. Ela é o limite de computabilidade que qualquer computador pode atingir, ou seja, nada é mais poderoso em termos de computabilidade do que ela. Qualquer outra máquina resolverá, no máximo, a mesma classe de problemas que a máquina de Turing (de forma mais rápida ou não, mas a questão aqui não é velocidade, não confunda computabilidade com velocidade).

A hipótese de Church afirma exatamente isso tudo que foi dito: A máquina de Turing é o limite de computabilidade. É a forma mais poderosa de expressar algoritmos. Ela emula qualquer outra máquina. Logo, se você quer saber se seu dispositivo computacional tem todo o poder de expressão que os algoritmos têm, graças ao pai da computação, você não precisa mais fazer um monte de testes exaustivos, basta ver se seu dispositivo é capaz de emular uma máquina de Turing. Em outras palavras, projetistas de computadores, se seu computador emula uma máquina de Turing, desencane, melhor o projeto não fica. O máximo que você pode conseguir é torna-lo mais rápido ; )

Existem outros modelos de máquinas teóricas, como a máquina Norma (que tem o mesmo poder que a máquina de Turing e eu considero ainda mais simples), mas a máquina de Turing foi a primeira e a mais conhecida.


O pai dos geeks

Alan Turing fez uma inestimável colaboração com essa idéia, mas ele foi além disso. O estudioso inglês também propôs um delicioso teste para os pesquisadores da área da inteligência artificial: o teste de Turing. Esse teste tem o intuito de avaliar se uma máquina pode ser considerada inteligente ou não. O teste funciona dessa forma: numa sala é colocada uma pessoa e um computador. Um ser humano avaliador faz perguntas para o computador e para a pessoa (sem saber quem é a pessoa e quem é o computador). Se esse avaliador não conseguir discernir quem é o humano e quem é a máquina após algumas perguntas, a máquina é considerada inteligente.

Obviamente esse teste é bastante polêmico e nenhuma máquina passou nele até hoje. A maior parte dos pesquisadores de IA discordam desse teste como método de avaliação, entretanto o teste serviu como um instigante incentivo para os pesquisadores de sua época.

Mesmo sendo esse gênio, Turing teve um fim bastante triste. Morreu com pouco mais de 50 anos vitíma de uma maçã envenenada por ele mesmo. Sim, ele suicidou-se. Turing era homossexual, o que na época era crime. Foi obrigado a tomar hormônios femininos e condenado a prisão. Por causa de tudo isso, teve uma vida miserável, o que o levou a depressão e posteriormente ao suicídio. Uma lástima. Se tivesse vivido mais alguns anos poderia ter feito outras grandes contribuições para a computação. Talvez agora você estivesse usando um computador muito melhor se ele tivesse vivido mais alguns aninhos.

Graças as sua contribuições pioneiras, o prêmio considerado o Nobel da informática chama-se prêmio Turing, concedido pela ACM. Aqui uma lista dos vencedores do prêmio. Notem que tem nomes do calibre do Knuth,Djikistra, Minsky e Backus.


Alan e um bonequinho de neve meigo : P

Turing tem um monumento em sua homenagem na cidade de Manchester. Quando eu for para a Inglaterra ver o Cavern Club e o Big Ben, certamente tirarei uma foto ao lado da estátua do pai da computação.

Suécia e Boten Anna

A Suécia é o país de língua não inglesa com mais tradição no rock e pop. Para citar alguns exemplos de bandas ou cantores provenientes de lá, têm Abba, Petter Bjorn and John, The Hives, I’m from Barcelona, Cardigans, Roxette, entre outros.

Mas nada disso se compara ao cantor Basshunter. Além de ser o único dos citados aqui a cantar de fato em sueco e não em inglês, é o único que faz música com temas nerds como Warcraft e IRC.

A música sobre Warcraft é meio chatinha (talvez porque eu nunca tenha jogado esse jogo), mas a sobre o IRC, é perfeita ! Chama-se Boten Anna. Conta a história de um cara que se apaixonou por um bot do IRC. Vejam um pedacinho da tradução dela (afinal sueco consegue ser mais difícil que japonês):

CD
Sim, o nome do cd é LOL <(^^,)>

Eu conheço um bot.
Chama-se Anna, Anna é o nome dela.
Ela pode bani-los, bani-los a sério.
Ela limpa o nosso canal.
Quero dizer-vos que conheço um bot.
Ela vigia toda pessoa no nosso canal,
E vê se não há problemas
É impossível alguém fazer um take-over
E lembrem-se, eu conheço um bot.
Um bot que ninguém pode tocar,
E ela kicka-los quando tem vontade.
E kicka todos os spammers.
Não, ningém pode tocar no nosso bot.

Mas o melhor (ou pior) vem agora:

Veio um dia, e eu não podia acreditar.
O canal estava estranho.
Nunca pensei que estivesse tão errado.
Mas Anna disse-me “Não sou um bot, Sou uma garota muito bonita”
Foste muito estranha para mim.
Não tenho nada a dizer.
Para mim continuas a ser um bot.
Chama-se Anna, Anna é o nome dela.

Ele prefere que ela seja um bot ao invés de uma garota. Letra sensacional : P.
Assistam no Youtube com as legendas, pois com a melodia fica muito melhor. Por sinal, bonitinho o Jonas Altberg no clipe né ? Ah sim, esse é o nome que se esconde sob o pseudônimo de Basshunter.

Se o Latino fosse mais nerd, com certeza faria sua versão brasileira : P