O Projeto Software Livre Bahia (PSL-BA) é um movimento aberto que busca, através da força cooperativa, disseminar na esfera estadual os ideais de liberdade difundidos pela Fundação Software Livre (FSF), possibilitando assim a democratização do acesso a informação, através dos recursos oferecidos pelo Software Livre. Esta busca tem seus alicerces fundados na colaboração de todos, formando um movimento sinérgico que converge na efetivação dos ideais de Liberdade, Igualdade, Cooperação e Fraternidade.
O Projeto Software Live Bahia é formado pela articulação de indivíduos que atuam em instituições publicas e privadas, empresas, governos ou ONGs, e demais setores da sociedade. Além disso o projeto não é subordinado a qualquer entidade ou grupo social, e não estabelece nenhuma hierarquia formal na sua estrutura interna.
Fui diagnosticado com um tumor renal, e agora?
31 de Dezembro de 2014, 1:00 - sem comentários aindaEm 2012 fui diagnosticado com um tumor no rim esquerdo, fiz uma cirurgia e a recuperação ocorreu muito rápida e tranquila. Na época fiz uma busca superficial na internet sobre o assunto e encontrei algumas opiniões bem assustadoras, falavam em quimioterapia, radioterapia e afins. Como nada disso foi necessário em meu caso resolvi compartilhar minha experiência aqui, com o objetivo de deixar um relato positivo sobre o tratamento de tumor renal na esperança de que seja útil para alguém.
Bem, vamos lá… 2012, fazia algum tempo que sofria com pequenas dores de estômago, ao investigar a causa descobri que estava com uma gastrite, fiz o tratamento, resolvi o problema mas as dores continuaram, vários exames depois, dentre eles uma tomografia computadorizada de abdómen, identificou um pequeno ponto no rim esquerdo, este pequeno ponto era um tumor e precisava ser removido.
Neste momento o médico me explicou que o procedimento cirúrgico para remoção do tumor apresentava uma chance de cura de 95%, isto me deixou bastante tranquilo, me explicou que a cirurgia era simples, poderia ser feita por vídeo laparoscopia, e que a remoção do tumor no meu caso tinha grandes chances de preservar o rim, ou ao menos parte dele.
Apesar da cirurgia ter sido um sucesso, fazer tudo isto pelo SUS não foi tarefa fácil, eu não tinha plano de saúde então o SUS era minha única alternativa. Por sorte e por ajuda de alguns médicos consegui chegar ao Hospital Aristides Maltez (HAM), ele é referência em tumores no estado Bahia e faz atendimentos 100% pelo SUS.
O próximo passo foi conseguir marcar uma consulta, no HAM isto não é tão fácil, é muita gente para pouco “hospital”, consegui marcar a primeira consulta após esperar uma manhã inteira na fila. Consulta agendada, voltei ao hospital no dia marcado, mais um turno aguardando para ser atendido, fui atendido e a cirurgia foi marcada para um prazo de aproximadamente 15 dias.
O grande dia chegou, em 31 de Janeiro de 2012 fui internado, a cirurgia ocorreu no dia seguinte, o nome exato do procedimento ao qual fui submetido é Ressecção de tumor retroperitoneal + linfadenectomia retroperitoneal, em algumas horas já estava de volta à enfermaria, um médico residente informou que ocorreu tudo bem e que a previsão de alta era em 48 horas. Dentro do prazo previsto recebi alta, me entregaram algumas amostras do tumor para que fosse solicitado biopsia, marquei a consulta de retorno para 2 semanas depois e fui para casa.
Voltei para a consulta já com os resultados da biopsia em mãos, o médico disse que a cirurgia ocorreu da melhor forma possível, e que as chances de cura eram ótimas, mas o resultado da biopsia deu positivo para maligno, ou seja, o tumor era cancerígeno.
Só neste momento eu me toquei de que tive um câncer. Adimito que sempre tive um certo medo, costumava pensar, não com tanta frequência, mas pensava o seguinte:
Puts! Se um dia eu tiver algum tipo de câncer como é que vai ser, quimio, rádio, etc… Deve ser foda!
E de repente eu tive um, fui curado, e quase nem percebi… Reflito sobre isto de uma maneira bem humorada e tranquila, afinal, ficar angustiado não resolveria o problema.
Apesar disso é importante ser disciplinado e seguir as orientações médicas, cumprir os prazos planejados, e não deixar para “depois”, “depois” e “depois”. O meu caso por exemplo requer acompanhamento anual, repito todo ano exames de sangue, tomografia computadorizada de abdómen e radiografia de tórax. Os médicos dizem que casos como o meu, tumor maligno, há chances do tumor voltar, então é necessário acompanhamento para o resto da vida.
E aqui termino este pequeno relato, desejo sorte para aqueles que estejam passando por situação parecida, tenham tranquilidade, paciência e acima de tudo fé na medicina moderna, ou em qualquer outra coisa que os tranquilize.
Tenho certeza de que vibrações positivas ajudam bastante, e as vibrações dos meus amigos e familiares me ajudaram muito naquele momento, então aproveito este espaço para deixar registrado publicamente um agradecimento especial à todos aqueles que me desejaram sorte e que de alguma forma me enviaram suas boas vibrações.
Obrigado!
Backup na nuvem com Tarsnap
23 de Dezembro de 2014, 1:00 - sem comentários aindaEste post estava sendo escrito antes de eu abandonar meu blog, então onde estiver escrito recentemente, hoje, etc, leia-se 2 anos atrás.
Recentemente precisei implementar uma solução de backup para alguns servidores de internet, após uma pesquisa rápida optei pelo Tarsnap, uma solução de backup em nuvem baseado na infra-estrutura de armazenamento da Amazon.
Eu queria algo simples de implementar e manter, não queria ter mais um servidor nas mãos, nem queria ter que lidar com detalhes de ssh, rsync, ftp, etc. Em resumo:
- Não queria manter um novo servidor (nem físico nem virtual)
- Não queria usar o Bacula, ótima ferramenta mas complicado
- A solução deveria ser simples de configurar e manter, do tipo “configure uma vez, contrate um serviço e funcione para o resto da vida”
- Não estava procurando apenas uma ferramenta, mas também um serviço de armazenamento para backup
O Tarsnap é uma ferramenta e também um serviço de armazenamento, o preço é bem razoável, $0.30 por GB de armazenamento mensal e $0.30 por cada GB transferido. A cobrança é pré-paga, e para começar a usar o serviço é necessário adicionar um crédito mínimo de $ 5.
Os créditos são consumidos diariamente, quando eles acabam o serviço continua funcionando por até 7 dias, isto dá tempo de pôr créditos novamente sem interrupção dos backups. Hoje, o backup dos meus servidores tem aproximadamente 7 GB e isto consome um pouco menos de $ 5 mensal.
Infelizmente, o tarsnap não é software-livre, o autor disponibiliza o código fonte, mas a licença não permite redistribuir o software com modificações. Apesar disso o autor afirma contribuir bastante com o libarchive, uma biblioteca livre para compressão e arquivamento usada como base para o tarsnap.
Não vou detalhar o uso da ferramenta, darei apenas dois exemplos básicos: (1) como adicionar um servidor e (2) como criar backups. Considerando que você já tem o tarsnap instalado em seu servidor, veja as instruções de instalação aqui, gere uma chave para ele com o comando abaixo, se tiver dificuldades consulte este link.
# tarsnap-keygen --keyfile /root/tarsnap.key --user me@example.com --machine mybox
Substitua me@example.com pelo email usado para criar a conta no Tarsnap, e
mybox pelo hostname do seu servidor. Faça uma cópia de seguança do
arquivo /root/tarsnap.key
, sem ele não será possível acessar o backup!
Com isso já é possível criar um novo backup, o comando abaixo cria um backup do
diretório /home
por exemplo, veja outros comandos
aqui.
# tarsnap -c -f mybackup-home /home
O tarsnap apenas cria, lê, apaga e restaura backups, ele não gerencia
agendamento, política de retenção, periodicidade, etc. É necessário alguma
outra ferramenta para essa tarefa, em uma rápida pesquisa encontrei o
tarsnapper, um agendador para o
tarsnap, com ele é possível de maneira simples definir uma política de retenção
usando um arquivo de configuração localizado em /etc/tarsnapper.conf
. Veja um
exemplo:
# fazer backup diario e reter:
# a cada semana (7 dias)
# a cada mes (30 dias)
# a cada semestre (180 dias)
deltas: 1d 7d 30d 180d
target: /mybox/$name-$date
jobs:
etc:
source: /etc
mysql:
source: /var/backups/mysql
exec_before: /usr/local/bin/dump-mysql
foswiki:
sources:
- /var/lib/foswiki/data
- /var/lib/foswiki/pub
O tarsnapper deve ser agendado no cron, eu sugiro executar ele diariamente,
para isso crie o arquivo /etc/cron.daily/tarsnapper
com o seguinte conteúdo:
#!/bin/sh
# Start in the root filesystem, make SElinux happy
cd /
tarsnapper -o configfile /etc/tarsnap.conf -c /etc/tarsnapper.conf make >> /var/log/tarsnapper.log 2>&1
Dê permissão de execução a este arquivo, isto vai fazer o cron vai rodar o tarsnapper diariamente executando o tarsnap para cada job presente no arquivo de configuração. Lembrando que todos os comandos foram testados no sistema operacional Debian GNU/Linux e não há garantias que funcionem corretamente em outros sistemas.
Com isso você tem um esquema de backup simples de implementar e manter. Espero que tenha sido útil de alguma forma, em caso de dúvidas, sugestões ou reclamações, por favor, entre em contato através do email, twitter ou se preferir atrevés do meu perfil no github.
Voltando a "blogar"
18 de Dezembro de 2014, 1:00 - sem comentários aindaHoje enquanto conversava com uma amiga no telefone surgiu a seguinte pergunta:
“Por que a gente não posta mais em nossos blogues?”
Ao ouvir isso pensei:
“Humn… Hâmmmn… É porque… Bem… É que…..”
Nenhum argumento minimamente válido surgiu, ou seja, não há motivos, então aqui estou eu “blogando” novamente…
Eu tinha um blog na rede Software Livre Brasil que não via um post desde 2010, na verdade ainda tenho, ele funciona e continuará disponível, mas vou concentar os próximos posts aqui. Mas por que eu saí do Software Livre Brasil? Na verdade não saí, meu perfil continua lá, continarei usando a rede social, e talvez até replique os posts daqui por lá. O que aconteceu foi que a pergunta “Por que a gente não posta mais em nossos blogues?” deu o empurrãozinho que faltava para eu desenrolar as seguintes questões:
- Vontade de testar algum sistema gerador de site estático
- Necessidade de hospedar algo útil na VPS que eu já havia alugado no DigitalOcean
- Desejo de ter meu blog com domínio próprio, e eu já havia registrado “joenio.me” no Gandi.net a algum tempo
E assim aqui está mais um blog nesse mundão virtual, pretendo falar de tudo um pouco, coisas da minha vida pessoal, questões técnicas relacionadas ao trabalho, um pouco da minha experiência no meio acadêmico, música, esportes, livros, etc… Espero que seja útil para mais alguém além de mim mesmo.
Ahhh!!! Dani, obrigado pelo empurrãozinho!
Monitorando JBOSS com Zabbix
11 de Dezembro de 2014, 18:22 - sem comentários aindaMonitorar um JBoss é muito mais do que verificar se as portas estão funcionando, ou se o serviço está em execução. Precisamos monitorar como está a performance do ambiente, e nesse ponto que o Zabbix com sua interface Java para consultas JMX entra “no jogo”.
Introdução
Este tutorial detalha o processo de monitoramento da interface JMX nativa do ZABBIX para monitorar o desempenho do servidor de aplicações JBoss.
Por padrão servidores de aplicações Java, como o JBoss, possibilita a monitoria através da utilização de recursos pela ferramenta JConsole, disponível no pacote JDK do Java, ou utilizar ferramentas de linha de comando como o Twiddle.
A utilização do JConsole é, até certo ponto, aceitável de utilizar, porém integrando este tipo de monitoramento com o ZABBIX, você poderá criar triggers e ações de acordo com os problemas que poderão surgir com seu servidor e/ou aplicativos e enviar alertas. Isso sem falar na ajuda dos gráficos, que facilita a analise do ambiente como um todo. No JConsole isso só é possível gravando os dados em um relatório, pois o monitoramento é feito sem armazenar os dados coletados, ou seja, fazer com o Zabbix é muito melhor.
Ambiente
O ambiente utilizado possui duas máquinas, ambas com a distribuição GNU/Linux Debian wheezy.
Uma das máquinas atua como servidor Zabbix, e nela foi instalada os seguintes pacotes:
- zabbix server 2.4.2
- zabbix-java-gateway 2.4.2
- zabbix-agent 2.4.2
- java 7
Na outra foi instalado o servidor de aplicações web:
- Jboss 4.2.3
- java 5.0_22
- zabbix-agent 2.4.2
Instalação
Nessa documentação não entraremos no detalhe da instalação do servidor Zabbix padrão, vamos apenas detalhar o processo do Zabbix Java Gateway.
O Zabbix Java Gateway é um software escrito em Java e seu funcionamento é bem simples.
Quando o servidor ZABBIX deseja obter o valor de um Item em um JBoss, ele faz a requisição ao Zabbix Java Gateway que fica responsável por interagir com a aplicação JBoss, através de uma API de gerenciamento JMX. Por esse motivo, só é possível fazer este tipo de monitoramento no modo passivo.
Para que o monitoramento JMX funcione, o serviço do Zabbix Java Gateway tem que estar em execução apenas no servidor Zabbix, ou seja, nada precisa ser instalado no servidor JBoss, além do zabbix-agent.
Para instalar o gateway java, execute o comando abaixo:
aptitude install zabbix-java-gateway
Execute o comando abaixo para verificar se o serviço está em execução:
systemctl status zabbix-java-gateway
Caso o serviço não esteja ativo, execute o seguinte comando:
systemctl start zabbix-java-gateway
O Zabbix Java Gateway estará escutando na porta 10052, sendo assim digite o comando abaixo para validar isso:
netstat -anp | grep 10052
O resultado deverá ser algo assim:
tcp 0 0 127.0.0.1:37732 127.0.0.1:10052 TIME_WAIT –
tcp6 0 0 :::10052 :::* LISTEN 4217/java
Configuração no servidor Zabbix
Acesse o arquivo /etc/zabbix/zabbix_server.conf e configure os seguintes parâmetros:
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5
Depois de gravar o arquivo, reinicie o serviço do ZABBIX server e java-gateway:
systemctl restart zabbix-server
systemctl restart zabbix-java-gateway
Configuração no servidor JBoss
Acesse o arquivo $PATH_JBOSS/bin/run.conf e acrescente as linhas abaixo no final do arquivo:
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote”
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345″
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false”
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false”
Reinicie o serviço do JBoss para que as mudanças tenham efeito.
Configuração via interface web
Abra a configuração do host que deseja fazer o monitoramento do JBoss e insira o IP do servidor e a porta 12345, que foi configurada no arquivo run.conf do JBoss, conforme podemos ver na imagem abaixo:
A partir do ZABBIX 2.0 já tem um template pronto com alguns exemplos úteis para utilização, inclusive com gráficos. No menu Configuração >> Templates, procure por Template JMX Generic.
Aplique o template em seu host e aumente o nível de analise do seu ambiente.
Autoria
Esse artigo foi criado por Madson Araujo, em seu trabalho como Bolsista de Monitoramento da UFBA, revisado e transformado em artigo de blog por mim.
Fonte
https://www.zabbix.com/documentation
New tablet UI for Firefox on Android
3 de Dezembro de 2014, 19:45 - sem comentários aindaThe new tablet UI for Firefox on Android is now available on Nightly and, soon, Aurora! Here’s a quick overview of the design goals, development process, and implementation.
Design & Goals
Our main goal with the new tablet UI was to simplify the interaction with tabs—read Yuan Wang’s blog post for more context on the design process.
In 36, we focused on getting a solid foundation in place with the core UI changes. It features a brand new tab strip that allows you to create, remove and switch tabs with a single tap, just like on Firefox on desktop.
The toolbar got revamped with a cleaner layout and simpler state changes.
Furthermore, the fullscreen tab panel—accessible from the toolbar—gives you a nice visual overview of your tabs and sets the stage for more advanced features around tab management in future releases.
Development process
At Mozilla, we traditionally work on big features in a separate branch to avoid disruptions in our 6-week development cycles. But that means we don’t get feedback until the feature lands in mozilla-central.
We took a slightly different approach in this project. It was a bit like replacing parts of an airplane while it’s flying.
We first worked on the necessary changes to allow the app to have parallel UI implementations in a separate branch. We then merged the new code to mozilla-central and did most of the UI development there.
This approach enabled us to get early feedback in Nightly before the UI was considered feature-complete.
Implementation
In order to develop the new UI directly in mozilla-central, we had to come up with a way to run either the old or the new tablet UIs in the same build.
We broke up our UI code behind interfaces with multiple concrete implementations for each target UI, used view factories to dynamically instantiate parts of the UI, prefixed overlapping resources, and more.
The new tab strip uses the latest stable release of TwoWayView which got a bunch of important bug fixes and couple of new features such as smooth scroll to position.
Besides improving Firefox’s UX on Android tablets, the new UI lays the groundwork for some cool new features. This is not a final release yet and we’ll be landing bug fixes until 36 is out next year. But you can try it now in our Nightly builds. Let us know what you think!
Joining Facebook
27 de Novembro de 2014, 9:24 - sem comentários aindaI am really excited to announce that I’m joining Facebook in January! I’ll be bootstrapping Android UI efforts—frameworks and user-facing stuff—in the London office. There are still a lot of details to sort out but that’s the general plan.
Why Facebook? They have an amazing hacker-driven culture, they’re striving to do open source the right way, there’s a lot of space for experimentation, and they have massive reach in the Android space.
I’m really looking forward to learning a lot at Facebook. And there is so much to be done! I can’t wait to start :-)
Leaving Mozilla
26 de Novembro de 2014, 14:57 - sem comentários aindaI joined Mozilla 3 years, 4 months, and 6 days ago. Time flies!
I was very lucky to join the company a few months before the Firefox Mobile team decided to rewrite the product from scratch to make it more competitive on Android. And we made it: Firefox for Android is now one of the highest rated mobile browsers on Android!
This has been the best team I’ve ever worked with. The talent, energy, and trust within the Firefox for Android group are simply amazing.
I’ve thoroughly enjoyed my time here but an exciting opportunity outside Mozilla came up and decided to take it.
What’s next? That’s a topic for another post ;-)
Things to celebrate
20 de Novembro de 2014, 18:32 - sem comentários aindaTurning 35 today, then I get the great news that the person whom I share my dreams with has just become a Debian member! Isn't beautiful? Thanks Tássia, thanks Debian! I should also thank friends who make an ideal ambience for tonight's fun.
A few words on the recent Brazilian elections
4 de Novembro de 2014, 1:14 - sem comentários aindaThe Brazilian presidential election was exceedingly intense this year. Among many inferences that we can make by following the news and investigating data from the voting results I'd like to share this one, which in my opinion reflects quite well the vote preferences in the country.
First, let me introduce you "Belágua", a small town located in the Northeast region of Brazil. It has 6,524 habitants, 3 buses and 2 hospitals. According to the Brazilian Institute of Geography and Statistics (IBGE), the income per person in Belágua is $146 BRL (or U$59) per month. Believe it or not, it used to be much less. Actually, the city reported in 2013 the highest economic jump in the country, rising more than a thousand positions in the ranking of GDP per capita (from position 4,991 to 3,849). This recent growth was consequence of the social welfare program of the Brazilian government, which also boosted artisanal and manioc flour production. This federal assistance is called "Bolsa família", which benefits 1.814 families in Belágua.
"Bolsa Família currently gives families with per-capita monthly income below $140 BRL (poverty line, ~$56 USD) a monthly stipend of $32 BRL (~$13 USD) per vaccinated child (< 16 years old) attending school (up to 5), and $38 BRL (~$15 USD) per youth (16 or 17 years old) attending school (up to 2). Furthermore, to families whose per-capita monthly income below $70 BRL (extreme poverty line, ~$28 USD), the program gives the Basic Benefit $70 BRL per month."
(from Wikipedia)
Contrary to what many of my middle-class friends believe, and as you can calculate yourself, this little amount of money does not offer anybody a luxury life. It does not make anybody stopping working, nor stopping looking for paid job (but yes, it makes people to start saying NO to forced labor, which is amazing, right?).
Belágua, where Dilma got 93.93% of votes (photo by Clarissa Carramilo / from G1)
Also, Belágua has no much physicians around because doctors in Brazil usually wouldn't live in a such city. But now Belágua population can be treated by foreign doctors imported by the recently launched program "Mais Médicos" (More Physicians for Brazil), which hosts two Cuban doctors 15km away. Finally, Belágua people have light, due to the "Luz para Todos" ("Light for All") program.
It's not surprising that Belágua has re-elected the party which has motivated these changes. For 2014 presidential election, Belágua people gave 3.558 votes (93.93%) to Dilma Rousseff (candidate of the current government, from a left-ish party), against 230 (6,07%) to Aécio Neves (from the right coalition), being the city with the largest amount of votes for Dilma, proportionally, followed by "Serrano do Maranhão" (93,75%), which is located in the same region.
On the other hand, the city which gave, proportionally, the largest amount of votes for Aécio Neves has a population of 5,564,635 habitants, where most of citizens are not Brazilians, not yet. Miami, located in US, was the city where Brazilian residents would elect Aécio by 7,225 votes (91,79%), against 646 (8,21%) for Dilma, followed by Atlanta/US (89,47%) and Houston/US (89,22%).
Miami, where 91,79% of Brazilians voted Aécio (photo by Marc Averette / from Wikipedia)
It's so clear that we do what people call "selfish vote". In general, we don't care about which party has better proposals for the society as whole. Rich people will go against any serious social equality proposal, which will necessarily be followed by higher taxes on their fortunes. As middle class citizens, we care about dollar rates, because we want to get cheaper iStuff from Miami. We're also very upset by the fact that new apartments are being built without that small room in the back, which has been used to accommodate a subservient housemaid who, until last year was not even legally considered a worker.
Those people from Belágua, who used to live in extreme poverty for decades, serving as slaves, they mostly care about having something to eat. Now they eat, so they can think better, they can work, they can sell what they produce in their little yard. And like middle-class and rich citizens, they will give their vote in exchange of what they think is better for them. The big difference here is, if we ask Belágua people why they voted for Dilma, with no embarrassment they will make it very clear, that's because her government has provided them lots of benefits. Asking the same question for most Brazilians in Miami, Atlant, Houston or São Paulo, you'll get not only a bunch of allegedly moral/altruistic reasons, but they will also try to delegitimize in many ways the votes from those marginalized citizens. You'll never get the real reasons from them. They will even try to convince you that whoever receives federal assistance should automatically lose right to vote. Such a statement may seem ridiculous, however it has been very present recently. Actually, such hate speech is happening right now. While I'm writing this post about 2500 people are protesting in São Paulo streets, asking for an immediate military coup because they don't agree with the elections result. These people keep pushing the limits of ridiculousness.
Dilma won with 51.64% of valid votes, a very tight result. The country is clearly divided, mostly by hate, unfortunately.
Um Trabalho a Troco de nada? A resposta da comunidade GNOME para Jô Soares e Bill Gates à luz da teoria da Dádiva
11 de Outubro de 2014, 16:02 - sem comentários aindaSete anos após uma apresentação feita no IV Fórum GNOME em 2007 com esse mesmo título, finalmente, eu consegui publicar, em parceria com Genauto França Filho (meu orientador de Doutorado), o resultado da pesquisa que tentou responder uma questão que ronda o ecossistema dos projetos de software livre: "quem pode se permitir fazer um trabalho profissional a troco de nada?" Mais especificamente, esse artigo foi publicado na revista (acadêmica) Sociologias - uma publicação quadrimestral do Programa de Pós-Graduação em Sociologia da UFRGS, destinada a promover intercâmbio entre cientistas sociais.
No entanto, é importante ressaltar que essa questão norteadora da nossa pesquisa foi, inicialmente, levantada por Biil Gates na histórica "Carta Aberta aos Hobbistas" escrita em 1976 - um ano depois da fundação da então "Micro-Soft". Além dele, quatro décadas depois, mais especificamente em outubro de 2006, ela foi "remixada" por Jô Soares, no seu programa de televisão. Em uma de suas entrevistas, ao ser informado pelo Sérgio Amadeu (Prof. da UFABC) e pelo Júlio Neves (Prof. da UNiRio) sobre um possível engajamento voluntário de hackers ligados ao projetos de software livre, Jô Soares ressalta que, na visão dele, "por trás do fato do que é dado (software) de graça há uma intenção de ser vendido. (...) ou é um pessoal que é tudo monge Franciscano?"
O ponto de partida desse artigo que escrevemos na Sociologias é que ainda são poucos os estudos que procuram analisar as características e a natureza desse novo contexto digital (de relações mediadas por dispositivos móveis como computadores, tablets e celulares) para além de um entendimento que tem como base apenas as noções de uma racionalidade utilitária ou do simples interesse econômico. Afinal, podemos dizer que mais recorrente do que esse tipo de pergunta é o tipo de resposta comum (e apressada) que diz que "ninguém trabalha de graça" ou que "sempre há um interesse financeiro nisso tudo".
Para evitar os limites de uma única forma de resposta "apressada" (para não dizer "equivocada") e, com isso, restringir a compreensão sobre a ação dos hackers nesses projetos, avaliamos que era importante respondê-la com um olhar mais científico e aprofundado. Assim, realizamos uma análise mais qualitativa sobre esse "fenômeno" que se apoiou em uma pesquisa de dois anos na comunidade do Projeto GNOME. Essa pesquisa resultou então na minha dissertação de mestrado na UFBA, em um dos capítulos do livro "Software Livre, Cultura Hacker e Ecossistema da Colaboração" e agora nesse artigo publicado na Revista Sociologias.
Membros da Comunidade GNOME por Louis Villa
Em termos de publicação, o diferencial então dessa edição v. 16, n. 36 (2014) da Revista Sociologias é o resgate da obra maussiana que fundamentou conceitualmente essa pesquisa sobre o Projeto GNOME - e, agora, serve também de base do meu projeto de Doutorado. Esse resgaste se dá no contexto de surgimento de uma crítica anti-utilitarista dentro do universo das ciências sociais contemporâneas, a qual foi concretizada pela fundação do MAUSS (Movimento Anti-Utilitarista nas Ciências Sociais).
Contudo, vale ressaltar que esse paradigma sociológico da dádiva busca ir além: mais do que a importância da sua vertente analítica, o MAUSS demonstra ser uma corrente sociológica implicada com a produção de pesquisas que se desenvolve a partir de um paradigma basilar, não apenas nas sociedade tradicionais como também para a sociedade contemporânea: a vida associativa e, em especial, a tripla ação de compartilhar, receber e retribuir. Vale então conferir essa edição da Sociologia da Dádiva na íntegra.
Probing with Gradle
7 de Outubro de 2014, 20:12 - sem comentários aindaUp until now, Probe relied on dynamic view proxies generated at runtime to intercept View calls. Although very convenient, this approach greatly affects the time to inflate your layouts—which limits the number of use cases for the library, especially in more complex apps.
This is all changing now with Probe’s brand new Gradle plugin which seamlessly generates build-time proxies for your app. This means virtually no overhead at runtime!
Using Probe’s Gradle plugin is very simple. First, add the Gradle plugin as a dependency in your build script.
buildscript { ... dependencies { ... classpath 'org.lucasr.probe:gradle-plugin:0.1.3' } }
Then apply the plugin to your app’s build.gradle.
apply plugin: 'org.lucasr.probe'
Probe’s proxy generation is disabled by default and needs to be explicitly enabled on specific build variants (build type + product flavour). For example, this is how you enable Probe proxies in debug builds.
probe { buildVariants { debug { enabled = true } } }
And that’s all! You should now be able to deploy interceptors on any part of your UI. Here’s how you could deploy an OvermeasureInterceptor in an activity.
public final class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { Probe.deploy(this, new OvermeasureInterceptor()); super.onCreate(savedInstanceState); setContentView(R.id.main_activity); } }
While working on this feature, I have changed DexMaker to be an optional dependency i.e. you have to explicitly add DexMaker as a build dependency in your app in order to use it.
This is my first Gradle plugin. There’s definitely a lot of room for improvement here. These features are available in the 0.1.3 release in Maven Central.
As usual, feedback, bug reports, and fixes are very welcome. Enjoy!
New Features in Picasso
23 de Setembro de 2014, 12:52 - sem comentários aindaI’ve always been a big fan of Picasso, the Android image loading library by the Square folks. It provides some powerful features with a rather simple API.
Recently, I started working on a set of new features for Picasso that will make it even more awesome: request handlers, request management, and request priorities. These features have all been merged to the main repo now. Let me give you a quick overview of what they enable you to do.
Request Handlers
Picasso supports a wide variety of image sources, from simple resources to content providers, network, and more. Sometimes though, you need to load images in unconventional ways that are not supported by default in Picasso.
Wouldn’t it be nice if you could easily integrate your custom image loading logic with Picasso? That’s what the new request handlers are about. All you need to do is subclass RequestHandler and implement a couple of methods. For example:
public class PonyRequestHandler extends RequestHandler { private static final String PONY_SCHEME = "pony"; @Override public boolean canHandleRequest(Request data) { return PONY_SCHEME.equals(data.uri.getScheme()); } @Override public Result load(Request data) { return new Result(somePonyBitmap, MEMORY); } }
Then you register your request handler when instantiating Picasso:
Picasso picasso = new Picasso.Builder(context) .addRequestHandler(new PonyHandler()) .build();
Voilà! Now Picasso can handle pony URIs:
picasso.load("pony://somePonyName") .into(someImageView)
This pull request also involved rewriting all built-in bitmap loaders on top of the new API. This means you can also override the built-in request handlers if you need to.
Request Management
Even though Picasso handles view recycling, it does so in an inefficient way. For instance, if you do a fling gesture on a ListView, Picasso will keep triggering and canceling requests blindly because there was no way to make it pause/resume requests according to the user interaction. Not anymore!
The new request management APIs allow you to tag associated requests that should be managed together. You can then pause, resume, or cancel requests associated with specific tags. The first thing you have to do is tag your requests as follows:
Picasso.with(context) .load("http://example.com/image.jpg") .tag(someTag) .into(someImageView)
Then you can pause and resume requests with this tag based on, say, the scroll state of a ListView. For example, Picasso’s sample app now has the following scroll listener:
public class SampleScrollListener implements AbsListView.OnScrollListener { ... @Override public void onScrollStateChanged(AbsListView view, int scrollState) { Picasso picasso = Picasso.with(context); if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) { picasso.resumeTag(someTag); } else { picasso.pauseTag(someTag); } } ... }
These APIs give you a much finer control over your image requests. The scroll listener is just the canonical use case.
Request Priorities
It’s very common for images in your Android UI to have different priorities. For instance, you may want to give higher priority to the big hero image in your activity in relation to other secondary images in the same screen.
Up until now, there was no way to hint Picasso about the relative priorities between images. The new priority API allows you to tell Picasso about the intended order of your image requests. You can just do:
Picasso.with(context) .load("http://example.com/image.jpg") .priority(HIGH) .into(someImageView);
These priorities don’t guarantee a specific order, they just tilt the balance in favour of higher-priority requests.
That’s all for now. Big thanks to Jake Wharton and Dimitris Koutsogiorgas for the prompt code and API reviews!
You can try these new APIs now by fetching the latest Picasso code on Github. These features will probably be available in the 2.4 release. Enjoy!
Introducing Probe
16 de Setembro de 2014, 7:32 - sem comentários aindaWe’ve all heard of the best practices regarding layouts on Android: keep your view tree as simple as possible, avoid multi-pass layouts high up in the hierarchy, etc. But the truth is, it’s pretty hard to see what’s actually going on in your view tree in each UI traversal (measure → layout → draw).
We’re well served with developer options for tracking graphics performance—debug GPU overdraw, show hardware layers updates, profile GPU rendering, and others. However, there is a big gap in terms of development tools for tracking layout traversals and figuring out how your layouts actually behave. This is why I created Probe.
Probe is a small library that allows you to intercept view method calls during Android’s layout traversals e.g. onMeasure(), onLayout(), onDraw(), etc. Once a method call is intercepted, you can either do extra things on top of the view’s original implementation or completely override the method on-the-fly.
Using Probe is super simple. All you have to do is implement an Interceptor. Here’s an interceptor that completely overrides a view’s onDraw(). Calling super.onDraw() would call the view’s original implementation.
public class DrawGreen extends Interceptor { private final Paint mPaint; public DrawGreen() { mPaint = new Paint(); mPaint.setColor(Color.GREEN); } @Override public void onDraw(View view, Canvas canvas) { canvas.drawPaint(mPaint); } }
Then deploy your Interceptor by inflating your layout with a Probe:
Probe probe = new Probe(this, new DrawGreen(), new Filter.ViewId(R.id.view2)); View root = probe.inflate(R.layout.main_activity, null);
Just to give you an idea of the kind of things you can do with Probe, I’ve already implemented a couple of built-in interceptors. OvermeasureInterceptor tints views according to the number of times they got measured in a single traversal i.e. equivalent to overdraw but for measurement.
LayoutBoundsInterceptor is equivalent to Android’s “Show layout bounds” developer option. The main difference is that you can show bounds only for specific views.
Under the hood, Probe uses Google’s DexMaker to generate dynamic View proxies during layout inflation. The stock ProxyBuilder implementation was not good enough for Probe because I wanted to avoid using reflection entirely after the proxy classes were generated. So I created a specialized View proxy builder that generates proxy classes tailored for Probe’s use case.
This means Probe takes longer than your usual LayoutInflater to inflate layout resources. There’s no use of reflection after layout inflation though. Your views should perform the same. For now, Probe is meant to be a developer tool only and I don’t recommend using it in production.
The code is available on Github. As usual, contributions are very welcome.
Introducing dspec
8 de Setembro de 2014, 10:52 - sem comentários aindaWith all the recent focus on baseline grids, keylines, and spacing markers from Android’s material design, I found myself wondering how I could make it easier to check the correctness of my Android UI implementation against the intended spec.
Wouldn’t it be nice if you could easily provide the spec values as input and get it rendered on top of your UI for comparison? Enter dspec, a super simple way to define UI specs that can be rendered on top of Android UIs.
Design specs can be defined either programmatically through a simple API or via JSON files. Specs can define various aspects of the baseline grid, keylines, and spacing markers such as visibility, offset, size, color, etc.
Given the responsive nature of Android UIs, the keylines and spacing markers are positioned in relation to predefined reference points (e.g. left, right, vertical center, etc) instead of absolute offsets.
The JSON files are Android resources which means you can easily adapt the spec according to different form factors e.g. different specs for phones and tablets. The JSON specs provide a simple way for designers to communicate their intent in a computer-readable way.
You can integrate a DesignSpec with your custom views by drawing it in your View‘s onDraw(Canvas) method. But the simplest way to draw a spec on top of a view is to enclose it in a DesignSpecFrameLayout—which can take an designSpec XML attribute pointing to the spec resource. For example:
<DesignSpecFrameLayout android:layout_width="match_parent" android:layout_height="match_parent" app:designSpec="@raw/my_spec"> ... </DesignSpecFrameLayout>
I can’t wait to start using dspec in some of the new UI work we’re doing Firefox for Android now. I hope you find it useful too. The code is available on Github. As usual, testing and fixes are very welcome. Enjoy!
DebConf 14: Community, Debian CI, Ruby, Redmine, and Noosfero
1 de Setembro de 2014, 22:46 - sem comentários aindaThis time, for personal reasons I wasn’t able to attend the full DebConf, which started on the Saturday August 22nd. I arrived at Portland on the Tuesday the 26th by noon, at the 4th of the conference. Even though I would like to arrive earlier, the loss was alleviated by the work of the amazing DebConf video team. I was able to follow remotely most of the sessions I would like to attend if I were there already.
As I will say to everyone, DebConf is for sure the best conference I have ever attended. The technical and philosophical discussions that take place in talks, BoF sessions or even unplanned ad-hoc gathering are deep. The hacking moments where you have a chance to pair with fellow developers, with whom you usually only have contact remotely via IRC or email, are precious.
That is all great. But definitively, catching up with old friends, and making new ones, is what makes DebConf so special. Your old friends are your old friends, and meeting them again after so much time is always a pleasure. New friendships will already start with a powerful bond, which is being part of the Debian community.
Being only 4 hours behind my home time zone, jetlag wasn’t a big problem during the day. However, I was waking up too early in the morning and consequently getting tired very early at night, so I mostly didn’t go out after hacklabs were closed at 10PM.
Despite all of the discussion, being in the audience for several talks, other social interactions and whatnot, during this DebConf I have managed to do quite some useful work.
debci and the Debian Continuous Integration project
I gave a talk where I discussed past, present, and future of debci and the Debian Continuous Integration project. The slides are available, as well as the video recording. One thing I want you to take away is that there is a difference between debci and the Debian Continuous Integration project:
-
debci is a platform for Continuous Integration specifically tailored for the Debian repository and similar ones. If you work on a Debian derivative, or otherwise provides Debian packages in a repository, you can use debci to run tests for your stuff.
- a (very) few thinks in debci, though, are currently hardcoded for Debian. Other projects using it would be a nice and needed peer pressure to get rid of those.
-
Debian Continuous Integration is Debian’s instance of debci, which currently runs tests for all packages in the unstable distribution that provide
autopkgtest
support. It will be expanded in the future to run tests on other suites and architectures.
A few days before DebConf, Cédric Boutillier managed to extract gem2deb-test-runner
from gem2deb
, so that autopkgtest
tests can be run against any Ruby package that has tests by running gem2deb-test-runner --autopkgtest
. gem2deb-test-runner
will do the right thing, make sure that the tests don’t use code from the source package, but instead run them against the installed package.
Then, right after my talk I was glad to discover that the Perl team is also working on a similar tool that will automate running tests for their packages against the installed package. We agreed that they will send me a whitelist of packages in which we could just call that tool and have it do The Right Thing.
We might be talking here about getting autopkgtest
support (and consequentially continuous integration) for free for almost 2000 4000 packages. The missing bits for this to happen are:
- making debci use a whitelist of packages that, while not having the appropriate
Testsuite: autopkgtest
field in the Sources file, could be assumed to haveautopkgtest
support by calling the right tool (gem2deb-test-runner
for Ruby, or the Perl team’s new tool for Perl packages). - make the
autopkgtest
test runner assume a corresponding, implicit,debian/tests/control
when it not exists in those packages
During a few days I have mentored Lucas Kanashiro, who also attended DebConf, on writing a patch to add support for email notifications in debci so maintainers can be pro-actively notified of status changes (pass/fail, fail/pass) in their packages.
I have also started hacking on the support for distributed workers, based on the initial work by Martin Pitt:
- updated the
amqp
branch against the code in the master branch. - added a
debci enqueue
command that can be used to force test runs for packages given on the command line. - I sent a patch for librabbitmq that adds support for limiting the number of messages the server will send to a connected client. With this patch applied, the debci workers were modified to request being sent only 1 message at a time, so late workers will start to receive packages to process as soon as they are up. Without this, a single connected worker would receive all messages right away, while a second worker that comes up 1 second later would sit idle until new packages are queued for testing.
Ruby
I had some discusion with Christian about making Rubygems install to $HOME
by default when the user is not root
. We discussed a few implementation options, and while I don’t have a solution yet, we have a better understanding of the potential pitfalls.
The Ruby BoF session on Friday produced a few interesting discussions. Some take away point include, but are not limited to:
- Since the last DebConf, we were able to remove all obsolete Ruby interpreters, and now only have Ruby 2.1 in unstable. Ruby 2.1 will be the default version in Debian 8 (jessie).
- There is user interest is being able to run the interpreter from Debian, but install everything else from Rubygems.
- We are lacking in all the documentation-related goals for jessie that were proposed at the previous DebConf.
Redmine
I was able to make Redmine work with the Rails 4 stack we currently have in unstable/testing. This required using a snapshot of the still unreleased version 3.0 based on the rails-4.1
branch in the upstream Subversion repository as source.
I am a little nervous about using a upstream snapshot, though. According to the "roadmap of the project ":http://www.redmine.org/projects/redmine/roadmap the only purpose of the 3.0 release will be to upgrade to Rails 4, but before that happens there should be a 2.6.0 release that is also not released yet. 3.0 should be equivalent to that 2.6.0 version both feature-wise and, specially, bug-wise. The only problem is that we don’t know what that 2.6.0 looks like yet. According to the roadmap it seems there is not much left in term of features for 2.6.0, though.
The updated package is not in unstable yet, but will be soon. It needs more testing, and a good update to the documentation. Those interested in helping to test Redmine on jessie before the freeze please get in touch with me.
Noosfero
I gave a lighting talk on Noosfero, a platform for social networking websites I am upstream for. It is a Rails appplication licensed under the AGPLv3, and there are packages for wheezy. You can checkout the slides I used. Video recording is not available yet, but should be soon.
That’s it. I am looking forward to DebConf 15 at Heidelberg. :-)