HTML Unifier

12 fev 2013

HTML Unifier

Hoje eu passarei para vocês um conhecimento proibido. Um conhecimento milenar e obscuro dos programadores web,  Uma técnica capaz de reverter o que na maioria dos casos são consideradas boas práticas no desenvolvimento web. Estou falando de Data URI.

Se você já criou alguma página web em HTML você sabe como imagens são adicionadas. Não só imagens, mas muitos arquivos são necessários para ajudar o HTML a compor a página que vemos. Folhas de estilo, javascript, videos... O Data URI Scheme foi criado para permitir embutir diretamente no código HTML um conteúdo que deveria estar separado em seu próprio arquivo.

Como assim? No normal, voocê tem uma imagem praia.jpg. Com Data URI nessa imagem, o arquivo não é mais necessário. A imagem é convertida para ASCII e incluida dentro do HTML, na tag que faz a imagem.

Andei vasculhando os editores de HTML livres e não achei nenhum que permitisse incluir uma imagem nesse modo. Nem Nvu/Kompozer/BlueGriphon, nem LibreOffice, nem os editores de código... Como disse no começo, a técnica é "proibida". Se você adiciona imagens diretamente no arquivo da página, toda aquela modularidade vai pro saco. O cache não poderá ser feito de maneira adequada, por exemplo.

Bom, então por que você quis fazer isso? Simples: precisei preparar email em HTML com imagens, de uma maneira legal, através de um serviço que não aceita anexos. E imagens hospedadas geralmente não são lidas por alguns clientes de email, que temem que haja fraudes ou sei lá o quê. Solução? Data URI.

Pesquisei e não encontrei uma solução para isso. Terminei tendo que criar uma. Assim, apresento o HTMLunifier, que escrevi em PHP CLI, usando DOM e DataURI. Claro que você sabia que o PHP pode ser usado pra fazer script que rode no shell, não é?

O que o HTMLunifier faz basicamente é abrir um arquivo HTML e substituir todas as imagens por Data URI. Por segurança, ele não substitui o arquivo, mas cria um novo com terminação -u.html.

Convertendo a imagem para Data URI

Este código eu peguei na página do criador da biblioteca DataURI para PHP, que utilizei. Claro, com algumas melhorias.

function image_to_html($imagefile) {
	if (preg_match("/.jp(e?)g$/i", $imagefile)) {
		$filetype = "image/jpg";
	} elseif (preg_match("/.png$/i", $imagefile)) {
		$filetype = "image/png";
	} else {
		return $imagefile;
	}
	$fileContents = file_get_contents($imagefile);

	if($fileContents != false) {
		$dataUri = new DataUri(
			$filetype,
			$fileContents,
			DataUri::ENCODING_BASE64
	);

	return $dataUri->toString();
}

O processo unificador

Já temos o método que converte imagem em Data URI. Agora precisamos varrer o HTML procurando pelas tags img. Isso é feito com o seguinte código:

function unify($f) {
	$fpath = dirname(realpath($f));
	$dom = new DomDocument();
	$dom->loadHTML(file_get_contents($f));
	$dom->preserveWhiteSpace = false; 
	$images = $dom->getElementsByTagName('img'); 
	foreach ($images as $img) {    
		$imgfile = $img->getAttribute('src');
		if (preg_match("/^http(s?):/i", $imgfile)) {
			$img->setAttribute('src', image_to_html($imgfile));
		} elseif (preg_match("/^file:/", $imgfile)) {
			$rimgfile = preg_replace('/^file:(\/+)/', '/', $imgfile);
			$img->setAttribute('src', image_to_html($rimgfile));
		} else {
			$rimgfile = "$fpath/$imgfile";
			$img->setAttribute('src', image_to_html($rimgfile));
		}
    } 
    $f2 = $fpath . "/" . basename($f, ".html") . "-u.html";
    $dom->save($f2);
}

Se o arquivo está com protocolor http, https ou file, o tratamento é diferente do endereçamento relativo. No fim, o novo arquivo é gerado.

O programa em si

Claro, temos as funções, agora é hora de escrever o programa que as use. Isso é simples e curto:

for ($i = 1; $i < sizeof($argv); $i++) {
	$f = $argv[$i];
	if (file_exists($f)) {
		print "I will transform $f.\n";
		unify($f);
	} else {
		print "File $f don't exists.\n";
	}
}

Corrigindo o Doctype

Isso por si já deve funcionar, mas "vai que"... Então também fiz um método-gambiarra que corrige o Doctype do arquivo novo:

function fix_doctype($f) {
	$af = file($f);
	print "fix\n";
	$sf = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" .
		"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
	foreach ($af as $s) {
		if (preg_match("/^\<\?xml/i", $s)) {
			print "achei xml\n";
		} elseif (preg_match("/^\<\!DOCTYPE/i", $s)) {
			print "achei doctype\n";
		} else {
			$sf .= "\n$s";
		}
	}
	file_put_contents($f, $sf);
}

Concluindo

Enfim, é isso. Espero que isso seja útil para você. Estou anexando neste artigo o código. Como não posso enviar PHP, estou enviando o código em TXT. Basta salvar renomeando o arquivo para tirar o ".txt" ou selecionar, copiar e colar num editor de textos. O arquivo precisa ser marcado como executável.

E lembre-se: você precisará do php5-cli (ou talvez não), do php-xml-algumacoisa (na dúvida dei apt-get install php-xml-*) e do DataURI.php (coloquei na mesma pasta do HTMLunifier). Muita sabedoria para usá-lo e bom proveito!

Special: 

Intervenção (1.1)

11 fev 2013

No espaço vazio disperso
Nas trevas largada esquecida
Mais uma estrela do universo
Mais um astro que espalha vida

Por trás de uma massa de terra
Surge uma imensa serpente
A pobre estrela então berra
À água que vem da sua frente

A chuva cada vez mais perto
Parece que será o fim
A estrela já teme o fim certo

Mas um brilho belo se fez
- Um nascer do Sol no deserto -
E a chuva não vence essa vez

-- Cárlisson Galdino

Special: 

Sub10 (-1)

10 fev 2013

Só uma nota rápida. Não sei se sobrou muito estoque de Natal, se os preços estão naturalmente 11% acima do que deveriam, mas tem alguns sites brasileiros que estão há um bom tempo oferecendo 10% de desconto.

Claro, isso é ótimo! Descontos são sempre bem-vindos! O curioso que achei foi a apelação recente do Submarino, que recebi por email, tentando convencer seus clientes de que 10% são um bom desconto. Deem uma olhada na imagem e digam se não parece que querem fazer as pessoas de besta.

Esses 10% não são novidade, são os mesmos das outras semanas. A novidade é o truque de notação, apelando até para o velho "$Preço-1". Lembra? Aquilo de diminuir o preço em R$ 1,00, pra termos um número cheio de noves, mas com o primeiro número uma unidade menor. Bem, aposto como alguém deve ter ido na onda e comprado por puro impulso. Fico curioso com o resultado prático dessa artimanha. Pena que não tenho como ter acesso a essa informação. Que povo malandro, hein!

Warning Zone #41 - No Hospital

9 fev 2013

Warning Zone #41 - No Hospital

No episódio anterior, foi apresentado um resumo de tudo o que aconteceu até hoje em Warning Zone. Nele, o Grupo Satã planejava sequestrar o prefeito de Stringtown.

No quarto de um hospital, Darrel aguarda que Pandora desperte. A televisão ligada na novela.

A bala que atingiu a Stormdancer felizmente não causou muito estrago, mas o médico pediu sua internação por cautela.

Pandora: Oi?

Darrel: Oi, amor. Acordou! Como se sente?

Pandora: Ah... Normal, eu acho. Só tou cansadinha.

Darrel: Que bom. Vamos ter que melhorar nosso equipamento. Desse jeito não dá certo.

Pandora: Ai, queria ir pra casa... Queria que esse pesadelo todo terminasse...

Darrel: Não chore... Você sabe que poderíamos ir pra casa e esquecer isso tudo a qualquer momento, não sabe?

Pandora: Sei, mas com grande poderes vem grandes responsabilidades, não é isso que você vai dizer? Do filme do Homem-Aranha?

Darrel sorri para ela, já perto da cama.

Darrel: Fiquei muito preocupado com você. Pensei em muita coisa esse tempo todo.

Pandora: Pensou em desistir e deixar o Oliver dominar o mundo?

Darrel: Pensei. Mas não temos pra onde fugir. Nós estamos presos nisso tudo. Se a gente fugir, a destruição que o Oliver tá causando vai acabar chegando até nós.

Pandora: Mas e o Exército?

Darrel: Não sei. Não passou nada na TV ainda, e eu não ia querer deixar você sozinha, não é?

Pandora: Ô... Ei, e o Júnior?

Darrel: Foi pra casa.

Pandora: Tem que estudar, não é? Sorte a dele. Queria ir pra casa também. Pra nossa casinha.

Os dois se assustam com a vinheta do Plantão Urgente, que aparece na Televisão.

Apresentador: Após conseguir escapar do cerco organizado pelo Exército, o Quarteto Fantástico de Stringtown conseguiu sequestrar o prefeito Steve Silva. Não se sabe ainda quais as reinvindicações do grupo. Vejam mais detalhes logo mais no Jornal da Noite. Mais notícias a qualquer momento.

Darrel: Eles derrotaram o Exército...

Pandora: Como a gente vai parar esse bando, bem?

Darrel: Ainda não sei, mas temos que descobrir.

Darrel olha para Pandora preocupado.

Pandora: Eu queria estar bem pra gente dar um jeito nisso, mas não é pra eu sair daqui agora.

Darrel: É, o médico ainda não deu alta.

Pandora: Olha, se quiser ir ver como está o prefeito, pode ir. Só não vá enfrentar Oliver sozinho, pelo amor de Deus!

Darrel: Não vou deixar você aqui sozinha.

Pandora: Ah, meu dengo... Na verdade eu ia deixar você ir, mas meio sem querer, sabe? Queria não mesmo ficar sozinha.

Darrel a beija e acaricia seus cabelos por um momento, então volta a se sentar.

Comercial: Hoje, no Talk & Show da TV, temos uma entrevista com o ufólogo Cirius Spinaphry, para nos explicar de onde vem esses monstros que aterrorizam Stringtown. Não percam!.

Darrel: Amanhã você recebe alta.

Pandora: Então amanhã a gente vai atrás desses cabras.

Darrel: Pandora, é muito importante o que a gente está fazendo. Agora eles derrotaram o Exército! Mas não sei se quero correr de novo o risco de te perder,

Pandora: Ah, seu besta! Pior foi comigo, quando você sumiu lá no porto pra cochilar dentro da caixona! É só a gente ter cuidado. Nunca mais vamos entrar em tiroteio, e vamos evitar ao máximo ter que lutar com eles.

Darrel: Você tem razão.

Pandora: Podemos fazer uma luta indireta, com estratégias pra eles serem derrotados aos poucos.

Darrel: Tudo bem então. Amanhã a gente vai lá.

Pandora: O que será que eles querem com o Prefeito? Eles não são doidos de matar o pobre, né? Aí a casa ia cair mesmo pra eles.

Darrel: Sinceramente, nem sei. Não acho que eles queiram matá-lo, senão teriam matado ao invés de sequestrar. Sobre a casa cair, não por isso. A casa caiu pra eles foi hoje, e eles sobreviveram.

Pandora: Verdade...

A novela termina e os dois assistem ao Jornal da Noite.

Apresentador: Um grupo de super-vilões dos quadrinhos vem aterrorizando nossa cidade já há semanas. O grupo está sendo chamado na imprensa de Quarteto Fantástico de Stringtown. Hoje pela manhã o Exército entrou em operação para prendê-los.

Repórter: Boa parte do pólo tecnológico de Stringtown ficou interditada durante todo o dia. Policiais garantiam isolamento enquanto soldados do exército organizavam suas operações cercando o local onde acreditavam se encontrar os super-criminosos.

Apresentador: Mesmo com todo o esforço e com o uso de armamentos pesados, o Exército não conseguiu prender nenhum dos supercriminosos. O número exato das baixas sofridas pelas Forças Armadas ainda não foi divulgado. Após esse incrível e assustador incidente, o Quarteto Fantástico de Stringtown decidiu agir novamente e sequestrou o prefeito da cidade, Steve Silva.

Repórter: Aqui no gabinete as pessoas ainda estão em pânico. Ao que todos dizem, a ação foi rápida. Eles invadiram por aquela parede e levaram o prefeito sem qualquer cerimônia. Alguns dos seguranças tentaram reagir atirando, mas não conseguiram impedir o sequestro.

Apresentador: Se nem o Exército conseguiu pará-los, os seguranças que fugiram da cena não estão de todo errados. Até o momento o grupo não apresentou suas reivindicações. O pesquisador teólogo Lúcio Camp está aqui conosco para comentar os estranhos acontecimentos. Boa noite, Lúcio.

Lúcio: Boa noite. De fato, tudo isso que temos visto nas últimas semanas é um sinal do fim dos tempos. E é apenas o começo.

Apresentador: Você acredita que essas aberrações violentas são uma temdência?

Lúcio: Claro. Veja bem, com todo o desrespeito que o ser humano vem demonstrando para com Deus, e toda essa manipulação genética nos nossos alimentos, era inevitável que isso acontecesse.

Apresentador: Então você acredita que eles sofreram mutações alimentares?

Lúcio: Sim, é o que acredito e pra mim isso está muito óbvio. E os alimentos continuam sendo manipulados. Dessa forma o que vamos ter...

P. S.: Publicado inicialmente na Revista Espírito Livre #41.

Novas edições das revistas digitais

8 fev 2013

O novo jogo de RPG estratégico Fire Emblem: Awakening ilustra a capa da edição 40 da Revista Nintendo Blast. Uma viagem no tempo inicia a apresentação da Intelligent Systems e de outros jodos não só da franquia Fire Emblem, como de outros jogos de estratégia (Nintendo Wars, por exemplo). Uma boa seleção de "melhores jogos" do Wiiware fecha a edição da revista com chave de ouro.

Também já estão no ar outras revistas:

  • Revista PlayStation Blast #8 - Tema de capa é Metal Gear Solid Revengeance. Destaque para o Top 10 dos jogos mais esperados para 2013 na plataforma da Sony.
  • Revista Espírito Livre #41 - Este mês o Blender é quem manda. Vários artigos girando em torno desse excelente software livre para modelagem 3D (na verdade, para bem mais que isso).  Nesta edição, Warning Zone #41 - No Hospital (apesar de o índice dizer que é o episódio 40).
  • FOSSGIS Brasil #6 - Matéria de capa: Desenvolvimento SIG - Um novo mundo sendo descoberto.

As quatro também já estão lá na Banca do Bardo.

Special: 

Naruto Shippuden Clash bla-bla-bla III (Wii)

7 fev 2013

Mais um jogo de luta envolvendo personagens de anime. Este pode ser um começo da definição da franquia Naruto Shippuden: Clash of Ninja. Sério, por que jogos de anime tem que enveredar tantas vezes para jogos de luta?

Eu não tinha ainda nenhum jogo de luta para Wii quando adquiri o terceiro dessa franquia via eStarland. Joguei um pouco, achei interessante e deixei na gaveta. Tempos depois voltei a ele para analisá-lo melhor.

O jogo tem um gráfico estilo "anime em 3D", que é relativamente agradável. As lutas são bem dinâmicas e a motivação para continuar jogando está nas recompensas em "dinheiro virtual", utilizado para desbloquear personagens e coisas do tipo.

A mecânica do jogo é bastante eficiente, inspirada na simplificação que o Super Smash Bros. trouxe ao mundo dos games de luta. Temos comandos simples para certas ações. Uma das diferenças está no timing, que em certos momentos determina também o tipo de ação que o personagem vai tomar. Outra coisa bacana que os dois jogos têm em comum é a flexibilidade no uso do controle: o Naruto Shippuden: Clash of Ninja Revolution III também pode ser jogado com o remote sozinho, remote + nunchuk, classic e joystick de Game Cube. Também permite até 4 jogadores. Apesar disso, os dois jogos são muito distintos, especialmente na dificuldade, estilo, mecânica, etc.

Não sei como vão os jogos de luta hoje, mas lembro do tempo em que algumas lutas começaram a ser em 3D. A mecânica era: você vê os jogadores lateralmente, mas quando um golpe é dado contra você, você pode dar um passinho de lado, girando o cenário e se esquivando do golpe. Apesar das críticas que existiam quanto a isso (não sei hoje), a mecânica funciona até bem. Claro que além de se esquivar desse jeito, você pode bloquear ou usar o jutso da substituição (o que tem a ver com o timing de que falei).

O modo história é interessante e traz um desafio a mais ao colocar objetivos distintos em cada luta, como lutas em que você terá que dar o golpe final usando um super especial. As lutas são intercaladas com narrativas de uma aventura que envolve um resgate a Gaara.

Outro ponto forte do jogo é jogar com ninjas de marionetes. Em especial, a Chiyo, que controla duas. A dinâmica da luta muda quando jogamos com ela. É meio louco, mas divertido.

Enfim, é um jogo que vale a pena (especialmente se você gosta de Naruto ou tem carência de jogos de luta na sua biblioteca do Wii) e está por menos de US$ 13 na eStarland!

Special: 

Blogópolis #40

6 fev 2013

Há 3 anos, Zand falava com Eve, a espada. Escarlate #46 - A Espera?

Direto do @carlisson no Identica:

  • Assine para impedir Renan Calheiros de se tornar presidente do Senado e manter os acusados de corrupção fora do poder http://ur1.ca/con6r
  • RT @pensadorlouco Não adianta, pessoas nasceram pra viverem sob controle. Se não for assim, como explicar Facebook, Microsoft e a recria ...
  • Mais um antigo soneto meu :-) RT @pensadorlouco Reflexão - http://t.co/CDwegSCL via @carlisson
  • @pensadorlouco obrigado :-)
  • RT @pensadorlouco 40 amazing 8-bit accessories and goods - http://is.gd/beqB7D
  • RT @pensadorlouco E então, um dia um fiodumaégua te chama pra botar em ordem uma empresa. Um ano depois que você cumpriu o prometido, ga ...
  • Valeu! \o/ Nunca + fiz um... RT @edsonlead @carlisson, gosto dos seus cordéis relacionado com a computação ^^ - muito legal - #SoftwareLivre
  • Legal! Feliz em saber. :-) RT @edsonlead @carlisson rsrs, esse seu trabalho foi comentado em uma palestra no Consegi 2012 em Belém-Pa ^^

Tirinhas, posts e podcasts dos últimos dias

Um Sábado Qualquer - Estatísticas
http://www.umsabadoqualquer.com/1016-estatisticas/

http://mentirinhas.com.br/aureolos-121/

http://www.talcoeshow.com/2013/02/vida-bandida.html

http://vidadeprogramador.com.br/2013/02/04/inacessivel/

http://capitaobrasil.com.br/capitao-brasil-061/

http://esbocais.com.br/mamu-le-fan/social/

Foto usada no post: Blue Screened, de RodBegbie.

Special: 

Personalizando a ISO do Trisquel

5 fev 2013

Este artigo começou como uma tradução do artigo Customizing a Trisquel iso, disponível na página do próprio Trisquel. Este artigo foi expandido com algumas informações do Live CD Customization, do Ubuntu, além de informações próprias.


Primeiramente, uma ISO é uma imagem de um CD ou DVD. Você pode pegar um CD ou DVD e transformar todo o seu conteúdo em um arquivo, para depois copiá-lo para outro CD ou DVD, tendo duas mídias exatamente iguais. Esse arquivo é que é o iso. Para gravar um iso você deve escolher a opção que fala de "Escrever imagem no disco" ou algo parecido, no seu programa de gravação de CD e DVD.

O CD e o DVD do Trisquel (assim como o do Ubuntu, do Mint e de outros, o que inclui o DVD do CyanPack) traz o sistema operacional de modo que funcionará a partir da mídia, sem precisar instalar. Adicionalmente, permitirá instalação. É algo bem bacana e que quem é usuário de software livre já conhece há alguns anos.

O bom é que você pode personalizar esse arquivo iso, para que venha com os programas que você quer. É o que eu faço para criar a versão modificada do Trisquel, que é distribuída no CyanPack em DVD. E neste artigo, vou mostrar pra você  como fazer isso.

Pré-requisitos

Primeiro você precisa de espaço em disco. Há dois estágios na criação do arquivo iso. Além da iso original, você precisará colocar todo o conteúdo dela em uma pasta, depois replicar o maior arquivo dela para uma outra pasta. E precisa do espaço que usará para a nova iso. Para a iso internacional do Trisquel, por exemplo, para mudanças pequenas, é seguro ter pelo menos 10G livres (sem contar a iso original).

Você precisa da iso na mesma arquitetura que você está usando. Vai poder customizar uma iso de 64 bits se estiver rodando o sistema atual em 64 bits. As imagens de mídia do Trisquel você encontra na página de Downloads do site da distribuição.

Ah, claro, você precisa de uma dessas distribuições instaladas para servir de ambiente de trabalho. Trisquel, Mint, Ubuntu... Ou alguma igualmente compatível. Nela, você precisa instalar os pacotes squashfs-tools e genisoimage.

sudo apt-get install squashfs-tools genisoimage

Desempacotando

Bom, você já tem o iso? Então vamos começar.

Abra um terminal. Os comandos todos deverão ser executados como usuário root. Para isso você pode digitar

sudo bash

Agora, você precisará de um diretório vazio. Se você não mexeu muito na sua instalação, provavelmente o diretório /mnt estará disponível. Se tiver dúvidas, crie e utilize um outro. Eu geralmente utilizo o /mnt mesmo e comigo funciona.

mount -o loop trisquel-original.iso /mnt
cp -a /mnt trisquel-midia
umount /mnt

Pronto, você tem o conteúdo da imagem todo em uma pasta (trisquel-midia). Vamos então pegar o conteúdo do sistema efetivamente, que fica no arquivo squashfs:

mount -o loop trisquel-midia/casper/filesystem.squashfs /mnt
cp -a /mnt trisquel-sistema
umount /mnt

A pasta trisquel-sistema é onde vamos trabalhar.

O arquivo Preseed

O Trisquel vem com um arquivo que permite a preleitura de valores para o banco debconf. Você pode achá-lo em src/preseed/trisquel.seed. O arquivo contém exemplos comentados do que você pode fazer, como mudar o idioma padrão, configurar rede estática ou instalar automagicamente um conjunto extra de pacotes antes de o processo de instalação do live-CD ser concluído (nesse caso você precisará de internet durante a instalação).

Se as mudanças e adaptações de que você precisa puderem ser feitas smplesmente alterando este arquivo, você não precisará seguir o próximo passo.

Bom, pessoalmente não usei ainda esse arquivo, mas #ficadica.

Modificando

Vamos começar a festa. O ambiente ainda não está 100% pronto, pois vamos completá-lo:

cp /etc/resolv.conf trisquel-sistema/etc
mount --bind /dev trisquel-sistema/dev
chroot trisquel-sistema
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts

Pronto! Agora sim podemos brincar pra valer! Comece com apt-get update e apt-get upgrade. Depois você instala tudo o que você precisar, com apt-get, e pode fazer as personalizações que achar necessárias (claro, tudo em linha de comando).

Quando encerrar tudo, você precisa executar

apt-get clean
echo "" > /etc/resolv.conf
umount /dev/pts
umount /sys
umount /proc || umount -lf /proc
exit
umount trisquel-sistema/dev

Caso você tenha substituido o kernel ou os scripts de boot, copie os arquivos do kernel e initrd dessaforma:

cp trisquel-sistema/boot/vmlinuz-custom trisquel-midia/isolinux/vmlinuz
cp trisquel-sistema/boot/initrd.img-custom trisquel-midia/isolinux/initrd

Reempacotando

Depois de as mudanças serem feitas, você precisa reconstruir o squashfs e o arquivo .iso.

Comprima o sistema em um arquivo squashfs, apagando o original:

rm trisquel-midia/casper/filesystem.squashfs
mksquashfs trisquel-sistema trisquel-midia/casper/filesystem.squashfs

Pra terminar, crie o arquivo de imagem:

mkisofs -D -r -V "Meu Trisquel personalizado" -cache-inodes \
-J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot \
-boot-load-size 4 -boot-info-table -o trisquel-personalizado.iso trisquel-midia

Deixe claro para todos que a versão que você está distribuindo não é uma imagem .iso oficial.

Por fim, no caso de personalizar o Trisquel eles pedem: se qualquer software não livre foi incluído, por favor renomeie seu projeto e não use o nosso logotipo.

P. S.: Foto do post: CDs Dangling, de Bernzilla

Special: 

Reflexão

4 fev 2013

E como as ondas que quebram ao forte
Mas sua força de novo levanta
Como um pássaro que se ergue e canta
Mesmo depois de quase ter sua morte

Tudo em nossas vidas que se repete
Como se fosse uma obra do acaso
Como em uma lagoa de nível raso
Em que qualquer força a água reflete

Ainda haverá uma nova fissão
Que todo o planeta irá transformar
Trazendo a todos mais pura aflição

É quando tudo nos querem tomar
Quando o princípio da reflexão
É refletido nas ondas do mar

-- Cárlisson Galdino

Páginas