Por que eu gosto de programar

Eu sempre gostei de programar, desde moleque. Ganhei meu primeiro computador aos 10 anos e nunca mais parei. Na década de 80 a linguagem amplamente utilizada era o Basic. Eu fiz vários programas e um deles até emulava uma base de dados rudimentar para organizar meus disketes. Quase vendi ele para uma locadora na Urca.

Houve um hiato porém: entre 2003 e 2013 eu programei muito pouco. Foram os anos pós MBA que a vida me levou para outros cantos. Eu sentia falta e tanto senti que entrei para o mestrado de informática na UnB achando que voltaria a programar loucamente, mas não foi bem isso que aconteceu: o curso é completamente teórico e o único programa que fiz foi o de geração de BSCs baseado em Fuzzy e me deu um trabalho louco. Eu já não programava com facilidade. Não me acostumei ao C# do Visual Studio 2010 e achava tudo muito complicado. Não me empolguei.

Ano passado eu precisei fazer um app para telefones móveis e comecei a estudar Swift e Android. Também achei supercomplicado quando finalmente cruzei com um despretencioso curso de PHP+MySQL que tinha evitado a vida toda. Pronto, me achei de novo. Me adaptei muito bem a linguagem e voltei a conseguir programar no nível que fazia nos melhores anos. Depois aprendi Javascript para fazer outros códigos que o PHP não permite e estou me sentindo completo e feliz de novo.

Fiz já alguns programas para clientes e outros mais para suprir algumas necessidades que tinha pessoais.

Uma delas, explica bem uma realidade que enfrentamos e não nos percebemos. Ao ver uma conta de twitter que só postava frames de filmes e abaixo do frame, as cores que apareciam nele eu enfiei na cabeça que queria fazer um site que descobrisse as cores principais de qualquer foto que eu fizesse upload.

Não fazia nem idéia de como começar. Vi que o melhor caminho era por Javascript. O primeiro pedaço do algoritmo consistia em ler pixel por pixel o arquivo da foto e armazenar a cor lida de cada um deles. Depois eu gerava a frequência de cada cor diferente e no final pegava as 10 cores que mais apareciam.

Parece simples, mas tive vários problemas com esta primeira abordagem: primeiro, levava um caminhão de tempo para gerar as frequências, pois era um algoritmo n^2: ou seja fazia n*n contas para os n pixels de uma foto e pasme, uma foto simples do instagram, por exemplo, possui 360.000 pixels. Houve ainda um problema por que as 10 cores selecionadas eram muito parecidas umas com as outras e ficava quase sempre no preto, pois há muito preto dentro de uma foto a nível de pixels.

Fiz então uma evolução do algoritmo para comparar as cores únicas e retirar as que eram muito parecidas. Resolvi o problema das cores parecidas, mas piorei e muito o rendimento do algoritmo, pois cada foto tem aproximadamente 100.000 cores diferentes, logo fiz mais um procedimento n*n para comparar estas cores.

Uma foto simples do instagram poderia levar até 3 minutos para ser processada. Não tava legal.

Eu tentei fazer alguns algoritmos de ordenação recursivos, mas o Javascript não deu conta de fazer isto para 360.000 pixels e deu problemas.

Foi aí que tive a idéia de encurtar significativamente o algoritmo ao fazer as comparações das cores logo quando eu as lia dos pixels: como elas eram parecidas e repetitivas, o conjunto de cores diferentes nunca subiria mais do que 20 delas, resultado final do algoritmo. Deu muito certo: o que antes levava até 3 minutos ficou pronto em segundos.

O que eu ganhei fazendo isso? Nada financeiramente, mas tive a satisfação de conseguir fazer algo que queria ver como era e este pequeno algoritmo que me tomou umas 2 tardes me mostrou que quando atacamos um problema logo de cara, sem ter a visão do todo podemos sim, sair do outro lado quanto temos um método e o seguimos.

Se você estiver curioso como funciona, subi o site para este endereço:

https://piccolors.000webhostapp.com/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s