A palestra do Chris Hofmann (Mozilla) e outros destaques do 2º dia do 12º FISL

A palestra do Chris Hofmann, da Mozilla Foundation, superou minhas expectativas. Acho que não esperava muito por causa de traumas com gringos que vem falar em nome de programas grandes/populares e acabam decepcionando. Mas é claro que com a Mozilla tinha que ser diferente. Chris contou a história do Firefox justificando a necessidade de sua existência desde que foi criado (época em que o Internet Explorer representava mais de 95% dos navegadores e parecia impossível inovar a web) até hoje, quando as empresas (e os navegadores escritos por elas) cada vez mais ignoram a privacidade de seus usuários. Comprovou esse ponto com duas citações, uma do CEO do Google e outra do CEO do Facebook (Eric Schmidt e Mark Zuckerberg, respectivamente), que mostravam seu total desprezo pelos dados que compartilhamos nesses sites.

Prosseguindo nesse sentido, ele fez o paralelo entre uma proposta do congresso dos Estados Unidos em 2001 (que propunha que o governo controlasse e-mails, documentos, cartão de crédito e sites acessados pelos usuários) com o Google de hoje (Google Mail, Google Docs, Google Checkout, Google Analytics — respectivamente). A partir daí, falou do funcionamento do Firefox Sync, que, diferentemente do sincronizador do Chrome, criptografa as informações antes de mandar para o servidor (portanto, deixando a Mozilla sem acesso aos dados dos usuários) e também fez um apelo para que usemos a checkbox “I do not want my data to be tracked” dos novos Firefox para que ao menos mandemos uma mensagem para os sites dizendo que não estamos de acordo com a forma como elas estão nos vigiando nesses tempos. Sua fala foi um bom complemento ao que o Alexandre Oliva (da Free Software Foundation) colocou ontem, sobre a violação de privacidade que tem aumentado muito também nos sistemas operacionais de telefones celulares.

Chris concluiu agradecendo e incentivando os presentes a continuar espalhando o Firefox ajudando seus parentes e amigos a migrarem, usando versões beta, reportando bugs, ajudando com traduções e se envolvendo mais com a comunidade Mozilla.

Outros destaques, curiosidades e citações aleatórias

  1. O Irmão Pedro Ost definiu software livre de uma forma legal: “Em vez de eu me adaptar ao programa que vem, o programa tem que se adaptar à minha realidade.”
  2. Jacob Appelbaum falaria sobre o projeto Tor e sobre censura na internet. Provavelmente teria sido uma palestra interessantíssima — eu esperava que fosse uma das melhores deste FISL, ainda mais pelas coisas recentes que aconteceram no mundo –, mas infelizmente seu avião atrasou. Por conta disso, Jeremy Allison, do Samba e do Google, fez uma palestra sugerindo cloud computing para substituir sistemas de arquivos em rede (NFS, Samba). Eles seriam baseados em busca (no lugar de sistemas de arquivos baseados em árvores de diretórios). A ideia de basear sistemas de arquivos em buscas é divertida, mas a sugestão de manter seus dados longe é preocupante, ainda mais vinda de um funcionário do Google.
  3. Esperava muito mais da mesa sobre ética hacker com Sérgio Amadeu, Alexandre Oliva e Nelson Pretto. Pelos nomes e pelo tema, esperava que fosse um dos grandes eventos deste FISL, mas não foi nada demais. Uma fala curiosa do Sérgio: “O hacker é um individualista, mas não é o individualista que a cultura de massa criou. É um individualista colaborativo. Se realiza quando consegue enfrentar o desafio e compartilhar com os outros.”
  4. Foi bastante interessante a palestra do Deivi Lopes Kuhn sobre software livre no governo federal. Anotei algumas coisas e vou deixar pra sistematizar e publicar comentários em breve, num post a parte (devido à densidade do conteúdo).

Destaques do 1º dia do 12º Fórum Internacional do Software Livre

Seguem alguns registros aleatórios do que vi no primeiro dia (29/06) deste FISL em Porto Alegre.

Software livre

“Debater software livre não é discutir trocar Windows pra Linux. Isso é o de menos. Debater, e mais importante, militar pelo software livre, é criar redes para transformar o mundo.”

(Wilkens Lenon)

“A liberdade de software não é útil só pra quem escreve o programa, mas para todos, da mesma forma que a liberdade de imprensa não é útil só pra quem escreve, mas pra todos, porque você pode escolher o que escutar (ou o que usar).”

(Alexandre Oliva)

Cloud computing

“Onde há nuvem há tempestade. Computação em nuvem é pior do que computação privativa porque você não tem nenhuma das quatro liberdades. Mais que isso: além de não ter acesso ao programa, você não tem acesso aos seus dados.”

(Alexandre Oliva)

“Software livre rodando na nuvem é tão maléfico quanto software proprietário rodando na nuvem.”

(Rodrigo R. Silva)

Sobre Flash

“O Gnash é uma máquina virtual. O Gnash não é solução, nem que funcione. A solução é não precisar rodar uma aplicação alienígena no seu computador para assistir um vídeo.”

(Felipe Sanches)

Formatos fechados

“Delimitam, controlam, bloqueiam, aprisionam e criam dependência. Documentos não são como blocos de papel: daqui a 10 anos eu consigo ler o que está escrito num papel, mas dependo de uma empresa pra conseguir ler um formato fechado.”

(Sérgio Amadeu)

Além das citações

  1. Numa mesa sobre educação e inclusão digital, Sady Jacques mencionou que seria interessante ter fundamentos de ciência da computação nas escolas. É algo que eu acho muito importante e, entre o pessoal de OBI/Maratona, discutimos com frequência. Surgiu a ideia de lançar um abaixo-assinado.
  2. No Encontro de Hackers GNU+Linux-libre, foi discutida a importância de termos firmwares livres. Recomendou-se enviar e-mails para as empresas cobrando o código dos firmwares.
  3. Na audiência pública com Tarso Genro, Alexandre Oliva citou por minutos problemas que governos e pessoas tiveram confiando em software proprietário. São bons exemplos para habituais discussões. Não lembro de todos, mas aqui vão alguns: a guerra entre Argentina e Inglaterra em que os mísseis (comprados da França) não funcionavam contra navios ingleses; a Microsoft ter usado criptografia com apenas 40 bits nos computadores dos usuários durante anos, permitindo que o governo americano descriptografasse o que os usuários de Windows faziam; recentemente espionando conversas no Skype; o Gmail ter um backdoor para o governo dos EUA (que China usou para invadir recentemente); a Sony processando pessoas que descobriram como usar um computador para instalar o que quisessem nele (o Playstation 3); a Nintendo destruindo videogames a distância; a Amazon deletando e-books do Kindle a distância (ironicamente, o livro 1984); o iPhone e o Android anotando todos os lugares por onde o usuário passa junto com informações sobre redes sem fio e mandando para a Apple / o Google; o celular distribuído para crianças com câmera acionada pela sua escola.
  4. Na mesma audiência, Sérgio Amadeu falou da importância que tem os governos abrirem seus bancos de dados e todas as informações que têm em formato aberto e em redes P2P, sugerindo uma democracia radical em que todos os usuários da internet possam baixar rápido e processar as informações (data mining), de forma que grupos organizados (e desorganizados) possam controlar gastos e decisões públicas. Ideia interessante. Outras ideias interessantes da mesma fala, para pensar mais a respeito: analogia entre rede elétrica e a internet (alguém controla se você liga um liquidificador ou um chuveiro?); recursos educacionais abertos (professores remixam o material que usam); biotecnologia de garagem (nunca escrevi ou pesquisei muito sobre o tema, que é uma aplicação legal da cultura hacker fora do computador).

Você patentearia o Sol?

Assisti esses dias Capitalismo: uma história de amor do Michael Moore (que, aliás, recomendo muito) e um momento do filme me chamou especial atenção:

O Dr. Jonas Salk passou todo seu tempo pondo rins de macaco num liquidificador tentando achar a cura para a pólio. Quando conseguiu, ele decidiu fornecê-la de graça. Esse homem podia ter sido muito rico se tivesse vendido sua vacina a uma empresa farmacêutica, mas ele achava que seu talento deveria ser usado para o bem comum e o salário que ele ganhava como médico e professor era suficiente para ele ter uma vida confortável.

— Quem possui a patente desta vacina?

— Bem… eu diria que o povo. Não há patente. Você patentearia o Sol?

É… Longe se vai a época do Dr. Salk, pois hoje nossas melhores mentes são empregadas em outra coisa. Para onde enviamos os melhores em matemática e ciências?

Triângulo de Pascal mod m

Este post possui intencionalmente apenas imagens e códigos.

Uso do programa que gera triângulo de Pascal mod m

Triângulo de Pascal mod 2

Triângulo de Pascal mod 3

Triângulo de Pascal mod 5

Triângulo de Pascal mod 7

Triângulo de Pascal mod 12

Triângulo de Pascal mod 23

Código-fonte (com alguns bugs inofensivos — procure XXX)

/* pascal -- generate colored Pascal's triangles in XPM format

   Copyright (C) 2011 Tiago Madeira <madeira@ime.usp.br>

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You can read a copy of the GNU General Public License at
   http://www.gnu.org/licenses/gpl-3.0.txt */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
#include <math.h>

#define DEFMOD 2
#define DEFSIZE 300
#define DEFPADDING 8

int mod = DEFMOD;
int size = DEFSIZE;
int padding = DEFPADDING;

char makecolors[6][4] = {
	"001", "010", "100", "110", "101", "001"
};

struct option longopts[] = {
	{"help", 0, 0, 'h'},
	{"padding", 1, 0, 'p'},
	{"size", 1, 0, 's'},
	{"mod", 1, 0, 'm'},
	{0, 0, 0, 0}
};

char *program_name;

void try_help() {
	fprintf(stderr, "Try `%s --help' for more information.\n", program_name);
}

void help() {
	printf("Usage: %s [OPTION]... [FILE]\n", program_name);
	printf("Generate colored Pascal's triangles (XPM format).\n\n");
	printf("Mandatory arguments to long options are mandatory for short options too.\n\n");
	printf("  -h, --help        print this help\n");
	printf("  -m, --mod=M       paint with different colors numbers mod M\n");
	printf("  -p, --padding=SZ  image padding (margin) in pixels\n\n");
	printf("  -s, --size=SZ     generate SZ lines of Pascal's triangle\n\n");
	printf("With no FILE, or when FILE is -, write to standard output.\n\n");
	printf("Report bugs to <madeira@ime.usp.br>.\n");
}

int baselog(int n, int base) {
	return ceil(log(n) / log(base));
}

void *xmalloc(size_t size) {
	void *x = malloc(size);
	if (x == NULL) {
		fprintf(stderr, "There is no enough memory to allocate.\n");
		exit(3);
	}
	return x;
}

int main(int argc, char **argv) {
	int optc, tofile;
	int i, j;
	int width, height, chars;
	char **color, rgb[7];
	int one, pos;
	int *pascal;
	char *line;

	program_name = argv[0];
	while ((optc = getopt_long(argc, argv, "hm:p:s:", longopts, (int *)0)) != -1) {
		switch (optc) {
		case 'h':
			help();
			return 0;
		case 'm':
			mod = atoi(optarg);
			if (mod > 48) { /* XXX */
				fprintf(stderr, "At the moment, this program supports only mod <= 48 (color generation limit).\n");
				return 4;
			}
			if (mod > 26) { /* XXX */
				fprintf(stderr, "At the moment, this program supports only mod <= 26 (bad implementation limit).\n");
				return 5;
			}
			break;
		case 'p':
			padding = atoi(optarg);
			break;
		case 's':
			size = atoi(optarg);
			break;
		default:
			try_help();
			return 1;
		}
	}
	if (optind < argc && strcmp("-", argv[optind])) {
		if (freopen(argv[optind], "w", stdout) == NULL) {
			fprintf(stderr, "Can't open `%s' for writing.\n", argv[optind]);
			return 2;
		}
		tofile = 1;
	} else {
		tofile = 0;
	}

	printf("static char *a_xpm[] = {\n");
	width = size * 2 + padding * 2;
	height = size * 2 + padding * 2;
	chars = baselog(mod, 26);
	printf(""%d %d %d %d",\n", width, height, mod + 1, chars);
	color = xmalloc(sizeof(color[0]) * (mod+1));
	rgb[6] = '�';

	printf("\"");
	color[mod] = xmalloc(sizeof(color[mod][0]) * (chars + 1));
	for (j = 0; j < chars; j++) {
		color[mod][j] = ' ';
	}
	color[mod][chars] = '�';
	printf("%s c #000000\",\n", color[mod]);

	for (i = 0; i < mod; i++) {
		color[i] = xmalloc(sizeof(color[i][0]) * (chars + 1));
		if (i == 0) {
			for (j = 0; j < chars; j++) {
				color[i][j] = 'a';
			}
			color[i][chars] = '�';
		} else {
			strcpy(color[i], color[i-1]);
			for (j = chars-1; j >= 0; j--) {
				if (color[i][j] == 'z') {
					color[i][j] = 'a';
				} else {
					color[i][j]++;
					break;
				}
			}
		}
		one = 255 / pow(2, i / 6);
		sprintf(rgb, "%02x%02x%02x", makecolors[i%6][0] == '1' ? one : 0,
				makecolors[i%6][1] == '1' ? one : 0, makecolors[i%6][2] == '1' ? one : 0);
		printf("\"%s c #%s\",\n", color[i], rgb);
	}

	line = xmalloc(sizeof(line[0]) * (width+1));
	pascal = xmalloc(sizeof(pascal[0]) * size);

	line[width] = '�';
	for (j = 0; j < width; j++) {
		line[j] = ' ';
	}
	for (i = 0; i < padding; i++) {
		printf("\"%s\",\n", line);
	}

	memset(pascal, 0, sizeof(pascal[0]) * size);
	pascal[0] = 1;

	for (i = 0; i < size; i++) {
		for (j = i; j >= 0; j--) {
			if (j != 0) {
				pascal[j] = (pascal[j-1] + pascal[j]) % mod;
			}
			pos = padding + 2*j + (size - 1 - i);
			/* XXX a implementacao de line ficou toda errada e so estou pegando
			 * o primeiro caractere de color aqui. precisa ser reescrito. */
			line[pos] = line[pos+1] = *color[pascal[j]];
		}
		printf("\"%s\",\n\"%s\"%s\n", line, line, i == size-1 && !padding ? "" : ",");
	}

	line[width] = '�';
	for (j = 0; j < width; j++) {
		line[j] = ' ';
	}
	for (i = 0; i < padding; i++) {
		printf("\"%s\"%s\n", line, i == padding-1 ? "" : ",");
	}
	printf("};\n");

	if (tofile) {
		fclose(stdout);
	}
	return 0;
}

(Download – 5kb)

© 2005–2020 Tiago Madeira