Mais um software com a mão do Sr. Linus Torvalds que começo a usar: git. Git é uma ferramenta para controle de versão. Ao contrario do CVS e SVN que usam repositórios centrados em servidores, git usa o conceito de controle distribuído.

Links:

Site do projeto

A tutorial introduction to git - esse é um bom tutorial para começar.

Controle distribuído básico para os que usaram Subversion a vida inteira

Como usava o Subversion até algumas semanas atrás, já vou avisando: isso é novo para min. A chave para entender é diference entre o modo git e svn é:

1. Cada cópia é um repositório. Isso mesmo, cada cópia tem seus próprios branchs (isso é uma das melhores vantagens, IMHO).

2. Quando se faz um commit, as alterações não vão para um servidor e sim para a cópia local (ele usa outro jeito de trabalhar com o público).

Se eu soubesse dessas coisas antes já teria começado a usar-lo mais cedo.

Exemplo de uso: repositório em pendrive

Apesar de ser um meio inusual e perigoso de carregar projetos, git facilitou muito a minha vida neste ponto. Passei a usar o princípio de Hollywood: “Você não liga para gente, nós ligamos para você”.

Invés de criar um repositório no pendrive e commitar nele de uma cópia local como vazia antes. Agora eu mando o repositório do pendrive pegar as alterações de um repositório local.

Isso facilita, pois fica mais seguro e fácil criar branchs. E caso sistema de arquivos do dispositivo fique inconsistente não perco tudo.

Diretório com as informações de controle

Usa só uma pasta com o nome “.git” na raiz do repositório. WOW!

Criando arquivos .tar ou .zip de um repositório

É possível criar pacotes compactados somente com arquivos sob controle de versão. Achei isso matador. Exemplos:

[ sourcecode language="sh"]

$git-archieve –format=tar –preifx=DirRaiz/ HEAD | gzip > proj.tar.gz
$git-archieve –format=zip –preifx=DirRaiz/ HEAD > proj.zip

[/sourcecode]

Hack: ODF + StringTemplate

Dezembro 27, 2007

Precisei fazer um gerador de relatório para um pequeno projeto, o problema que era algo muito bem formatado, com tabelas e fontes de diversos tipos, no início pensei em usar HTML + StringTemplate mas padrões abertos funcionam na prática.

Os arquivos ODF são pastas zipadas com conteúdos como imagens e arquivos xml que definem o documento. Mais especificamente o arquivo content.xml que define a formatação junto com o texto. Mas não foi nem nescessário saber as tags para o hack (Ok, gambiarra).

StringTemplate

StringTemplate é uma biblioteca para java. A funcionalidade dela é substituir em Strings os trechos demarcados previamente com outras Strings. Com um exemplo é mais fácil.


String message = "Ola $NAME$ e tchau $MESSAGE$.";

StringTemplate template = new StringTemplate(message);
template.setAttribute("NAME", "Renan careilhos");
template.setAttribute("MESSAGE", "e va para o inferno");

System.out.println(template.toString());

Imprime: Ola Renan calheiros e tchau e va para o inferno.Os trechos demarcados previamente, na terminologia da StringTemplate, são as palavras circuladas por ‘$’ e se chamam attributes.

ODF4J

ODF4J é uma biblioteca para java criada para ler pacotes ODF. Ela é mantida pelo projeto OpenOffice.

A Gambiarra

Como o texto e formatação de um arquivo ODT é um text/xml, então não precisamos nos dar o trabalho nem de sair do Writer, podemos colocar os atributos da StringTemplate ali mesmo. Tipo esse documento

Em baixo um trecho do projeto.


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import org.antlr.stringtemplate.StringTemplate;
import org.openoffice.odf.OdfPackage;
import org.openoffice.odf.OpenDocumentFactory;

public class OdtExamReportGenerator implements ExamReportGenerator {
    private StringTemplate odtTemplate;
    private OdfPackage odfPack;

    public OdtExamReportGenerator(File template) throws IOException {
//Abre o documento ODT
        odfPack = OpenDocumentFactory.load(template);

// Lê a o arquivo principal, content.xml, para um buffer auxiliar
        StringBuffer buffer = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(odfPack.getXMLInputStream("content.xml")));

        String line;
        while ( (line = reader.readLine()) != null ) {
            buffer.append(line);
        }

// Cria o template
        odtTemplate = new StringTemplate(buffer.toString());
    }

    public void generateReport(Exam exam, String filename) throws GeneratorException {
        try {
            odtTemplate.setAttribute("NOME", exam.getName());
            odtTemplate.setAttribute("TIPO", exam.getType());
            odtTemplate.setAttribute("NUMERO", exam.getNumber());

// O método store insere ou substitui no pacote ODF um arquivo, seguidos dos bytes e do tipo MIME text/xml
            odfPack.store("content.xml", odtTemplate.toString().getBytes(),"text/xml");

// Salva o pacote ODF.
            odfPack.save(filename);
        } catch (FileNotFoundException ex) {
            throw new GeneratorException(ex.getMessage(), ex);
        } catch (IOException ex) {
            throw new GeneratorException(ex.getMessage(), ex);
        }
    }
}

E por último…

Não testei com templates muito grandes, e além do mais, ODF gera bastante XML. Mas duvido que java não tenha peformance para analisar templates de relatórios do INPS.

Joguei no fim de semana OpenArena e pingus - sedentarismo³.

OpenArena

A ID tinha liberado engine do Quake III mas não o conteúdo do jogo, então uma comunidade desenvolveu um pacote de mapas GPLeados, você nem prescisa do jogo original . É só abaixar e jogar. Algumas distribuições tem nos seus repositórios. Instalei usando a Mandriva 2008.

Estamos falando de Quake: Sem historinhas, sem estratégia, só tiro e porrada. Todo o brilho e carnificina do modo multi-player estão no OpenArena.

Pingus

Clone do famoso lemmings. O jogo não oferece dificuldade nas fases default (o “Tutorial Island”) mas você pode jogar na fases beta. Para jogar as fases betas. Vá na shell e entre no diretório que foi instalado, na Mandriva 2008 ([Update]  A maioria da distros também tem o pingus em seus repositórios) foi /usr/share/games/pingus.

$cd /usr/share/games/pingus

$cd data

$pingus –level=<level_a_jogar>

Onde <level_a_jogar> é um arquivo .pingus. A pasta levels contém outras pasta contendo os arquivos de níveis.

Exemplos:

$pingus –level=levels/playable/stone1-marcotte.pingus

$pingus –level=levels/volcano/volcano5-grumbel.pingus