TagMap 0.7.6

Este release do TagMap é candidato a ser colocado na página oficial do Tagmar 2, esperando apenas revisão. Muitos dados foram adicionados, mas ainda falta alguma coisa. Como vou começar a ficar sem tempo, espero que o povo goste e alguém dê um passo à frente para ajudar a inserir dados (não requer habilidades de programação).

Bug reports são extremamente bem-vindos.

Quando TagMap chegar no 1.0 posso me dedicar ao gerador de personagens.

Downloads no lugar de sempre:

P.S.: Ainda estou devendo o pacote .deb.

TagMap 0.6

Mais um release do TagMap, com uma quantidade expressiva de alterações.

captura_da_tela-tagmap-mapa-interativo-de-tagmar.png

Uma das novas funcionalidades é a lista (com busca) de locais, que pode ser vista à esquerda no screenshot. Ainda faltam outras funcionalidades e sobram alguns bugs, mas está bastante usável, então sinta-se livre para me dizer os defeitos ou novas idéias.

Downloads para windows (depois um pacote pra Debian/Ubuntu):

“Deployment” em Windows com Py2Exe e NSIS

Deployment segundo a wikipedia:

Software deployment é toda atividade que torna um sistema de software disponível para uso.

Como o TagMap é feito em Python+GTK, e pelo que vi o público interessado é composto majoritariamente de usuários de windows, pedir que eles instalem Python, GTK+ e PyGTK pra só então chegar em meu humilde programa, certamente seria uma barreira. Claro que tem o excelente All-in-one PyGTK for windows installer, mas se dá pra facilitar por quê não?

As duas ferramentas necessárias são o Py2Exe, responsável por tornar o script um legítimo executável, e o NSIS, que serve para criar instaladores next-next-finish e que vai fazer todo mundo te olhar como gente grande. ;P

Py2Eexe

O Py2Exe cria o executável a partir de um arquivo de configuração, no caso do TagMap foi o setup_win32.py. Observando o arquivo você verá que não é muito complicado, só substituir alguns valores e pronto; claro que mudanças maiores vão exigir algum estudo, mas se o seu projeto for em PyGTK com Glade pode pegar o meu e apenas trocar os valores (como eu mesmo fiz 😉 ).

No prompt do DOS (ugh!) e no diretório do programa execute:

python setup_win32.py py2exe

Depois de algum trabalho por parte do script será gerado um diretório dist contendo (no meu caso) tagmap.exe, alguns DLLs e outros arquivos. Para executar em qualquer computador basta instalar antes GTK, mas ele também pode ser embutido.

Uma bom código para observar e aprender (e copiar) é o do GAJIM.

NSIS

Com o MakeNSIS que vem com o Nullsoft Scriptable Install System você pode ler um script que descreve o roteiro das perguntas feitas pelo instalador next-next-finish. Claro que ninguém vai ler só apertar o botão insistentemente até chegar no final. Meus scripts são o installer.nsi e installer_gtk.nsi, ambos podem ser facilmente adaptados para outros projetos. Como o nome deve indicar, o segundo script cria um instalador que coloca o GTK junto com o programa, pode parecer um desperdício de espaço, mas com as conexões rápidas e os HDs grandes de hoje em dia esse é um problema muito menor que mandar o usuário baixar um monte de dependências manualmente.

Bem, não tem muito mais o que explicar, até porque ainda estou aprendendo, mas um tutorial completo e direto pode ser encontrado em PyGTK and Py2Exe HowTo.

E os instaladores do TagMap (numa versão muito alfafa) pra windows, com e sem GTK:

P.S.: Um agradecimento especial pra minha gatinha que pacientemente me ajudou a testar. :*

Cygwin, C, Python, SWIG, Wrappers & Sofrimento em Win32

Existem muitos tipos de sofrimento, e a disciplina do “Projetão” desse período está me trazendo uma grande variedade deles. Contudo, vou falar apenas do sofrimento de ser obrigado a ficar próximo do que é desagradável. Esse está representado pelo uso do Windows como S.O., já que o tablet PC que conseguimos pro projeto, assim como o cérebro de muitos professores desse centro, roda Windows.

Mas onde existe sofrimento, existe algum paleativo! O projeto usa as linguagens Python e C, e minha parte foi fazer a integração das duas, no sentido de Python chamando funções em C. Primeiro precisei exorcisar o ambiente: instalei o Cygwin, que me dá o direito de usar GCC, Make e um terminal bash perfeitamente funcional. Quando apertava CTRL+R pensava estar no gnome-terminal.

Pra tarefa de criar os wrappers Python sobre a lib em C usei o SWIG. É bem simples: você cria um arquivo.i, roda o SWIG que por sua vez gera um arquivo_wrap.c mais um arquivo.py (e várias outras linguagens), depois disso um Makefile pra criar as DLLs, aí você pode importar e aproveitar a alta performance de uma função em C. Meu problema é que compilava as DLLs e wrappers no Cygwin e quando o povo usava com o Python instalado no windows, ele pedia a libpython2.4.dll, e depois de copiada do /bin do Cygwin para o diretório onde seria usada, eu descobri que ela estava linkada com o cygwin1.dll, quando coloquei mais esse a aplicação travava para sempre e sempre.

Me informando melhor descobri que compilar coisas no Cygwin faz seu código precisar do runtime do bicho, que a princípio não é nada mal, já que ele emula umas posix-coisas legais. Mas estava sem saco pra ver descobrir qual o problema, possivelmente não relacionado com o Cygwin, além disso não tinha mais castanhas-do-pará então resolvi matar o cyg, ou melhor, suas DLLs. Descobri a diretiva do gcc -mno-cygwin, que evita o uso das dlls do cygwin, mas também nada mais estava compilando. Resolvido algumas horas depois, quando troquei o endereço dos includes e libs de Python, tirando os do cygwin (que estavam linkados com o cygwin1.dll) e colocando os da instalação de Python no Windows, em c:\Temp\Python24.

PYTHON_LIB_PATH = /cygdrive/c/Temp/Python24/libs
PYTHON_INC_PATH = /cygdrive/c/Temp/Python24/include

E a compilação de um dos DLLs ficou mais ou menos assim

gcc -c blah.c -mno-cygwin
gcc -c -I$(PYTHON_INC_PATH) blah_wrap.c -mno-cygwin
gcc -L$(PYTHON_LIB_PATH) -shared -mno-cygwin $(OBJS) -lpython24 -o _blah.dll

Referência:

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:

portemu (no windows da escola)

Agora no Windows(TM):

portemu-win

Funcionou como devia. Recapitulando o que é necessário:

Mais tarde vou investigar o Py2Exe pra gerar um executável pro Win32 com todas as DLLs embutidas. Claro que vai ficar enorme, mas hei, banda larga está aí e seu HD é enorme, e acredite em mim quando digo que é menos chato um grande download do que vários downloads e instalações pra chegar num programinha simples.
E quem já tem essas coisas instaladas sempre vai poder baixar o arquivo .py

Até lá Lauro e eu destemidamente aprimoraremos o portemu pra tentar uma inclusão na disciplina de IHS. Isso se eles já não mudarem pra USB no próximo período… mas aí mudamos também. =D