- Nothing. Yes, nothing. Simply do not track anything, that may be the best way to go as it respects visitors' privacy.
- AWStats: ugly for modern standards. Based on log files. I recall experimenting with this several years ago. It may be a fine solution to avoid adding JavaScript snippets to a site.
- JavaScript-based and self-hosted:
- Matomo (previously called Piwik): seems to be the best of its kind. Well maintained, full of features. Big focus on its commercial offering of hosted service. Matomo on GitHub.
- Open Web Analytics (OWA): looks less fancy. Seems to be more community oriented, no business around. Open Web Analytics on GitHub.
- Fathom: maybe the newest kid in the neighborhood. Built with Go and Preact (a smaller React-compatible JS library, first time I hear of it). Fathom on GitHub.
Páginas
Monday, February 18, 2019
Free Software for Web Analytics
Monday, April 20, 2009
Palestra de Python e Desenvolvimento Web no FLISOL Rio de Janeiro
Com uma recheada grade de palestras, o FLISOL contará também com a presença da PythOnRio representada por Luiz Guilherme Aldabalde que apresentará a palestra técnica "Entendendo Framework Web com Python".
Definitivamente esta é uma grande oportunidade para aprender e experimentar o que há de mais interessante e inovador em matéria de Software Livre. Compareça! E não deixe de levar o seu computador!
[Original em http://pythonrio.org/palestra-de-python-e-desenvolvimento-web-no-f]
Wednesday, March 4, 2009
Mozilla Bespin: web text editor and collaboration tool
Depois do Coding Dojo Rio de hoje, movimentação na lista e uma possível integração com o pessoal da SEA Tecnologia de Brasília, o Flávio citou o Bespin como ferramenta para fazermos um dojo remoto colaborativo.
Comecei vendo um introdução nesse vídeo:
Introducing Bespin from Dion Almaer on Vimeo.
Basicamente é mais um experimento/projeto em estado alfa de desenvolvimento da equipe do Mozilla Labs. É um editor de código-fonte, atualmente com suporte a sintaxe colorida em Javascript, CSS e HTML.
O Bespin é escrito em Java, Python, e bastante Javascript, HTML e CSS.
Tem suporte experimental a edição colaborativa.
Esta é a interface de "dashboard", com um navegador de arquivos no estilo do Mac OS X.
Na parte de baixo eu dei o comando "help" para receber uma lista dos comandos disponíveis.

Esta é a interface de edição mais a área de colaboração, que no momento parece estar desativada.

Tem um demo do projeto rodando em:
http://bespin.mozilla.com/
Você pode se registrar ou usar um login genérico daqui:
http://www.bugmenot.com/view/bespin.mozilla.com
O código-fonte do Bespin é aberto, e está em um repositório do Mercurial:
http://hg.mozilla.org/labs/bespin/
Vale a pena dar uma olhada neste e outros projetos do Mozilla Labs, a exemplo do Ubiquity e do Prism.
Saturday, February 28, 2009
Brincando com o Bazaar (bzr)
Mas o que é isso? Bem, o Bazaar é um DVCS - Distributed Version Control System -, um software que, simplificadamente, serve para guardar diversas versões de arquivos. Em geral, esses "arquivos" estão relacionados a código-fonte, mas podem ser qualquer coisa, como imagens, pdfs, executáveis, etc.
Um sistema de versionamento famoso é o Subversion (svn), que é um sucessor do CVS. Entretanto, o Bazaar, assim como outros DCVSs, são essencialmente diferentes desses dois.
O SVN e o CVS são sistemas centralizados, com pouco suporte para operações offline, e possibilidades (facilidade) de colaboração limitadas. As operações de controle de versão ocorrem num repositório central, necessitando conexão de rede/Internet.
Já os sistemas distribuídos, possuem diversos repositórios; repositórios locais, onde o desenvolvedor pode salvar (commit) seu trabalho, e repositórios remotos onde ocorre a integração (merge) das partes.
Bem, a minha intenção aqui não é explicar como funciona o SVN nem o CVS, nem dar detalhes do que eles são. O trecho acima foi só para tentar nivelar os desentendidos :)
Mais informações nos links que apontam para a Wikipedia!
Voltando ao Bazaar, existem outros "concorrentes" por aí, boas opções também. Dentre as principais: Mercurial e Git.
Tenho usado o Git no meu estágio, e achei ele um pouco "fora do meu estilo". Também tem um ponto chato que é rodá-lo no Windows -- um grande problema. E como meu dia a dia é Linux pra cá, Windows acolá, então é uma limitação relevante pra mim.
Meu orientador Carlo me deu uma amostra grátis do Bazaar algumas semanas atrás, lá no NCE/UFRJ, e achei por bem tirar um tempo pra brincar com ele por minha conta. E foi o que fiz em algum momento do feriadão de carnaval. Instalei o Bazaar no Ubuntu e passei a usá-lo em um projeto pessoal.
A instalação foi muito fácil. Nos repositórios padrão do Ubuntu 8.10, a versão do Bazaar não era a mais recente, portanto, adicionei ao meu sources.list o repositório do Bazaar no Lauchpad.
Conforme diz aqui bastou eu abrir o gerenciador de pacotes e pedir para adicionar essas duas linhas:
deb http://ppa.launchpad.net/bzr/ppa/ubuntu intrepid mainDepois de atualizar a lista de pacotes disponíveis, lá estava o Bazaar 1.12, assim como o pacote bzr-gtk que traz uma interface gráfica pro mesmo.
deb-src http://ppa.launchpad.net/bzr/ppa/ubuntu intrepid main
Agora enquanto escrevo, vou instalar no Windows...
Extremamente fácil: só baixar e executar. Instalado e funcionando muito bem.
Desta forma, instalei o Bzr standalone, isso é, não está instalado junto ao meu Python do sistema.
Pois é, o Bazaar é escrito em Python, é muito fácil de usar, e é uma mão na roda para por exemplo manter o pendrive, notebook, e outros pcs sincronizados. E de quebra um local faz backup do outro...
A idéia do Bazaar é de ser um software fácil de usar, e com pouco tempo de uso já me sinto confortável para fazer diversas tarefas. Sua documentação é boa, funciona em qualquer lugar que rodar Python, o que significa umm... qualquer lugar...
Também é muito legal usar o bazaar interfaceando com outros sistemas de controle de versão. O Bazaar, até onde sei, é o único que pode ser usado com o SVN, Git, Mercurial, tudo ao mesmo tempo. Existem plugins que integram o bzr com cada um destes outros projetos, de forma que pela linha de comando do bzr posso fazer checkout e commits em repositórios svn... ou git...
Por fim, li uma dica muito bacana sobre como colaborar em projetos usando o bzr. O projeto pode estar usando qualquer controle de versão, ou mesmo usando nenhum :)
A idéia é a seguinte:
# criar um diretório para guardar seu trabalho
mkdir projeto
cd projeto
# Criar um repositório do bzr (para otimizar o uso de espaço em disco)
bzr init-repo --trees .
# Pegue o codigo oficial do projeto
svn co http://url/do/repositorio/oficial/do/projeto original
Então agora temos um diretório contendo o código original do projeto. A idéia é deixar o diretório "original" intocado, sendo este apenas uma referência.
Agora vamos criar alguns branches no Bazaar para organizar o trabalho: # Criando um branch do bzr para o codigo original
cd original
bzr init
bzr add .
bzr ci -m'Importação do projeto'
# Criando um branch principal
cd ../
bzr branch original main
No branch main, podemos fazer as modificações necessárias para fazer o projeto rodar no nosso sistema, se for necessário. Essas modificações não serão enviadas de volta ao repositório original.
cd main
# Faça as alterações locais e prossiga
bzr ci -m'Adicionando mudanças locais'
Agora, sempre que for trabalhar em um patch/funcionalidade, crie um novo branch para ela. Isso faz com que as mudanças no projeto original sejam independentes.
# Criando um branch para trabalho em uma funcionalidade
cd ..
bzr branch main algumafuncionalidade
cdalgumafuncionalidade
# Implemente a fucionalidade e então
bzr ci -m'Adicionada funcionalidade xyz'
Agora, certifique-se que o código está atualizado em relação ao original para que seu patch seja limpo (atualize frequentemene para evitar uma grande quantidade de conflitos a serem resolvidos).
cd ../original
svn update
Isso trará as mudanças do repositório SVN oficial do projeto (pode ser outro comando, de acordo com o controle de versão usado no projeto...). Não deve haver nenhum conflito nesse momento, já que nada foi feito localmente em 'original'. Note que podem haver novos arquivos (linhas com um A na saída do svn update). O comando bzr unknowns
pode te ajudar agora. Se houver algum arquivo novo, adicione-o ao bzr:
bzr add arquivonovo
# ou bzr add $(bzr unknowns)
bzr ci -m'Mesclando com original do svn revisão 1234'
Isso significa que seu branch original está atualizado no bzr. Agora é hora de propagar as novidades para os branches com cada nova funcionalidade. Mas antes vá ao branch main para manter suas alterações de funcionamento local.
cd ../main
# Mesclar com as alterações em original
bzr merge
# Se houver algum conflito, solucione e então
bzr resolve file
# Quando tudo estiver ok (bzr status e bzr diff podem
# ajudar nessa hora)
bzr ci -m'Mesclando com original do svn revisão 1234'
E agora o mesmo para os branches de cada funcionalidade.
cd ../algumafuncionalidade
bzr merge
# 'bzr resolve' se necessário
bzr ci -m'Mesclando com original do svn revisão 1234'
Pode parecer muito trabalho (é mais simples que o Git :P), mas isso é feito bem rápido, especialmente se o desenvolvimento for feito "um passo de cada vez". Entretanto, os benefícios dessa forma de trabalhar superam essa trabalheira.
Como comparado ao svn o bzr é superior na hora de fazer merge, trabalhando desta forma reduzirá a quantidade de trabalho manual necessária para resolver conflitos.
Agora que você tem um nova funcionalidade implementada em um branch, você pode enviá-la para o repositório oficial do projeto!
É muito fácil. Já que separamos as funcionalidades em branches, os diffs sempre serão limpos, e para criá-los:
bzr diff -r branch:../main > ../funcionalidade.diff
Agora você pode revisar o diff e enviar para os mantenedores do projeto como um patch.
Você pode deixar seu branch de lado, e criar novos branches se quiser trabalhar mais. Se os mantenedores pedirem alguma alteração no seu patch para a funcionalidade que enviou, basta voltar ao branch e fazer as alterações, e enviar um novo diff.
Se o patch não for aceito, mas mesmo assim você qe manter suas alterações localmente, é também fácil. Simplesmente faça um merge do seu branch com o main branch, que então vai propagar para os outros branches de funcionalidade.
cd ../main
bzr merge ../algumafuncionalidade
bzr ci -m'Adicionando funcionalidade'
Agora, quando você atualizar os outros branches de funcionalidade, eles vão receber a funcionalidade, sem que seus diffs a contenham, mantendo os patches separados.
Se quiser implementar um funcionalidade em várias etapas, você pode criar branches de funcionalidade que dependam um do outro.bzr branch main pequena.mudanca
bzr branchpequena.mudanca
grande.mudanca
Agora, as mudanças de pequena.mudanca
se propagam para grande.mudanca
, e você pode gerar três patches:
# Diff para implementar pequena.mudanca
cd pequena.mudanca
bzr diff -r branch:../main
# Diff para implementar grande.mudanca
cd grande.mudanca
bzr diff -r branch:../main
# Criar diff para implementar grande.mudancao que é dependente de
# pequena.mudanca. Útil se a segunda parte da mudança ainda precisar
# ser discutida, ou se for aceita em etapas.
cd grande.mudanca
bzr diff -r branch:../pequena.mudanca
Portanto, fica aqui uma amostra de como o bzr pode trazer flexibilidade para trabalhar em um projeto, não importa qual controle de versão que seja usado oficialmente.
E eu, super feliz com o bzr :)