Configurando um repositório Subversion

Ultimamente tenho configurado alguns repositórios Subversion usando a seção Version Control System do Ubuntu Server Guide, que consiste de:

  1. Instalar o servidor: sudo apt-get install subversion libapache2-svn
  2. Criar um novo projeto: svnadmin create /var/svn-repos/projeto
  3. Criar um arquivo de senhas: htpasswd2 /etc/subversion/passwd user_name
  4. Editar /etc/apache2/apache2.conf acrescentando uma entrada para o repositório do novo projeto
     <Location /svn/projeto>
      DAV svn
      SVNPath /var/svn-repos/projeto
      AuthType Basic
      AuthName "Your repository name"
      AuthUserFile /etc/subversion/passwd
      <LimitExcept GET PROPFIND OPTIONS REPORT>
      Require valid-user
      </LimitExcept>
      </Location>
  5. Uma rápida reiniciada no apache com /etc/init.d/apache2 restart e pronto.

O problema é que eles esqueceram de incluir uma parte sobre como inicializar o repositório com uma estrutura decente, então é o seguinte:

cd /tmp
mkdir projeto
mkdir projeto/trunk
mkdir projeto/branches
mkdir projeto/tags
svn import /tmp/projeto file:///var/svn-repos/projeto/ -m “initial import”
chown -R www-data:subversion /var/svn-repos/projeto
rm /tmp/projeto -rf

Desnecessário dizer que tudo tem de ser feito no servidor como root (sudo -s).

O primeiro Autotools é inesquecível!

Depois de muitas e muitas baixadas de tar.gzês de terceiros, pra descompactar e dar ./configure ; make ; make install, usar autotools em meu próprio projeto dá uma sensação muito boa! Sou praticamente gente grande! =P

Mas tenho de admitir começar foi complicado, são muitas as informações, felizmente pude contar com este excelente tutorial:

Ele faz um progresso gradual, com boas explicações e exercícios. Uma pena que o exemplo com GTK+ esteja totalmente deprecated. Para compensar esse problema e tocar meu projeto, usei um ardil descarado: criei um projeto GTK+ chamado gtk-foo no Anjuta (apt-get install anjuta autogen), sem suporte a internacionalização, pra não complicar as coisas.

Copiei os arquivos autogen.sh e configure.in, Makefile.am, aclocal.m4 e src/Makefile.am de gtk-foo para logicparser. Além disso foi necessário criar os conhecidos arquivos README, NEWS, ChangeLog, etc, conforme manda a tradição. Também foi necessário copiar alguns scripts de /usr/share/automake-1.9 para o diretório do projeto: depcomp, install-sh e missing.

Depois disso alguns ajustes precisaram ser feitos, como em lp_app.h, por exemplo, que guardava a indicação de onde encontrar o arquivo lp_gui.glade, já que o make install deveria colocar o arquivo glade em /usr/local/share/logicparser/glade.

Como ficou o trecho do header lp_app.h:

// For testing propose use the local (not installed) glade file
//#define GLADE_FILE "lp_gui.glade"
#define GLADE_FILE PACKAGE_GLADE_DIR"/lp_gui.glade"

O macro PACKAGE_GLADE_DIR é setado pelo compilador e foi definido em src/Makefile.am:

gladedir = $(datadir)/logicparser/glade
glade_DATA = lp_gui.glade

INCLUDES = \

-DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
-DPACKAGE_SRC_DIR=\""$(srcdir)"\" \
-DPACKAGE_DATA_DIR=\""$(datadir)"\" \
-DPACKAGE_GLADE_DIR=\""$(gladedir)"\" \
$(PACKAGE_CFLAGS)

AM_CFLAGS =\

-Wall\
-g

bin_PROGRAMS = logicparser

logicparser_SOURCES = \

logicparser.c \
lp_app.c \
lp_graph.c \
lp_test.c \
logicparser.h \
lp_app.h \
lp_graph.h \
main.c

logicparser_LDFLAGS =

logicparser_LDADD = $(PACKAGE_LIBS)

EXTRA_DIST = $(glade_DATA)

O que mais gostei nesse início de uso do Autotools foi o make dist, que gera um logicparser-x.y.z.tar.gz. E por falar nele, podem baixar a última versão (0.4.2) na seção de Downloads: http://code.google.com/p/logicparser/downloads/list

Resta aprender como incluir suporte à internacionalização (provavelmente com ajuda do Anjuta :) e build para Win32. Mas agora chega, estou caindo de sono. Se interessou, veja o site do autotut mencionado acima.

Compilando LogicParser em Win32 com MinGW e MSYS

Minha primeira e emocionante compilação de algo que estava desenvolvendo no Linux no insalubre ambiente Win32. Primeiro o screenshot e depois a história:

LogicParser no Windows

O ambiente de build foi montado usando MinGW/MSYS/msysDTK e o GTK+/Win32 Development Environment. A primeira compilação deu errado, mas setei a variável de ambiente PKG_CONFIG_PATH para /c/temp/GTK/2.0/lib/pkgconfig e tudo correu muito bem, mais fácil do que esperava. Depois vou ver como compilar estático pra fazer um executável morbidamente obeso, mas muito conveniente.

A aba “Graph (Image)” não funciona pois não consegui instalar o GraphViz no computador do CIn pois não tenho privilégios de administrador. Pelo menos isso me ajudou a decidir usar o GraphViz via biblioteca em lugar de usar o g_spawn_sync da GLib para chamá-lo externamente. Além disso, pra esse negócio ficar mesmo cross-platform tenho de usar algumas funções utilitárias da GLib, como g_get_tmp_dir e coisas assim.

Referências úteis nessa empreitada:

LogicParser 0.4

Mais um release do LogicParser, agora a aba “Graph (Image)” é atualizada com imagem representando a árvore parseada da expressão lógica.

LogicParser 0.4

Duas funções muito boas da GLib me ajudaram:

  • g_file_set_contents: escreve todo conteúdo de uma string para um arquivo. Simples e rápida.
  • g_spawn_sync: dispara um processo de forma síncrona, para chamar o dot, do GraphViz.

Juntanto com outras facilidades da GLib, programar em C fica fácil demais. :P

Outra coisa muito útil era o Google Code Search, a referência da GLib é muito boa, mas às vezes você quer ver o código sendo usado, e o code search ajudou bastante. Por exemplo, a especificação do g_spawn_sync tem muitos parâmetros, assustadores numa primeira olhada. “Como devo setar esses parâmetros?” Como todo mundo! No código do eog que achei nessa busca: lang:c g_spawn_sync

Sobre o futuro, o código precisa de mais “polish” e certamente preciso aprender CMake ou Autotools pra fazer um build system de respeito e não meu seboso Makefile. Por ser um projeto pequeno, pode valer à pena aprender Autotools.

Lembrando:

Update: OMG! Agora o Google Hosting disponibiliza uma wiki! Vejam a minha: http://code.google.com/p/logicparser/wiki/LogicParser

Audiobooks

Se tem uma coisa que acho irritante é me deslocar (também odeio calor e verão, mas isso é só mais um fator cumulativo). Quase todo dia viajo 3 horas (ida e volta e meia hora na fila do ônibus) pra universidade, e às vezes mais 3 horas (ida e volta) pra o Espaço Ciência. Se eu tivesse um laptop podia fazer dos ônibus meu escritório e montar um negócio paralelo, mas não creio que eu fosse andar de ônibus com um laptop. ¬¬

Contudo!!! Há uma luz no fim do túnel! Ou melhor, um som: audiolivros! Já ouvi O Hobbit, O Senhor dos Anéis, e agora filosofia Grega, de Tales até Aristóteles.

Continuo não gostando de viajar de ônibus, mas agora sei que toda filosofia ocidental pode ser considerada comentários à respeito de Platão e Aristóteles, que os sofistas viraram advogados e que Sócrates continua o debate, ou melhor, o diálogo, com os neurocientistas pré-socraticos. Enfim, não há nada de novo sob o sol, que continua impiedoso no verão. ¬¬

Nota: Gostei particularmente desse grafo, feito com o GraphViz, das relações de influência entre os filósofos pré-socráticos.

LogicParser 0.2

Segundo release do LogicParser. Está sendo bem divertido voltar a programar em C, ainda mais com a GLib facilitando as coisas. No começo é estranho usar g_print no lugar de printf, e outras coisas, mas quando penso que boa parte da portabilidade estará garantida quando for compilar esse treco em Win32… :)

Neste release adicionei um componente para gerar grafos no no formato da linguagem DOT, processados pela ferramenta homônima do pacote GraphViz.

Aqui está uma expressão na sintaxe compreendida pelo LogicParser:

p1->(f | (!p3))

O grafo gerado:

digraph ParsedTree {
if_then_0 [label=if_then];
if_then_0 -> P1_1;
if_then_0 -> or_2;
P1_1 [label=P1];
or_2 [label=or];
or_2 -> False_3;
or_2 -> not_4;
False_3 [label=False];
not_4 [label=not];
not_4 -> P3_5;
P3_5 [label=P3];
}

A linha de invocação do dot, e a figura gerada:
dot -Tpng grafo.dot -o grafo.png

p1->(f | (!p3))

Além disso tudo está documentado na sintaxe do Doxygen.

Update: ah! O comando mágico para criar um tag no subversion:
svn copy https://logicparser.googlecode.com/svn/trunk \
https://logicparser.googlecode.com/svn/tags/release-0.2 \
-m "Release 0.2 of the 'LogicParser' project."

Apresentação sobre desenvolvimento em Linux

Um dos grupos da disciplina carinhosamente chamada de “Projetão”, que temos lá no Centro de Informática, resolveu usar a plataforma Maemo para o projeto deles. Como a maior parte da equipe havia tido pouco contato com Linux, fui convidado a fazer uma rápida explanação do ambiente de desenvolvimento Linux. Detalhes e a apresentação aqui.

Bom ver o pessoal do CIn usando plataformas Linux, mas uma pena que a infra-estrutura de lá não ajude em nada. Mas eles já pediram máquinas com Ubuntu ao suporte, veremos o que acontece.

LogicParser

Fiz o primeiro commit do LogicParser, um programinha que ‘parseia’ expressões lógicas do tipo “!(p1 -> ( p2 & p3))“, que comecei a fazer logo após quase ter desistido da cadeira de Lógica. No período seguinte o professor começou a pedir um projeto do tipo pra galera, embora eu nunca tenha mostrado pra ele. Originalmente tinha uma interface GTK+, mas resolvi fazer um refactor e também aprender coisas básicas sobre projetos de software livre, como, por exemplo, aqueles arquivos README, ChangeLog, etc.
Já fiz o primeiro release, contando com o parser e um exemplo que roda na linha de comando.
Os planos para o futuro são:

  • interface GTK+
  • build com o CMake
  • saída da árvore como PNG e SVG, com o GraphViz
  • internacionalização
  • atribuição de valores e avaliação de expressões (possivelmente 2.0)

Ainda estou definindo uma política de numeração de versões, por hora estabeleci objetivos que quero alcançar e atribuí uma versão para cada um. Fico em dúvida se mudanças menos visíveis ao usuário final, como passar a usar CMake, deveriam entrar como 0.x ou 0.x.y, ou seja, considerar como uma alteração menor.
Dois documentos me ajudaram:

Projeto LogicParser no Google Hosting: http://code.google.com/p/logicparser

Update: mudei de idéia sobre o CMake. Autotools ruleia.

VALIS

Essa é de um email perdido que mandei no meio desse ano numa conversa sobre “o Google estar ouvindo”.

Do livro de ficção científica Neverness[1], de David Zindell [2]:

There is an ecology of information. Stars will die; people and gods will die, but information is conserved. Macroscopic information decays to microscopic information. But microscopic information is eventually concentrated. Nothing is lost. Gods exist to devour information. The lower intelligences sort, filter, concentrate and organize information. And the gods feed.

Agora VALIS[3], de Philip K. Dick[4] (aquele de “Do Androids Dream of Electric Sheep?”[5], que inspirou Blade Runner):

Tractate 31:
We hypostatize information into objects. Rearrangement of objects is change in the content of the information; the message has changed. This is a language which we have lost the ability to read. We ourselves are a part of this language; changes in us are changes in the content of the information. We ourselves are information-rich; information enters us, is processed and is then projected outward once more, now in an altered form. We are not aware that we are doing this, that in fact this is all we are doing.

Tractate 36:
In summary; thoughts of the brain are experienced by us as arrangements and rearrangements – change – in a physical universe; but in fact it is really information and information-processing which we substantialize. We do not merely see its thoughts as objects, but rather as the movement, or, more precisely, the placement of objects: how they become linked to one another. But we cannot read the patterns of arrangement; we cannot extract the information in it – i.e. it as information, which is what it is. The linking and relinking of objects by the Brain is actually a language but not a language like ours (since it is addressing itself and not someone or something outside itself).

A propósito:

VALIS (acronym of Vast Active Living Intelligence System from an American film): A perturbation in the reality field in which a spontaneous self-monitoring negentropic vortex is formed, tending progressively to subsume and incorporate its environment into arrangements of information. Characterized by quasi-consciousness, purpose, intelligence, growth and an armillary coherence.

- Great Soviet Dictionary, Sixth Edition 1992

[1] http://fusionanomaly.net/information.html (Fusion Anomaly! Versão “lado direito do cérebro” da Wikipedia, embora não seja wiki)
[2] http://en.wikipedia.org/wiki/David_Zindell
[3] http://en.wikipedia.org/wiki/VALIS
[4] http://en.wikipedia.org/wiki/Philip_K._Dick
[5] http://en.wikipedia.org/wiki/Do_Androids_Dream_of_Electric_Sheep%3F
[6] http://fusionanomaly.net/valis.html