Minha apresentação do git - El nuevo Software del Señor Torvalds
Fevereiro 6, 2008
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:
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.
Jogos livres - OpenArena e pingus
Dezembro 8, 2007
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