artigo

HTML Unifier

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: 

Personalizando a ISO do Trisquel

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: 

Super Smash Bros Brawl

Existem jogos que revolucionam, que criam tendência. A Nintendo é fera nisso. Se você analisar bem, mesmo o Nintendo 64 não tendo sido o sucesso que poderia (a velha história dos Cartuchos X CDs, da entrada da Sony, etc), ele deixou um legado que não tem preço. Um exemplo é a mecânica de aventura tridimensional de The Legend of Zelda: Ocarina of Time. Outro é Super Smash Bros.

A ideia foi bem infantil: vamos juntar os personagens da Nintendo - de diversos jogos - em um só jogo de pancadaria! Por que infantil? Porque uma criança normal não se importa que o Mario, o Ben 10, o Batman e Bob Esponja não existam em um mesmo mundo. Se ela tem bonequinho dos quatro, ela brinca de boa com os quatro numa história só! Então no Super Smash Bros temos personagens tão distantes quanto Mario, Pikachu e Link, lutando em cenários dos vários jogos de seus próprios mundos.

Como algo infantil, o jogo teria que trazer uma mecânica bacana, se levando menos a sério do que os jogos de luta habituais. Tinha que ser divertido. Então vamos rever os golpes. Pra que aquelas combinações malucas de girar o direcional até a morte e apertar vários botões? De que controles um jogo de luta precisa? Resposta: movimento, pulo, agachar, agarrar, defesa, golpe simples e golpe especial. Só. Em Super Smash Bros, há dois botões de golpes: um para golpe simples outro para especial. Se o botão é apertado quando o personagem está no ar ou em combinação com alguma direção (direcional para baixo, para frente ou para cima), um novo golpe aparece. Todos os personagens funcionam assim, mudando apenas os golpes (principalmente os especiais). Isso simplifica muito as coisas.

Uma das coisas mais divertidas em jogos como Mario são as famosas Power-ups, os itens. Então por que não botá-los no jogo também? Feito! Você encontra desde cogumelos até pistolas laser e sabres de luz, além da temível marreta (aquela que o Mario usava no Donkey Kong, lembra?). Ah, e tem o globo com o símbolo do jogo, a smash ball, que quando é quebrado libera um super-especial.

Não é divertido o bastante? Ah, então vamos colocar quatro lutadores de uma vez na tela, na maior pancadaria! Bagunçado e divertido! Ah, mas quando a gente perder vai ter que esperar a luta acabar pra jogar de novo... Não! A contagem não é feita com uma barra de vida como nos jogos de luta tradicionais, mas com uma porcentagem que aumenta a cada golpe recebido (é como se fosse a chance de você voar/perder-uma-vida em um único golpe). Quando você perde, você é arremessado para longe do cenário e reaparece no centro. Ganha quem arrancou mais vidas de adversários. Simples e sem filas de espera.

Parece bacana? E se eu disser que esses elementos estavam no primeiro Super Smash Bros, ainda para Nitnendo 64?

O Super Smash Bros Brawl, terceiro jogo da franquia, consegue ser ainda mais incrível. Além do visual excelente (Wii não é full-HD, mas o jogo é muito bonito), há muitos lutadores e muitos troféus e prêmios na forma de músicas de trilha sonora de uma infinidade de jogos. Temos o treinador pokémon, que joga com Bulbasauro, Wartortle e Charizard; temos os lutadores Pikachu e Lucario; temos Fox e Falcon do Starfox; Zelda, Link, Olimar (Pikimin)... Temos o divertidíssimo Mr Game & Watch! E os convidados especiais Snake (Metal Gear Solid) e Sonic! Esqueci algum? Com certeza! A lista de lutadores é enorme.

Tá, mas ainda não acabou! No Brawl, a Nintendo provou que sua mecânica de combates funciona muito bem no estilo Beat 'em up. O modo história do jogo é bem longo e, como todo o restante, divertido pra caramba! Permite dois jogadores nesse modo. A história é intercalada por cutscenes curtas, narrando muito bem a história sem qualquer diálogo! Nenhum texto. Bastam expressões corporais e gestos dos personagens para ficarmos por dentro de todos os acontecimentos e vibrarmos com o enredo feito por Kazushige Nojima, escritor da série Final Fantasy.

É, não preciso dizer que esse jogo é indispensável para quem tem um Wii. Enquanto a Sony mais uma vez copia a Nintendo, com seu All Star Battle Royale, acredito que todos os que jogaram o Super Smash Bros Brawl estão ansiosos para ver o que a empresa do Mario está aprontando para trazer a franquia pro 3DS e o Wii U. Resta aguardar.

O jogo está por 29.50 dólares no eStarland.

Special: 

Truque para Firefox: abras abas nuff naum!

O Firefox (ou Abrowser ou Iceweasel ou...) é um navegador legal, mas há uma coisa nele que me incomoda um pouco: o lance de abrir novas abas ao lado da atual. Isso tem suas vantagens, por agrupar melhor as abas por assunto, mas eu me acostumei a trabalhar com "filas de abas" ao invés disso.

Oh, e agora quem poderá nos defender? O about:config!

Se você tem esse mesmo "problema", a solução é bem simples:

  1. Abra uma nova aba, digite about:config e dê Enter;
  2. Diga ao Firefox que você sabe o que está fazendo e que não vai fazer nenhuma besteira (e é bom não fazer mesmo);
  3. Na opção de procura da tela que vai abrir digite browser.tabs.insertRelatedAfterCurrent
  4. Basta dar um duplo clique na opção com esse nome que você procurou e ela vai verter de True para False.
  5. Pronto! Abra novas abas à vontade  a partir de links para testar! Comigo funcionou.

Foto usada no post: Magician, de - luz -.

Special: 

Blogópolis #37

Illumiroom

Todos sabem como a Sony vai mal das pernas quando o assunto são videogames portáteis. O PSVita vem perdendo para o 3DS desde que nasceu e não há exatamente perspecitvas de melhora (exceto no otimismo da própria Sony). Então veio a notícia de que a NVidia iria lançar um videogame portátil com Android e capaz de rodar jogos do Steam. Imagine: todos os jogadores atuais que tem conta no Steam poderão comprar o portátil e continuar jogando seus jogos sem gastos adicionais (já que a Steam permite instalação em outra máquina)! Aí que a vaca vai mesmo pro brejo...

No mundo dos consoles, temos algumas outras turbulências para a empresa de Kratos. Primeiro, o Wii assustou. Assustou tanto que a Sony resolveu lançar um pirulito azul para evitar perder mercado para a Nintendo. Claro, com o tempo o medo passou e o Wii terminou quase sufocado pelos diversos títulos em alta definição para Playstation 3 e Xbox 360. Mas então veio o Wii U, com seu Game Pad, um controle que inclui uma tela sensível ao toque. De novo, o medo da Sony respondeu rápido: anunciaram que não era tão inovador assim, que o Playstation 3 poderia ser usado em conjunto com o PSVita para atingir o mesmo efeito. Quem eles querem enganar? Qual PSVita vai se integrar? O que é caro pra caramba e vende quase nada? Não bastasse isso, o Wii U tem mais poder gráfico que os consoles concorrentes atuais e, sim, a despeito do que a Sony diz, o Game Pad é inovador, trazendo muitas novas e incríveis possibilidades para os jogadores.

O tempo vai passar e o Wii U vai ganhar mercado. Não deve engolir a Sony, pelo menos não tão rápido, mas... Quem vem ali? Ah, a Steam! A Valve apresentou modelos de console de mesa para a boa Steam. A mesma tentação para os jogadores de PC... E o Android não para por aí. Já, já, chega o Ouya, projeto financiado (com louvor)  socialmente via Kickstarter. E com a promessa de ser totamente Free to Play.

A Sony esperneia, anuncia que o Playstation 4 está mais perto do que todos pensam, vende um prédio de 25 andares e...

Pois é, quem vai esmagar todo mundo na próxima geração não parece ser a Nintendo (mais uma vez) e eu não colocaria minhas fichas na Sony. Apesar de o Wii U ser meu sonho de consumo, o que acredito que vai dominar a próxima geração de games será o próximo Xbox (720?). Por quê? Vamos por partes.

Fato 1: o Kinect foi uma boa ideia. Teve seus defeitos e isso foi bom para eles poderem aperfeiçoar mais o produto. O fato de a base instalada não ser tão expressiva diminui os jogos feitos para ele. Ao que tudo indica, o próximo console da Microsoft virá com o Kinect já de fábrica. Imagine: a tecnologia agora melhorada e sem desculpas para que os fabricantes de jogos não a usem.

Fato 2: eis que surge o Illumiroom! Um projetor que age junto com o Kinect e projeta imagem no ambiente onde você está, aumentando ainda mais a imersão no jogo. Se o Wii U em alguns jogos permite que se jogue sem a TV, só com o Game Pad, o próximo console da Microsoft pode tornar isso possível com o Illumiroom. Como dizem mesmo? A Nintendo cria, a Microsoft melhora...

A próxima geração já chegou (com o Wii U), e logo logo o circo vai pegar fogo! Fiquemos de olho!

Há 3 anos, a turma de Zand andava por corredores montanhosos, se aproximando do fim de Escarlate.

Direto do @carlisson no Identica:

  • Vocês viram o tal Illumiroom? O próximo console da MS vai ser um monstro. Se não bastasse o kinect vir default... http://ur1.ca/chufp
  • Amanhã de manhã termina a enquete. Você já votou na próxima série do Bardo WS? http://ur1.ca/cdiym

Tirinhas, posts e podcasts dos últimos dias

Talco e Show - Como me sinto...
http://www.talcoeshow.com/2013/01/como-me-sinto.html

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

http://www.umsabadoqualquer.com/1003-rpg/

http://www.pensadorlouco.com/2013/01/o-zumbi-zombie.html

http://mentirinhas.com.br/audazes-1/

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

Frameworks PHP da Década de 2010

O PHP já foi a linguagem mais usada para aplicações web. Mesmo com todo o sucesso e crescimento de Java, Ruby e Python, creio que muitos ainda sejam dependentes da boa e velha derivada do Perl.

Também é sabido que a cultura de framework em PHP não existia, quando Ruby se tornou popular. Juntando-se a grande quantidade de desenvolvedores com a falta de direção e um desejo de "se modernizar", aconteceu um fenômeno: uma infinidade de projetos foram criados. Quase todos partindo de um mesmo objetivo: criar um framework MVC.

O tempo passou e muitos não resistiram. Fiz uma pesquisa, que compartilho com vocês, dos frameworks PHP que estão ativos na nossa década atual. Para entender melhor o critério, dizendo de uma maneira bem simples: projetos que tiveram release de 2010 para cá.

Espero que aproveitem!

FrameworkVersão mais recenteÚltimo lançamento emLicençaDetalhes
Adventure1.62012GNU LGPL 
Agile4.2.32012GNU AGPL 
Alloy0.7.4 Beta2011BSD 
ATK6.5.02010GNU LGPL 
Bitweaver3.12012GNU LGPLFramework e CMS
CakePHP2.2.52013MIT 
CodeIgniter2.1.32012Licença própria (software livre) 
Halo0.0.22010BSD 
Horde5.0.32013GNU GPL/LGPL 
IrisMVC2.0 RC2011Nova BSD 
Jelix1.4.22012GNU LGPL 
Kohana3.3.02013BSD 
MiMViC0.9.92010MIT 
MochiPHP0.22011Apache 
Nette2.0.82013Nova BSD / GNU GPL 
P4A3.8.42011GNU LGPLBaseado no Zend
Pronto0.62010MIT / GNU GPL 
Qcodo0.4.222011Licença própria (software livre) 
Raxan1.02011GNU GPL / MIT 
Solar1.1.22010Nova BSD 
Symfony2.2.0 Beta2013MITDrupal 8 usa seus componentes
Thin PHP0.562012MIT 
Yii1.1.132012BSD 
Zend2.0.62012Nova BSDMVC
HTML5

E você? Ainda programa em PHP? O que você usa?

Special: 

Livros Digitais com o FBReader

FBReader mostrando a última edição do CyanZine

O formato ePub foi criado especificamente para livros digitais. Internamente ele parece HTML, mas incorpora certas características próprias dos livros, como quebra de página.

Claro que o ePub não é o único formato para isso, há vários outros, incluindo o próprio PDF, mas se você tentar ler a Revista Espírito Livre, por exemplo, numa tela de 3 polegadas, vai entender o porque de termos um formato próprio pra livros. O texto de um ePub é fluido, adaptando-se à tela do dispositivo utilizado para ler. Não é, também, só o ePub que faz isso, mas ele é o formato mais popular nessa linha. E é um formato aberto (apesar do ponto negativo de suportar DRM).

Pois bem, creio que todo dispositivo para leitura de livros digitais de hoje em dia (ebook readers) tenha suporte a ePub naturalmente. E há softwares para os dispositivos de uso geral. FBReader é um deles.

O FBReader suporta outros formatos além do ePub, e está disponível para diversos dispositivos: para Android, MacOS X, Windows, Linux, Blackberry e diversas outras plataformas móveis.

Além de ser eficiente no trato com os livros digitais, o FBReader tem um recurso de acesso a algumas bibliotecas de livros digitais sob domínio público. Infelizmente não encontrei muitas opções em nossa língua.

Você também pode personalizar sua experiência de leitor, definindo fonte, tamanho e cores, para que a leitura fique o mais adaptado possível ao seu gosto.

Se você tem Android, o FBReader é fácil de achar no FDroid. Se usa GNU/Linux, provavelmente haverá um pacote fbreader nos repositórios oficiais. Se usa outra plataforma, pode baixar lá no site do projeto. O FBReader também é distribuído junto com o CyanPack.

Special: 

Um tutorial passo a passo para SQLite em Python

Se você não tem nada a ver com programação, nem tem interesse no assunto, simplesmente ignore este artigo.


Mike Driscoll tem um blog dedicado a Python chamado The Mouse vs. the Python e eventualmente há excelentes artigos por lá.
Esta é uma tradução livre do artigo Python: A Simple Step-by-Step SQLite Tutorial e modifiquei sutilmente algumas coisas, incluindo os exemplos. Agradeço ao Mike pelos excelentes artigos e me desculpo pelas liberdades que tomei na tradução (incluindo a mudança no nome do artigo). Vamos a ele!


SQLite é uma engine de banco de dados transacional autocontida que dispensa servidor e configuração. Python ganhou o módulo sqlite3 desde a versão 2.5, o que significa que você pode criar bancos de dados SQLite em qualquer Python, sem precisar baixar qualquer dependência adicional. A Mozilla usa bancos de dados SQLite para o Firefox armazenar marcadores e outras informações. Neste artigo, você aprenderá:

  • Como criar um banco de dados SQLite
  • Como inserir dados em uma tabela
  • Como editar os dados
  • Como deletar os dados
  • Consultas básicas de SQL

Este artigo será similar em função ao recente SQLAlchemy tutorial, que apareceu no site The Mouse vs. the Python um mês desses. Se você quiser inspecionar seus bancos de dados visualmente, você pode usar o plugin SQLite Manager para Firefox, ou se preferir pode partir para a linha de comando shell do SQLite.

Como criar um banco de dados e inserir qualquer coisa

Criar um banco de dados no SQLite é realmente muito simples, mas o processo requer que você conheça um pouco de SQL. Aqui está o código para criar um banco de dados de gerenciamento de albuns musicais:
import sqlite3

conn = sqlite3.connect(
"mydatabase.db") # ou use :memory: para botá-lo na memória RAM

cursor = conn.cursor()

# cria uma tabela
cursor.execute("""CREATE TABLE albums
                 (title text, artist text, release_date text,
                  publisher text, media_type text)
              """
)
Antes de mais nada, precisamos importar a biblioteca sqlite3 e criar uma conexão com o banco de dados. Você pode passar para ele um caminho para o arquivo, o nome do arquivo ou usar simplesmente a string especial “:memory:” e criar um banco de dados na memória. No nosso caso, criamos um arquivo no disco chamado mydatabase.db. Em seguida, criamos um objeto cursos, que lhe permite interagir com o banco de dados e adicionar registro, entre outras coisas. Usamos aqui a sintaxe SQL para criar uma tabela chamada albums e contendo 5 campos de texto: title, artist, release_date, publisher e media_type. SQLite só suporta cinco tipos de dados: null, integer, real, text and blob. Vamos agora fazer o código para inserir alguns dados na tabela!
# insere alguns dados
cursor.execute("INSERT INTO albums VALUES ('Glow', 'Andy Hunter', '7/24/2012', 'Xplore Records', 'MP3')")

# salva dados no banco
conn.commit()

# insere múltiplos registros de uma só vez usando o método "?", que é mais seguro
albums = [('Exodus', 'Andy Hunter', '7/9/2002', 'Sparrow Records', 'CD'),
         (
'Until We Have Faces', 'Red', '2/1/2011', 'Essential Records', 'CD'),
         (
'The End is Where We Begin', 'Thousand Foot Krutch', '4/17/2012', 'TFKmusic', 'CD'),
         (
'The Good Life', 'Trip Lee', '4/10/2012', 'Reach Records', 'CD')]
cursor.executemany(
"INSERT INTO albums VALUES (?,?,?,?,?)", albums)
conn.commit()

Aqui usamos o comando INSERT INTO, do SQL, para inserir um registro dentro do banco de dados. Note que cada item tem que estar envolto entre aspas simples. Isso pode ficar complicado quando você precisar inserir strings já com aspas simples incluídas. De qualquer forma, para salvar o registro no banco, nós chamamos o commit. O código que vem em seguida mostra como adicionar múltiplos registros de uma só vez usando o método executemany do cursor. Note que usamos a interrogação (?) ao invés da substituição de string (%s) para inserir valores. Usar a substituição de strings NÃO é seguro e não deve ser usado, pois pode permitir ataques de SQL injection. O método da interrogação é muito melhor e usando o SQLAlchemy é sempre melhor, pois ele faz todo o tratamento para você, e você não precisará se preocupar em converter aspas simples em algo que o SQLite aceite.

Atuializando e deletando registros

Estar apto a atualizar seus registros no banco de dados é a chave para manter seus dados nos conformes. Se você não atualizar, seus dados se tornarão rapidamente obsoletos e sem utilidade. Algumas vezes você também desejará deletar linhas dos seus dados. Cobriremos esses dois tópicos nesta sessão. Primeiro, hora de atualizar!
import sqlite3

conn = sqlite3.connect(
"mydatabase.db")
cursor = conn.cursor()

sql =
"""
UPDATE albums
SET artist = 'John Doe'
WHERE artist = 'Andy Hunter'
"""

cursor.execute(sql)
conn.commit()

Aqui usamos o comando UPDATE do SQL para atualizar nossa tabela albums. Você pode usar SET para mudar um campo, neste caso mudamos o campo artista para ser “John Doe” em qualquer registro onde o campo artist era “Andy Hunter”. Não é fácil? Note que se você não confirmar as mudanças com o commit, suas mudanças não serão escritas no banco de dados e não terão efeito. O comando DELETE é simples também. Vamos a ele!
import sqlite3

conn = sqlite3.connect(
"mydatabase.db")
cursor = conn.cursor()

sql =
"""
DELETE FROM albums
WHERE artist = 'John Doe'
"""

cursor.execute(sql)
conn.commit()

Deletar chega a ser mais fácil do que atualizar. O SQL só tem 2 linhas! Neste caso, tudo o que temos que fazer é dizer pro SQLite de que tabela deletar (albums) e quais registros deletar, usando a cláusula WHERE. O comando do exemplo apaga todo e qualquer registro que tenha “John Doe” no campo artist.

Consultas básicas do SQLite

Consultas no SQLite são basicamente as mesmas que você usa para outros bancos de dados, como o MySQL ou o Postgres. Basta você usar a sintaxe SQL normal para elaborar as consultas e executá-las com o cursor. Aqui estão alguns exemplos:
import sqlite3

conn = sqlite3.connect(
"mydatabase.db")
#conn.row_factory = sqlite3.Row
cursor = conn.cursor()

sql =
"SELECT * FROM albums WHERE artist=?"
cursor.execute(sql, [("Red")])
print cursor.fetchall()  # ou use fetchone()

print "\nAqui a lista de todos os registros na tabela:\n"
for row in cursor.execute("SELECT rowid, * FROM albums ORDER BY artist"):
   
print row

print "\nResultados de uma consulta com LIKE:\n"
sql = """
SELECT * FROM albums
WHERE title LIKE 'The%'"""

cursor.execute(sql)
print cursor.fetchall()

A primeira consulta que executamos é um SELECT * , o que significa que estamos buscando todos os campos, e buscamos todos os registros cujo nome do artista (campo artist) bata com o que informamos - no nosso caso, “Red”. Em seguida, executamos o SQL e usamos fetchall() para pegar todos os resultados. Você também pode usar fetchone() para pegar o apenas primeiro resultado. Você também notará que há uma sessão comentada relacionada com um misterioso row_factory. Se você descomentar aquela linha, os resultados serão retornados como objetos Row, que são como os dicionários do Python. Entretanto, você não pode fazer associação de item com um objeto Row.

A segunda consulta é bem parecida com a primeira, mas retorna os registros ordenados pelo nome do artista, em ordem ascendente. Esse código também demonstra como podemos percorrer o resultado executando ações. A última consulta mostra como usar o comando LIDE do SQL para buscar frases parciais.Neste caso, fizemos uma busca pela tabela por títulos que comecem com "The". O sinal de porcentagem (%) é o operador coringa.

Pra terminar

Agora você sabe como usar o Python para criar um banco de dados SQLite. Você também pode criar, atualizar e deletar registros, bem como executar consultas em seu banco de dados. Vá em frente e comece a fazer seus próprios bancos / ou compartilhe suas experiências nos comentários!

P. S.: Foto usada no post: water moccassin (poisonous) or western hognose (not poisonous), de Bikes And Books.

Special: 

Star Wars: The Force Unleashed (o jogo)

Star Wars: The Force Unleashed

Star Wars: The Force Unleashed foi lançado em 2008 e traz uma história paralela ao que vemos nas trilogias. Darth Vader recruta secretamente um órfão, filho de um jedi, que se torna o Starkiller. É com ele que você joga.

Quer dizer, existe um prólogo antes de você realmente mergulhar no jogo. No prólogo, você joga com o próprio Darth Vader! Isso por si só já vale o jogo.

O cenário é bacana e a história é muito boa também. Apesar de haver muitas diferenças, o jogo me lembrou um bocado God of War. Talvez pelas peculiaridades gênero: é um jogo de aventura (tipo plataforma 3D), com traços de RPG (ganhamos experiência, que gastamos para desenvolver e aperfeiçoar certas habilidades) e há momentos resolvidos com quick time event (a cena vai acontecendo e parando pra você apertar um botão em pouco tempo ou algo assim).

O jogo foi lançado para um monte de plataformas: iOS, MacOS X, Nintendo DS, Nintendo Wii, PlayStation 2, PlayStation 3, PSP, Xbox 360, Windows e alguns outros mais (os de console podem ser comprados na eStarland). Tive oportunidade de conhecer a versão Wii.

Uma coisa interessante na versão Wii é que foi nesses quick time events que eu descobri que o numchuck também tem um sensor de inclinação relativamente preciso.

Apesar de o cenário não ser tão interativo assim, há muitos elementos espalhados sobre os quais Starkiller pode usar a Força. Ele pode levantar pedras, peças e até inimigos. Habilidades extra incluem uma explosão de choque partindo do personagem, uma onda de choque, choque elétrico e arremesso do sabre de luz.

Enfim, é um jogo que vale a pena. Depois dele, ainda foi lançado - em 2010 - The Force Unleashed II. Esse ainda não tenho, mas já está na minha lista.

Special: 

Páginas

Subscribe to RSS - artigo

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll: cannot open shared object file: No such file or directory in Unknown on line 0