Vala para Mobile with Lasers, digo, com Figuras

O mesmo que falei antes, agora com figuras! (Porque sem figuras fica chato.)

O primeiro diagrama mostra um cenário com Mono sendo usado como plataforma de desenvolvimento para portáteis, o diagrama seguinte mostra o equivalente em Vala.

Mono foi escolhido como exemplo por Vala ser fortemente inspirada em sua sintaxe, e também por uma discussão na lista mobile-devel do GNOME, onde alguém pergunta o motivo de Mono não estar sendo considerado e dentre as resposta está uma de Jeff Waugh que diz: “Mono is a can of worms that no one really wanted to open”. (Leia o resto pra não tirar conclusões precipitadas.)

Não estou aqui desconsiderando os módulos/bibliotecas e outras coisas que vem junto com o Mono, esta é um comparação um tanto grosseira.

Mono_for_mobile
Mono: menos passos para compilação, mais peso no runtime.

Vala_for_Mobile
Vala: mais passos para compilação, mas o runtime nem precisou saber…

Vala para Mobile

Como você já deve saber, o sistema de tipos e orientação a objetos de GTK+ é baseado na GLib. E como você já deve saber, botar pra funcionar orientação a objetos em C é um troço bem engenhoso, mas muito doido e cansativo. Daí que boa parte dos programas em GTK+ é escrita em linguagens de alto nível usando bindings (PyGTK, GTK#, gtkmm, java-gnome).

Os bindings são muito úteis, mas para um programa feito em PyGTK funcionar, é necessário ter instalados em seu sistema GTK+, Python e PyGTK. Num sistema Linux regular tudo isso já está lá e ninguém percebe. Já numa máquina Windows pode ser um pouco demais pedir pra o usuário instalar esses mondrongos antes do seu programa de 800kb. O problema no desktop não é falta espaço em disco ou memória, e sim evitar importunar o usuário com a instalação de dependências que ele não precisa saber que existem. (Tem gente trabalhando nesse último problema.)

Mas o que me motivou a escrever esse post foram os sistemas móveis. Já temos uma certa quantidade de plataformas móveis baseadas em GTK+ (e GStreamer, e outras GLib-coisas): Maemo, OpenMoko, OLPC. Bindings para linguagens de alto nível estão normalmente disponíveis e sua instalação costuma ser transparente para o usuário. Só não é transparente para os recursos limitados do dispositivo portátil, mas pedir aos desenvolvedores que usem GLib-C[1] certamente não vai te tornar um cara mais popular.

Vala

Vala é uma linguagem com sintaxe próxima de C#, com algumas adaptações para se encaixar melhor no sistema de tipos do GObject. Pelo menos é isso que diz no site. Já a wikipedia diz o seguinte:

Vala (valá-), meaning “enclosure” in Vedic Sanskrit, is an Asura of the Rigveda and the Atharvaveda, the brother of Vrtra.
(…)
Historically, it has the same origin as the Vrtra myth, being derived from the same root, and from the same root also as Varuna, *val-/var- (PIE *wel-) “to cover, to enclose” (perhaps cognate to veil).

Wikipedia: Vala (Vedic)

Antes de você começar a pensar que se trata de mais um binding pra GTK+, vou esclarecer que a saída gerada pelo compilador Vala é nada menos que código GLib-C, que pode ser compilado normalmente pelo GCC para binários nativos, linkando diretamente com bibliotecas baseadas na glib. Vala é algo que, fazendo uma analogia ao asura do mito védico, cobre/envolve o código GLib-C, ocultando sua complexidade. A ligação Vala-C é feita por um arquivo .vapi, que, como cansei de dizer, só é necessário em tempo de compilação.

Voltando ao cenário dos dispositivos móveis, com Vala o desenvolvedor tem o conforto equivalente a um binding de alto nível, e o portátil não tem de pagar o preço por isso. Abstração sem overhead!

Instalando

Pegue a versão mais recente em http://live.gnome.org/Vala/Release e compile da maneira usual. Além das ferramentas de praxe, Bison e Flex precisam estar instalados (no Debian/Ubuntu são os pacotes bison e flex).

Comparação

Vejamos um código bem simples em Vala, apenas uma classe que herda de um GObject e acrescenta um campo de texto.

// example.vala
using GLib;
public class MyObject : Object
{
protected string text { get; set; }
public MyObject () {
text = "";
}
}

Para gerar o código C (.h e .c), chame: valac example.vala

Os get e set da linha abaixo

protected string text { get; set; }

dão origem a

char* my_object_get_text (MyObject* self)
{
g_return_val_if_fail (IS_MY_OBJECT (self), NULL);

return self->priv->_text;
}

void my_object_set_text (MyObject* self, const char* value)
{
g_return_if_fail (IS_MY_OBJECT (self));

char* __temp2 = NULL;
const char* __temp1 = NULL;
self->priv->_text = (__temp2 = (__temp1 = value, (__temp1 == NULL ? NULL : g_strdup (__temp1))), (self->priv->_text = (g_free (self->priv->_text), NULL)), __temp2);
}

Mais Código

Como este blog honra as calças que veste, os seguintes códigos de exemplo (junto com um Makefile) podem ser encontrados no svn do google:

Minha intenção é gerar os bindings pra algumas coisas interessantes como tapioca-glib e hildon. Pode levar um tempo, mas assim que estiver pronto posto algo.

[1] GLib-C é a forma como Steven Hendrickx se refere a código C escrito no estilo orientado a objetos da GLib em seu texto Glib-C: C as an alternative Object Oriented Environment.

OLPC num Futuro Mad Max

Já se perguntou o que vai estar fazendo no fim da civilização ocidental? É, pode acabar mesmo! Aconteceu outras vezes, nenhuma civilização escapa, de repente parece que está tudo bem, aí pimba, os bárbaros invadem, o clima muda e as colheitas são perdidas, alguma revolta interna põe tudo de cabeça pra baixo, ou tudo isso junto. Enfim, de repente o caos impera, ninguém é de ninguém e o que conta é a sobrevivência. Você pode até ficar pensando que nós somos diferentes do que veio antes porque temos internet, aviões, televisão, mas uma das características das civilizações que caem é estar deslumbrada com ela própria pouco antes da queda. Mil anos de Roma e o que saiu disso? Idade Média. :D

Agora me dirijo a você programador ou programadora, já imaginou qual seu papel num futuro do tipo Mad Max? Pois é né, o dia todo numa cadeira, desenvolvendo habilidades que giram em torno de um dispositivo que precisa de energia elétrica, conexão de rede e assim vai. Assim como as girafas, nos tornamos seres ridiculamente especializados. Num mundo sem energia e conectividade seremos inúteis e qualquer grupo em sã consciência nos deixaria pra morrer no deserto nas mãos das gangues de motocicletas.

Mas agora seus problemas apocalípticos se acabaram! Chegou o revolucionário XO, do projeto OLPC! Com ele a sua utilidade e conseqüentemente sobrevivência estão garantidas num futuro apocalíptico estilo Mad Max! A energia do dispositivo pode ser recarregada manualmente; não é necessária a existência de grandes corporações de comunicações para o uso da rede mesh; ele foi feito leve, robusto e resistente (pra levar bagaço das crianças), o que é perfeito pra aquela fuga desesperada pela vida no mundo caótico do futuro; e melhor, quase tudo no XO é feito em Python (e PyGTK e outras coisas)!

Cuidado com as gangues motorizadas em busca de energia!
Software para simular ataques das gangues motorizadas do futuro apocalíptico.

Então o que está esperando? Apóie a idéia do OLPC, mesmo que seja por interesse pessoal. Tem de ser assim se quisermos sobreviver!

Domínio do CInLUG

Logo do CInLUG

Graças a Jesus (Sanchez) e às camisetas que vendemos, o CInLUG (grupo de usuários Linux do CIn) tem um domínio decente:

www.cinlug-br.org

Por falar no CInLUG, na última sexta à tarde fizemos uma apresentação sobre Software Livre e Open Source para os calouros de computação (ciência e engenharia). Falamos o básico e respondemos a fatídica pergunta: “como ganhamos dinheiro?” Petulantes?! Claro! ;P

Update: E agora o endereço do Planet CInLUG: http://planet.cinlug-br.org. Alguém pague uma cerveja pra Jesus!

Fontes Liberadas

Um problema muito chato de quem faz documentos e apresentações no OpenOffice no Linux e vai abrir no windows (seja no openoffice ou no ms office), ou que tenta abrir no Linux algo feito no windows, é que algumas vezes tudo aparece fora de lugar.
Não é devido a incompatibilidades ou coisas assim, apenas o fato de as fontes mais comuns (Arial, Times New Roman e Courier New) são propriedade da microsoft e como de costume não podem ser redistribuídas livremente. No linux você encontrará as equivalentes da família Bitstream, que são parecidas mas não usam a mesma métrica das suas primas microsoftianas, o que gera coisas fora de lugar.
A solução normal para isso era instalar as fontes da MS. No Debian/Ubuntu basta um apt-get install msttcorefonts, que esse pacote baixa os pacotes do site da microsoft, descompacta e coloca no lugar pra você.
A Red Hat forneceu uma terceira opção: liberou um conjunto de fontes chamado Liberation, com aparência similar e a mesma métrica das Arial, Times New Roman e Courier New.
Uma grande ajuda, que vocês podem conferir aqui: https://www.redhat.com/promo/fonts/