31 January 2008

Windows no Laptop

Depois de mais de um ano de exclusividade do Ubuntu no meu Laptop resolvi finalmente fazer os backups necessários para reformatar o HD e instalar windows.

Bom, desde a compra do computador os planos eram ter os dois sistema com dual-boot. Por isso eu havia deixado uma partição reservada para instalar Windows posteriormente. Acabei descobrindo que o limite de partições primárias do meu HD eram 3 e eu já tinha as 3 (uma para a / outra para a /home e uma de swap) e por estar usando o Ubuntu há algum tempo aloquei o espaço que eu tinha reservado e segui sem windows.

No fim desse ano algumas coisas mudaram. Fiz o primeiro jogo que eu posso chamar de completo e apesar de sua simplicidade gráfica extrema ele tinha sérios problemas de performance no Linux. Bem, culpe a ATI e sua incapacidade de fazer um driver que funcione para Linux. Eles estão tentando, mas simplesmente não dá. Não chega lá. Minha situação financeira atual diz que eu vou ter que me contentar com minha ATI Radeon XPress 200M por mais um tempinho e enquanto isso eu gostaria de começar a levar mais a sério o desenvolvimento de games.

Minha intenção inicial em instalar o windows era aprender a usar o XNA. O desempenho da minha placa no Linux me deu um certo medo de que não rodasse nada direito, mas não é que eu tive surpresas agradáveis? Enquanto a placa (provavelmente - eu não testei, pra falar a verdade) não roda jogos muito atuais o demo do XNA rodou suavemente e vários jogos que me divertiam muito rodaram legal.

Óbvio que eu entrei num frenesi de instalação de jogos e testei tudo que eu gosto e que estava ao meu alcance. A maior surpresa foi descobrir que os requerimentos mínimos para rodar a versão de PC do Silent Hill 2 são ridiculamente baixos. Ainda assim o jogo é bem impressionante graficamente, mas creio que isso se deva mais ao trabalho artístico do que do uso do hardware.

Bom, no fim eu percebo que nunca vou achar o sistema operacional perfeito. Enquanto minhas necessidades de programador são satisfeitas perfeitamente com o Linux, meu lado jogador ainda vai precisar de um Windows para ser feliz.

25 January 2008

TODO #1

Aprender a fazer isso:



Mas antes eu queria um desses.

\o/

23 January 2008

gtk.EntryCompletion

Esse é um tutorial que exige algum conhecimento de programação, da linguagem Python e do módulo PyGTK. Programadores experientes em outras linguagens provavelmente conseguirão entender e adaptar às suas necessidades. Caso queira aprender, existem tutoriais introdutórios de Python e PyGTK.

Para quem programa interfaces em PyGTK (ou GTK+ em outra linguagem, eu uso Python) aí vai uma dica de usabilidade:

Caso você tenha um campo de texto no seu programa, considere se não existe uma lista de valores comuns de preenchimento e dê uma ajudinha ao usuário a lembrar desses valores usando um gtk.EntryCompletion. Usá-lo é muito simples:
# Aqui eu pego uma gtk.Entry. Nesse caso peguei ela do
# meu xml que eu criei no glade

entry = xml.get_widget('entry_verbo')

# Depois crio os dois objetos necessários: um gtk.EntryCompletion,
# que vai desenhar a lista de sugestões e um gtk.ListStore que
# vai armazenar os valores.

completion = gtk.EntryCompletion()
list_store = gtk.ListStore(gobject.TYPE_STRING)

# Inserir uns valores. Note que são tuplas de um elemento só
# (por isso a vírgula sem nada depois). As tuplas inseridas
# seguem o modelo inicializado no construtor do ListStore.
# Nesse caso eu usei apenas um gobject.TYPE_STRING para dizer
# que minha lista guarda apenas uma string por registro

list_store.append(('aqui',))
list_store.append(('botamos',))
list_store.append(('umas',))
list_store.append(('palavras',))
list_store.append(('para',))
list_store.append(('testar',))

# Aqui eu associo a list_store ao meu completion criado anteriormente

completion.set_model(list_store)
completion.set_match_func(match_func)

# O método abaixo escolhe qual coluna do modelo vai conter o texto a
# ser mostrado no completion. Como só tem uma coluna no gtk.ListStore,
# vai ser essa que vamos usar.

completion.set_text_column(0)

entry.set_completion(completion)
Bom, a única coisa que falta no código acima é definir match_func que é uma função para buscar os valores de acordo com o que é digitado no gtk.Entry. Ela deve ser uma função com a seguinte assinatura
def match_func(completion, key_string, iter, func_data):
onde completion é o próprio objeto gtk.EntryCompletion usado pela função, key_string é a palavra que está no entry no momento da verificação, iter é um gtk.TreeIter que aponta para um item da lista de dados da gtk.EntryCompletion (uma gtk.ListStore, no caso do exemplo acima) e func_data é um argumento adicional que pode ser passado no método set_match_func do gtk.EntryCompletion.

Essa função será executada para cada item do gtk.ListStore e deve retornar True caso o item deva ser mostrado como opção de sugestão e False caso não deva. Na documentação da PyGTK a seguinte função está disponível como exemplo:
# Assumes that the func_data is set to the number of the text column in the
# model.

def match_func(completion, key, iter, column):
model = completion.get_model()
text = model.get_value(iter, column)
if text.startswith(key):
return True
return False
Ela cobre um dos usos mais comuns de um completion, que é mostrar as palavras na lista cujo início seja igual à palavra digitada. Um exemplo é mostrado na imagem abaixo:

20 January 2008

Manualist

Sem dúvida uma das maiores pérolas da internet que eu vi nos últimos tempos. Não vou falar nada, olhem:



Não deixem de conferir a playlist ostensiva do Manualist no YouTube. Recomendo, principalmente, Aha - Take On Me, Europe - Final Countdown e uma tal de Bumble Bee Boogie.

Além disso, também tem o tema do Zelda e do Mario \o/

17 January 2008

Vicia

e tomou boa parte do meu dia de hoje: http://xkcd.com

Eu pensei em selecionar as minhas favoritas de hoje e postar os links aqui, mas infelizmente foram muitas e eu já me perdi. Enfim, comecem por aqui http://dynamic.xkcd.com/comic/random/ e vão seguindo. Quando realmente estiverem viciados comecem a partir de http://xkcd.com/1/ e sigam em frente!

10 January 2008

Página sobre MoonBunny e Google Code

O Vitor Pamplona fez uma página sobre MoonBunny na wiki dele. Fiquei muito contente com as coisas bacanas que ele disse sobre o projeto e também pela iniciativa dele de divulgar o nosso trabalho.

Valeu Vitor!

A propósito, o projeto agora está no Google Code e pode ser encontrado aqui.

Gente Normal? Onde?

Everynow and then eu escuto alguém dizer que não faz muito bem conviver com pessoas desequilibradas, problemáticas, etc. O ideal é conviver com pessoas normais, pessoas centradas. Daí eu parei pra pensar nisso esses dias, pensando em muitos amigos e gente que eu conheço de perto e depois eu tento espandir meu pensamento pra englobar um plano mais geral do que eu sei sobre as pessoas e a vida.

Quando eu tento generalizar uma coisa sobre pessoas eu tento fazer uma fotografia mental do mundo que eu conheço usando minha própria experiência e minha vida como ponto de partida, mas depois eu incluo filmes, livros, noticiários e outros conhecimentos que já estão tão fundados que eu nem sei de onde vêm. Tudo isso pra formar minha noção sobre as pessoas. Eu chamo de fotografia porque eu não gasto horas pensando nem faço um estudo detalhado. Eu simplesmente penso por uns poucos segundos e tento tirar uma conclusão.

Eu fiz isso sobre as pessoas serem normais ou não e a minha conclusão é de que eu não conheço ninguém normal. Aliás, acho que ser normal é uma grande mentira, não existe tal coisa. Eu penso em alguns modelos que às vezes são vendidos como equilíbrio e normalidade, tipo aquela cena American Way of Life da família feliz com casinha e cerquinha branca e não consigo deixar de achar um monte de coisas doentias e desequilibradas, nem que seja o consumismo só pra citar o mais óbvio.

Agora pensando talvez a normalidade exista. O normal é ser louco mesmo e aquele que aceita a própria loucura e aprende a tirar o máximo de felicidade dela está no caminho certo.