O conjunto de todos os conjuntos que não contém eles mesmos

Quando eu era criança, eu não era muito fã de matemática. Achava uma decoreba inútil que servia só pra exercitar a mente.

As coisas começaram a mudar no cursinho pré-vestibular. Eu lembro que ia em todas as aulas de ‘reforço’ de matemática, visto que matemática era peso 3 no meu vestibular. Numa dessas aulas, um dos estudantes, de certo revoltado, falou que detestava a matéria porque matemática era uma coisa inventada. Claro, contas, juros, essas coisas eram úteis, mas equações, polinômios e logaritmos, só pra citar alguns exemplos, eram invencionices de alguém que queria de certo torturar criancinhas, disse ele (exceto pela parte de torturar as criancinhas).

Momento de tensão na aula.

Eis que o professor, talvez por ser uma aula de reforço, talvez por ser novinho e motivado, talvez por ter se ofendido, não se sabe bem a razão, resolveu ‘defender’ a matemática ao invés de dizer o clássico e desconfortante ‘você tem que estudar porque cai no vestibular’. E então, entre várias explicações, ele disse a frase que me tocou. Disse ele: A matemática explica o mundo.

De novo, com mais dramaticidade e voz com eco: A matemática explica o mundo.

Um mais um não é dois porque alguém quis que fosse dois. É dois porque no mundo real, sempre é dois. A matemática (e claro que por consequência quem faz uso dela, como a física) está explicando, refletindo o que acontece no mundo real. No momento que um arranha-céu só fica em pé se seguir os ângulos, contas e polinômios da matemática, a matemática está mostrando que ela funciona, e que ela existe no mundo real sim.

É óbvio, mas tem muita gente (por exemplo eu mesma por uns bons anos) que não se dá conta. Não se dá conta de como ela é útil, e tudo o que ela nos permite fazer (de levantar prédios a fazer jogos de videogame).

E foi cursando ciência da computação e aprendendo (ou pelo menos estudando : P ) derivadas, integrais, álgebra linear, entre outras coisinhas que eu me apaixonei por essa matéria. Não que eu ache ela fácil, longe disso, mais se avança nela, mais abstrata e não intuitiva ela fica. Mas é ai que começa umas bizarrices mucho locas, que eu adoro tipo, geometria hiperbólica (a soma dos ângulos internos de um triângulo nem sempre é 180 graus … como os professores do primeiro grau nos enganavam !!! ), aquele lance das portas e teoria dos conjuntos.


Georg Cantor pira nos infinitos (literalmente)

Ah, a teoria dos conjuntos … isso me lembrou a cardinalidade de conjuntos infinitos de Georg Cantor, mais especificamente aquela parte que diz que um conjunto infinito pode ser maior que outro também infinito. Sente a piração, 2 conjuntos infinitos de tamanhos diferentes !!! Eu sei que já é provado o esquema, com uma prova muito elegante por sinal, só que é tão não intuitivo que sempre me dá um pequeno revertério mental quando penso a respeito.

Mas acho lindo.

PS: Post motivado pela leitura do livro Alex no País dos Números, de Alex Bellos, livro legal pra quem curte a matéria.

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.

Momento cultural: A palavra software em Português

Vocês sabiam que existe uma palavra em português para a palavra em inglês software? Não, não é programa. Software em português é logiciário. Vem do francês logiciel. Como todo mundo já sabe, os franceses (ao contrário dos japoneses) evitam usar estrangeirismos. Por isso, lá inventaram essa palavra para descrever software. Hardware na França chamam de matériel. Faz sentido: matériel significa material, ao passo que logiciel tem a mesma raiz que a palavra lógico. Claro, o hardware é o material, e o software é a parte lógica.

Engraçado que ninguém no Brasil, e nem mesmo em Portugal, onde valorizam mais a língua portuguesa, conhece logiciário. Menos mal, porque a palavra é muito feia : P

Por sinal, aqui um post que fala sobre estrangeirismos muito legal.

Propagandas que atacam outras propagandas: comerciais provocativos

Aqui em Porto Alegre pelo menos, o cursinho pré-vestibular Universitário (o segundo maior depois do Unificado) fez uma campanha publicitária em grande escala, que consisitia de uma foto de um aluno que passou na UFRGS (a universidade com o vestibular mais disputado do Rio Grande do Sul) e a frase: Fiz Universitário e passei na UFRGS.

Mas ai, o cursinho Monteiro Lobato fez então uma propaganda sensacional: consistia em tentar provar que o fato desses alunos terem feito cursinho no Universitário não estava correlacionado a sua aprovação. Eram frases como essas que eles colocaram em propagandas:

– Comi banana e passei na UFRGS
– Dormi bastante e passei na UFRGS
– Viajei para o Paraguai e passei na UFRGS

E assim por diante.

A propaganda do cursinho rival foi tão humilhante o Universitário mudou a frase. Agora é apenas a sentença Passei na UFRGS e a foto do aluno.

Eu acho muito legal essas propagandas mais ousadas, que provocam, cutucam o adversário com vara curta.

E esses dias vi mais uma dessas propagandas. Só que dessa vez era de um livro que ensinava SQL (linguagem para bancos de dados). A propaganda atacava livros que prometem ensinar linguagens de programação como Java, C++, Python, entre outras, em prazos curtissimos. Pra quem não sabe, é muito comum ver livros com o título Java em 7 dias, ou Aprenda Python em 21 dias, ou ainda C++ em x dias (x é uma variável no qual quanto mais baixo o valor, mais o livro vende).

Esses prazos na realidade são uma grande bobagem, porque de fato, pra fazer programas pouco maiores do que um Hello World você realmente consegue aprender nesse prazo, agora vê se em com 7 dias sem nunca ter visto Java na vida, com um livrinho você consegue passar em alguma certificação da Sun, por exemplo, ou mesmo cuidar de qualquer sisteminha maior.

Mas voltando, a propaganda que tinha nesse livro de SQL, que se chamava SQL for Begginers era o seguinte: This book is for humans, not for clocks. Adorei, e só quem conhece esses outros livros captou a provocação.

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.