As abordagens

Escola pública

Em preparação para a minha talk no Pixels Camp, e porque no Ministério da Educação estão todos muito ocupados para responder a e-mails de cidadãos comuns, contactei um professor de TIC que está a ministrar iniciação à programação no 1º ciclo. Isto é um projecto-piloto de dois anos, iniciado em 2015, cuja documentação, incluindo o conteúdo programático, podem encontrar aqui.

O professor Nuno Cunha, do Agrupamento de Escolas de Morgado de Mateus, Vila Real, teve a simpatia de me receber na escola e de trocar alguns e-mails sobre o assunto.

Voluntariado num colégio privado

Durante o Pixels Camp, tive o prazer de conhecer Gaspar D'Orey, que dispensa algum do seu tempo livre para ensinar iniciação à programação a crianças em final de pré-escolar, num colégio privado do Porto, em regime de voluntariado.

Foi uma proposta do próprio ao colégio que fosse iniciado o ensino da programação a crianças; vendo-se o colégio a braços com a escassez orçamental que é transversal no nosso país, propôs este regime de voluntariado.

CoderDojo

O CoderDojo é um movimento global de ensino de programação a crianças e jovens, gratuito, com mentores em regime de voluntariado. Em Portugal existem apenas 10: 3 em Lisboa, e depois em Lagoa (Açores), Beja, Abrantes, Santa Maria da Feira, Porto, Vila do Conde e Braga.

Este último é apoiado de forma mais ou menos oficiosa pelo Departamento de Informática da Universidade do Minho e pelo CeSIUM (Centro de Estudantes de Engenharia Informática), e os mentores são precisamente estudantes.

Já conhecia o Fernado Mendes de algumas edições do Codebits, mas só soube que ele era mentor do CoderDojo – ou que o CoderDojo existia – durante este Pixels Camp.

Irrita-me um bocadinho que uma coisa destas não exista em cidades e junto de universidades com tradição nas ciências da computação (looking at you, UA).

Para quem

Nas escolas, o programa incide sobre alunos dos 3º e 4º anos. Na área em questão (interior norte, crianças maioritariamente de contextos rurais), as crianças eram, no geral, oriundas de famílias de baixos rendimentos e de baixa literacia tecnológica.

No Porto, as crianças são do pré-escolar, entre os 3 e os 5 anos. Sendo um colégio privado numa grande zona metropolitana, as crianças são de famílias de classe média alta e superior, onde será expectável que a literacia tecnológica seja maior.

O CoderDojo de Braga abrange crianças e jovens entre os 7 e os 17, mas há uma maior incidência, embora ligeira, no segmento entre os 9 e os 12. Não há dados sobre o estrato social maioritário, mas o Fernando indica que todos trazem computador de casa, seja próprio, seja dos pais, pelo que deverá começar na classe média baixa. Também indica que a maior parte sente-se muito à vontade com um computador, donde podemos assumir que a literacia tecnológica deverá ser, pelo menos, média.

Uma constante das três abordagens é a completa ausência de distinção entre géneros. Em nenhum deles foi notado que as meninas fossem menos capazes, interessadas ou motivadas que os rapazes.

O interesse das crianças é bastante alto também nas três abordagens. Devido ao formato diferente do CoderDojo, o interesse descai ligeiramente ao longo do tempo, enquanto nos outros se mantém, graças ao seguimento encadeado de actividades e conteúdos.

Onde e como

Foi dado às escolas públicas alguma autonomia sobre como deveriam implementar o projecto-piloto. No Agrupamento Morgado de Mateus, optou-se por leccionar esta matéria como se fosse um actividade extra-curricular, isto é, depois das horas de aulas normais, tendo 90 minutos por semana.

Apesar de não ser obrigatório, todas as crianças quiseram comparecer. Optaram também por entregar esta função a um professor de TIC – o que me parece que faz todo o sentido.

O programa curricular é sugerido na página do projecto, mas, sendo um projecto-piloto, as escolas têm alguma margem para implementação do mesmo, até para poder sugerir alterações no final do mesmo.

No colégio no Porto, o Gaspar passa algumas horas de almoço com as crianças. Habitualmente, seja em colégios, instituições ou na escola pública, as horas de almoço são bem maiores do que o necessário para as crianças almoçarem, pelo que este regime resulta em tempo suficiente para estas actividades.

Os professores e educadores gostam da iniciativa e têm ajudado bastante, revelando também curiosidade. Não existe um programa curricular formal, mas estão a ser seguidas as orientações do software usado (ver mais abaixo).

O CoderDojo tem um funcionamento mais aberto – como os eventos são, em teoria, numa base first-come, first-served, não é garantido que os ninjas (assim se chamam os “alunos”) dum evento sejam os mesmo de outro. Por esse motivo, não existe de todo um fio condutor programático, mas estão a estudar formas de introduzir uma forma dos ninjas que queiram vir de forma contínua possam ter uma noção de progresso.

Os eventos regulares têm duas horas, de três em três semanas, no Departamento de Informática da Universidade do Minho, ao sábado de manhã. De três em três meses, existem uns eventos especiais, para maior contacto com o público em geral, no edifício GNRation, em Braga.

O quê e com quê

O professor Nuno Cunha está a seguir – com algumas adaptações – o sugerido na página do projecto-piloto. No entanto, devido à baixa literacia tecnológica dos alunos, foi perdido (ou investido, talvez seja melhor o termo) algum tempo no início do ano lectivo para que os alunos compreendessem conceitos básicos, como guardar o trabalho para continuar na sessão seguinte.

Está a usar fundamentalmente o Scratch, e alguns conteúdos do Code.org, quando possível. A ambientação ao Windows e a ferramentas do Office faz parte do currículo e também foi abordada.

A escola tinha alguns equipamentos remanescentes do programa Magalhães, e foi esse o hardware usado, depois de formatados e instalado o software necessário. O Ministério da Educação não se ofereceu para renovar o parque informático desta escola em particular, ignoro se o fez para outras escolas que quiseram participar.

O Gaspar está a usar o Scratch Jr, o que é apropriado para crianças tão novas. Como funciona como app completamente isolada, e como as crianças ainda tão novas não precisam propriamente de ter cada uma o seu tablet e de gravar o seu progresso individual, é muito fácil levar o tablet dele e mais dois ou três que pede emprestados no próprio dia.

O facto de ser necessário um tablet (iOS ou Android) poderá impedir algumas classes mais baixas de usufruir desta ferramenta extraordinária, mas num colégio privado não será um problema se as crianças quiserem continuar a explorar em casa.

Está a seguir as actividades propostas no próprio site do Scratch Jr.

O CoderDojo navega mais ao sabor daquilo que os participantes procuram. Habitualmente é usado o Scratch para iniciação, depois alguns jogos lógicos, como o Lightbot e o CodeCombat, mas também já se passou por HTML e CSS, Python e até Bash; também há sempre alguém que quer experimentar a brincadeira dos pop-ups infinitos em VB.

Os ninjas trazem as suas máquinas, mas o CeSIUM tem sido uma ajuda preciosa com Raspberry Pi, Arduinos, um eventual monitor e teclado que falta. Também estas múltiplas valências de plataformas, nomeadamente ao nível da computação física ajudam a manter o interesse alto.

Em conclusão

Que o ensino de programação a crianças é fundamental para hoje e para o futuro parece-me indiscutível e já aceite pelos governantes.

Um tema desta natureza tem que ser abordado ao nível do Estado. Não podemos deixar isto apenas nas mãos da boa vontade da sociedade, apesar de parecer que estão a fazer um melhor trabalho. Parece-me que o Estado, por bem intencionado que tenha sido este projecto-piloto, deixou as (poucas) escolas aderentes um bocado ao abandono, nem sequer dando feedback apropriado dos resultados obtidos ao fim do primeiro ano.

Não dotando as escolas dos meios necessários, este projecto ficaria sempre restrito às escolas que já tivessem a capacidade instalada, tanto ao nível dos meios físicos como humanos. Foi uma sorte este agrupamento que abordei ter um professor de TIC disponível e – o que será talvez mais importante – com o que me pareceu ser a motivação e entusiasmo necessário para levar as crianças à descoberta com ele.

Quando – e se – o Estado optar por tornar esta matéria obrigatória universalmente no primeiro ciclo, o trabalho da sociedade não poderá parar. Projectos de voluntariado como o do Gaspar D'Orey continuarão a ser necessários onde o Estado não obrigar, ao nível do pré-escolar e nos primeiros dois anos do primeiro ciclo. Eventos como os do CoderDojo poderão expandir para abordar temáticas não exploradas no ensino formal, como a computação física e a robótica, mantendo o entusiasmo de crianças e jovens para lá do que é obrigatório.

Neste momento, e ainda sem se saber o que vai ser decidido no Ministério da Educação no final deste projecto-piloto, em Junho, estas duas abordagens da sociedade são de enorme importância que continuem a acontecer e a desenvolver-se.

Comentários Nenhum comentário Continuar a ler Continuar a ler »

Já é quase uma tradição que o sistema de votação, pelo menos, soluce durante a apresentação dos projectos. Este ano, estava mesmo engatada, e passou-se rapidamente para um plano B, que consistiu em votar através do Slack, que já estava a ser usado por grande maioria dos participantes (mas não todos).

Isto permitiu que a votação fosse mais transparente este ano. Em anos anteriores, não se tinha acesso às quantidades exactas de votos, apenas a um gráfico, e apenas durante a votação. O Slack permitiu esse acesso este ano.

No entanto, e ao contrário do vocês-sabem-o-quê, este ano os prémios do público e do júri estavam misturados. Não existia um conjunto de prémios do júri, completamente separados dos prémios do público. Pior, não houve, e continua sem haver, qualquer indicação de quais são quais, embora uma análise da votação, que é pública, e dos prémios atribuídos, faça concluir facilmente a maioria dos atribuídos pelo júri.

Mais, o método segundo o qual foram seriados os projectos não foi divulgado, senão pós-facto. Como a solução foi de recurso, até se podia admitir que não fosse possível divulgar – mas como tanto o plano A como o B se baseavam em votos positivos e negativos, o método teria de ser o mesmo.

Acabou por ser divulgado que a seriação foi por (positivos – negativos), o que me parece injusto. Em teoria, para mim, devia ter sido usado um rácio, ((positivos – negativos) / (positivos + negativos)), o que levaria em conta que as pessoas não votam pelas mais variadas razões – por exemplo, enquanto estive na fila para apresentar o nosso, deixei de votar numa carrada de projectos, simplesmente porque tinha as mãos ocupadas.

Não é que os resultados da competição sejam por aí além importantes; afinal, os prémios (sobretudo este ano) não são qualquer coisa de extraordinário.

Mas é o princípio da transparência. Basta que indiquem à priori quais os prémios do júri e do público e qual a fórmula de cálculo para a seriação dos votos do público.

Podemos discutir os méritos desta ou daquela forma de votação, se uma fórmula é mais ou menos justa que outra, mas se as regras estiverem definidas à partida, estas discussões são meramente académicas e até saudáveis. Assim, ao suscitar este tipo de discussão, a organização tornou-se desnecessariamente defensiva, quando ninguém estava a acusar de nada – estávamos a discutir metodologias, que é uma coisa que os developers fazem amiúde, por nenhuma razão em particular.

Comentários Nenhum comentário Continuar a ler Continuar a ler »

O Bruno Barão é um habitué destas andanças e, nos últimos anos, tem pertencido à organização. Tendo passado para a Bright Pixel, também este ano estava na organização, devidamente identificado com uma camisola amarela específica, como muitos outros.

O Bruno Barão é um tipo porreiro como, aliás, a esmagadora maioria do pessoal que organiza estas coisas. Pela minha experiência, são mesmo todos.

O Bruno Barão tinha um projecto para apresentar no final do Pixels Camp. Legitimamente. Não há nada que impeça um organizador de também participar na competição. E nunca deverá haver. Não faz sentido. Isto não é um sorteio, é uma competição baseada no mérito da ideia e da implementação, e não tem jeito nenhum tentar impedir uma pessoa, que por acaso está na organização, de ter boas ideias.

O Bruno Barão achou por bem trocar de camisola, para uma genérica, durante a apresentação dos projectos. Para evitar comentários.

O problema não é dele. Algo está errado na nossa comunidade, tão ligada ao movimento open-source, tão assente no cooperativismo, que força uma pessoa como o Bruno a sentir que deve demarcar-se da organização para participar na competição.

Não é ele; somos nós. E devíamos reflectir sobre isso.

Comentários Nenhum comentário Continuar a ler Continuar a ler »

A comida era uma queixa habitual em vocês-sabem-o-quê e, nesta nova iteração, não foi excepção. Imensa gente a queixar-se da comida, e a senha e contra-senha “o que é a comida? noodles” tornou-se uma espécie de inside joke.

Habitualmente não me queixo da comida. Primeiro, porque é à borla, e to horse given, one doesn't look at the teeth. Segundo, porque normalmente é hambúrgueres e pizza, que eu como com afinco. Em terceiro porque, não sendo muito, também nunca passei fome.

Até este ano.

Reparem, foi inteiramente culpa minha com, talvez, um cheirinho de sub-dimensionamento por parte da organização e alguma imposição por parte de um parceiro em particular.

Eu nunca tinha comido noodles, mas a Rosana tinha-me garantido que a coisa era boa, pelo que avancei confiante ao almoço do primeiro dia e, efectivamente, a coisa até é jeitosa. Agora… para um almoço, parece-me que não puxa grande carroça. Afinal, aquilo é praticamente só massa (ah, e tal, hidratos de carbono – screw you, quero carne!). Mas pronto, experimentou-se, é porreiro. Fixe para ter em casa e comer no sofá durante maratonas de Mr. Robot. Ok, no sofá não, que aquilo respinga por todos os lados. Mas em casa, ao fim da noite, enrolado numa manta.

No segundo dia, e por força de ter a minha talk às 14, optei por almoçar só depois. Só que o “depois”, com a talk e as pessoas que quiseram ficar a conversar comigo, foi só já depois das 16. Quando cheguei lá acima, onde imaginei alguns hambúrgueres à minha espera… já só havia noodles. Passei a coisa e comi umas bolachas que tinham sobrado do pequeno-almoço. No último dia ao almoço, noodles outra vez. Voltei a passar e comi mais bolachas.

Outras coisas que costumavam haver com abundância no vocês-sabem-o-quê eram barras de cereais e fruta, em especial maçãs – que é substituto muito competente para o café e Red Bull. Este ano, nada.

A malta compreende que o investidor é novo nestas andanças, e que se calhar não está disposto a enterrar já uma pipa de massa sem perceber como é que isto funciona e que vantagens é que tem um evento destes. Mas a paparoca… é preciso rever.

Comentários Nenhum comentário Continuar a ler Continuar a ler »

O melhor de eventos deste tipo é falar com pessoas. As mais variadas pessoas.

Nesse aspecto, até sinto que este Pixels Camp foi melhor do que eventos anteriores. Falei com imensa gente, de vários backgrounds. Tenho pena de não ter falado com ainda mais. Dos mais importantes ao participante anónimo, há sempre ideias para trocar e coisas para aprender. A malta é, no geral, genial.

Desde a rapaziada brilhante da UMinho, com o Fernando Mendes à cabeça, passando pelo tech-evangelist e mágico José de Castro (se não sabem o que é que estas duas coisas têm em comum, há-de aparecer uma keynote dele no YouTube), a doutoranda em bioengenharia Cátia Bandeiras, para já nem falar da malta da organização e dos lagostas (sabes que isto é um ícone do evento quando as localizações dentro do espaço têm como referencial as mesas deles), e imensas outras pessoas que de certeza me estou a esquecer.

Coloca a visão que tens de ti e do teu trabalho um bocado em perspectiva. Saio sempre de lá com um bocado de impostor syndrome e este ano não foi excepção. Não é uma coisa má: é uma motivação extra para te manteres actualizado e informado.

Comentários Nenhum comentário Continuar a ler Continuar a ler »

Melhor Pixels Camp de sempre, mas só porque foi o primeiro, ou como uma série de acontecimentos infelizes me deram a pior experiência que já tive em eventos vocês-sabem-qual.

Quando apanhei a ligação errada na Estação do Oriente, para Alcântara-Terra, e acabei perplexo num comboio vazio em Santa Apolónia, devia ter adivinhado que estes três dias não me iam correr de feição. Podia ter apanhado outro de volta, mas ia chegar atrasadíssimo e pensei, que se lixe, apanho já aqui um Uber.

Depois de quase 40 minutos para percorrer menos de 6 quilómetros (hey, Medina, bom trabalho, hein? mais valia ir a pé), a Lx Factory, que não conhecia, surpreendeu-me bastante. Nessa manhã, e nalguns momentos dos dois dias a seguir, explorei os vários espaços e a fauna que por lá anda a várias horas – muitos aspirantes a pintores nas manhãs e tardes, hipsters de vários géneros à tarde e a habitual mistura de juventude boémia à noite. Alguns bares e restaurantes com bom aspecto, um infelizmente solitário e com horário pouco amigável quiosque onde comprar tabaco e revistas e até um hostel. Devido à minha terminantemente recusa em beber café em copos de plástico, fui várias vezes a um café logo ao início do espaço onde fui impecavelmente atendido e descaradamente sobre-cobrado.

O espaço do Pixels Camp em si era engraçado. Tem algumas limitações em relação ao último espaço onde foi feito vocês-sabem-o-quê, a Sala Tejo: é mais pequeno (e se isso se notou ao tentar arranjar mesa), o chão não é alcatifa fofinha, mas sim cimento (e quem ficou lá a dormir sentiu isso no pêlo), fazia um calor terrível durante o dia e algum frio durante a noite, o isolamento acústico para quem estava a dar e a assistir às talks foi a miséria do costume (com excepção para o ano dos iglôs).

Mas era engraçado, duma forma industrial-chiq. A zona dos parceiros era arejada e bem iluminada. A área de refeições tinha um terraço fantástico. O acesso à rua era mais rápido e directo (os fumadores agradecem).

A abertura do evento foi excelente. Para além do discurso de abertura do Celso, que, bem, é o Celso, fica-se sempre com um bocado de receio de keynotes que só lá estão porque o parceiro que paga as contas tem que aparecer. Afinal, nada a recear: keynote de Cláudia Azevedo, presidente da Sonae IM, foi não só dada de forma irrepreensível como o conteúdo é muitíssimo relevante. Admito que alguns dos presentes, sobretudo os que ainda estão nos primeiros anos da faculdade, não sintam aquele paleio todo como relevante, mas é bom que abram a pestana rapidamente.

Hei-de fazer outro post com um post-mortem do meu projecto, mas este foi o principal erro que cometi. A ideia era boa (muito boa, tendo em atenção o interesse que gerou e ainda está a gerar), mas eu estava completamente fora de pé. Ainda tentei arranjar um especialista em hardware e um designer, mas só consegui encontrar este último. Nesse outro post hei-de fazer muitos mais louvores à Rosana; para já, vão cuscar o portfólio dela.

Portanto, numa área que não é, de todo, a minha, com um plano praticamente teórico, só comecei a implementar coisas a seguir às keynotes de abertura e do almoço. Afinal, o espírito do evento é esse, mas devia ter experimentado algumas coisas nas semanas antecedentes.

O meu plano funcionava, em teoria: no primeiro dia perdia as duas primeiras horas de talks da tarde para montar tudo e fazer testes preliminares, a seguir ao jantar fazia a maior parte do código, alguns testes iniciais e aproveitava para filmar o video-pitch, no dia a seguir perdia as talks da manhã para fazer a prototipagem final nas peças físicas e depois era cruise-control até à apresentação.

Correu mal. Absurdamente mal. Hardware não é a minha cena, e não funciona como o desenvolvimento de software. O hardware luta activamente contra ti. Houve coisas que eu nem sequer sonhava que pudessem interferir. Houve coisas que aprendi no dia antes. Houve coisas que aprendi no último dia às 13.30 (como que os ATMega têm um oscilador interno de 8MHz – yep, tinha-me dado jeito saber isso na semana antes). Não posso deixar de agradecer aos lagostas Luís Correia e Fernando Afonso, que me ensinaram resmas de coisas nestes três dias.

Acabei por não ver nenhuma talk; nem no primeiro dia, nem em nenhum outro. O projecto absorveu-me completamente e lutei contra ele durante três dias. Cheguei ao final intelectualmente esgotado, com uma cena coxa e cheia de workarounds que funcionava mais ou menos quando lhe apetecia. Antes da apresentação final, só queria que aquilo acabasse depressa, para eu poder vir para casa, e desligar o cérebro com um Você na TV ou algo do género.

Mas não foi tudo. Tinha uma talk para dar no segundo dia. Chego antes da hora, ligo o portátil e… sem sinal. O portátil reconhecia que estava lá outro ecrã, com as dimensões correctas, mas a televisão insistia em dizer que não tinha sinal. Decididamente, aquele portátil está em fim de vida. Muitas trocas de cabos depois, e tenho que usar o portátil do David Oliveira que, sendo o Microsoft-lover que é, nem tem o Libre Office instalado. Acabo por dar a talk com mais de 20 minutos de atraso, em PDF, a toda a velocidade, sem tempo para Q&A porque o próximo speaker já lá estava e não tinha culpa nenhuma.

Várias pessoas gostaram da talk e quiseram conversar comigo no final da talk, no que foi um dos poucos highlights da minha experiência este ano. Aliás, conversar com pessoas é sempre a melhor parte destes eventos.

Outro highlight que não posso deixar de salientar é o sempre hilariante Quiz Show, onde fui indecentemente rasteirado na última pergunta da minha série. Só posso sugerir veementemente que as pessoas participem nestes side quests do Pixels Camp: antes de ir para lá estava no limite das minhas capacidades – fui, sentei-me a ver tudo, participei na minha série, sentei-me a ver o resto; quando voltei, estava bastante mais relaxado e foi aí que consegui implementar alguns workarounds para colocar o projecto a fazer, pelo menos, uma sombra do que tinha planeado.

Ao final do último dia, completamente esgotado, só pensava que, na volta, estou a ficar velho para isto. Agora, passado uma semana, depois de ter descansado, pesando todas as coisas, só penso na edição do próximo ano. Mas sem projecto, ou, pelo menos, com algo que seja mais a minha praia.

Ainda tenho mais coisas para escrever, mas são notas mais concretas e isoladas. E carradas de talks que queria ver e não vi, para assistir no YouTube (obrigado por isto!).

Comentários Nenhum comentário Continuar a ler Continuar a ler »

Depende de onde se vota. Parece impossível, mas os votos de cada português não valem todos o mesmo.

A nossa lei eleitoral determina que os mandatos sejam distribuídos por círculos eleitorais usando o método d'Hondt. Já falei disso aqui, há quatro anos, mas só de passagem.

Por exemplo, um voto em Portalegre só vale 80% do mesmo voto em Lisboa. Os círculos onde um voto vale mais são Setúbal, Lisboa, Porto e Aveiro. Os círculos onde vale menos são Portalegre, Bragança, Évora e Vila Real.

Há um enviesamento claro em relação os círculos mais populosos, com algumas excepções: Setúbal é claramente um outlier nos mais valiosos, Braga é muito equilibrado e Beja é surpreendentemente alto, embora ainda baixo da média.

Distrito Mandatos Média MPV (×100k) MPV/média MPV/Setúbal
Aveiro 16 15.65 2.45 102% 99%
Beja 3 3.09 2.33 97% 94%
Braga 19 18.86 2.41 101% 97%
Bragança 3 3.53 2.03 85% 82%
Castelo Branco 4 4.34 2.20 92% 89%
Coimbra 9 9.36 2.30 96% 93%
Évora 3 3.39 2.12 89% 86%
Faro 9 8.88 2.43 101% 98%
Guarda 4 3.91 2.45 102% 99%
Leiria 10 10.15 2.36 99% 95%
Lisboa 47 45.52 2.47 103% 100%
Portalegre 2 2.42 1.98 83% 80%
Porto 39 38.11 2.45 102% 99%
Santarém 9 9.42 2.29 96% 92%
Setúbal 18 17.38 2.48 104% 100%
Viana do Castelo 6 6.06 2.37 99% 96%
Vila Real 5 5.47 2.19 91% 88%
Viseu 9 8.91 2.42 101% 98%
Açores 5 5.45 2.20 92% 89%
Madeira 6 6.12 2.35 98% 95%

Como podemos ver nesta tabela, a haver justiça, Setúbal, Lisboa e Porto perderiam um mandato (Lisboa até na iminência de perder dois), Bragança ganharia imediatamente um e, para distribuir os outros dois, far-se-iam rondas sucessivas pelos mais penalizados – a saber, Portalegre e Évora.

Portalegre é, de resto, o mais penalizado. Para colocar as coisas em perspectiva, num cenário de batatada (que, afinal, tem muitas semelhanças com um processo eleitoral), para cada quatro lisboetas seriam precisos cinco portalegrenses.

Para mim, este devia ser o primeiro problema a ser atacado numa revisão do nosso sistema eleitoral. Não porque o considere o mais importante, mas apenas porque é o mais fácil de mudar, visto que a Constituição é omissa no que toca ao método de distribuição de mandatos: o n.º 2 do Artigo 249º apenas indica que “o número de Deputados por cada círculo plurinominal do território nacional, exceptuando o círculo nacional, quando exista, é proporcional ao número de cidadãos eleitores nele inscritos.” Não explicita qual o método de distribuição proporcional (ao contrário do n.º 1, relativo à conversão dos votos em mandatos).

Há mais coisas que eu mudaria… mas isso fica para outro dia.

Assim que houver resultados finais, farei uma nova ronda para os eleitores que participaram no acto, para vermos quanto valeu, efectivamente, cada voto depositado.

Notas

  • Podem encontrar abaixo o Javascript que usei para gerar esta tabela;
  • Considerei apenas 226 mandatos – há quatro que estão reservados para a emigração;
  • O número de eleitores por círculo eleitoral é o divulgado pela Comissão Nacional de Eleições para as Legislativas de 2015;
  • Como poderão verificar, implementei a distribuição d'Hondt em vez de usar os mandatos indicados pela CNE – são iguais, mas era só para ter a certeza que a CNE não se tinha enganado…  ;) 
var legislativas2015 = (function() {
    var distritos = [
        {distrito: "Aveiro", eleitores: 653541, mandatos: 0},
        {distrito: "Beja", eleitores: 128971, mandatos: 0},
        {distrito: "Braga", eleitores: 787706, mandatos: 0},
        {distrito: "Bragança", eleitores: 147485, mandatos: 0},
        {distrito: "Castelo Branco", eleitores: 181459, mandatos: 0},
        {distrito: "Coimbra", eleitores: 391029, mandatos: 0},
        {distrito: "Évora", eleitores: 141443, mandatos: 0},
        {distrito: "Faro", eleitores: 370882, mandatos: 0},
        {distrito: "Guarda", eleitores: 163508, mandatos: 0},
        {distrito: "Leiria", eleitores: 423865, mandatos: 0},
        {distrito: "Lisboa", eleitores: 1901335, mandatos: 0},
        {distrito: "Portalegre", eleitores: 101246, mandatos: 0},
        {distrito: "Porto", eleitores: 1591762, mandatos: 0},
        {distrito: "Santarém", eleitores: 393387, mandatos: 0},
        {distrito: "Setúbal", eleitores: 725783, mandatos: 0},
        {distrito: "Viana do Castelo", eleitores: 253271, mandatos: 0},
        {distrito: "Vila Real", eleitores: 228399, mandatos: 0},
        {distrito: "Viseu", eleitores: 371991, mandatos: 0},
        {distrito: "Açores", eleitores: 227486, mandatos: 0},
        {distrito: "Madeira", eleitores: 255748, mandatos: 0}
    ];
    
    var totalEleitores;
    var maxMPV = 0;
    var maxMPVIndex = 0;
    
    function distribuirMandatos() {
        var max, indexMax, tempQuo;

        for (var i = 0; i < 226; i++) {
            max = 0;
            indexMax = 0;
            for (var j in distritos) {
                if (distritos.hasOwnProperty(j)) {
                    tempQuo = distritos[j].eleitores / (distritos[j].mandatos + 1);
                    if (tempQuo > max) {
                        max = tempQuo;
                        indexMax = j;
                    }
                }
            }
            
            distritos[indexMax].mandatos++;
        }
    }
    
    function calcularMandatosPorVoto() {
        totalEleitores = 0;
        for (var j in distritos) {
            if (distritos.hasOwnProperty(j)) {
                totalEleitores += distritos[j].eleitores;
                distritos[j].mpv = distritos[j].mandatos / distritos[j].eleitores;
                if (distritos[j].mpv > maxMPV) {
                    maxMPV = distritos[j].mpv;
                    maxMPVIndex = j;
                }
            }
        }
    }
    
    function output() {
        var medMPV = 226 / totalEleitores;
        var out = "<table id='legislativas2015'><tr>" +
            "<th>Distrito</th>" +
            "<th>Mandatos</th>" +
            "<th>Média</th>" +
            "<th>MPV (×100k)</th>" +
            "<th>MPV/média</th>" +
            "<th>MPV/" + distritos[maxMPVIndex].distrito + "</th></tr>";
        
        for (var i in distritos) {
            if (distritos.hasOwnProperty(i)) {
                out += "<tr>" +
                    "<td>" + distritos[i].distrito + "</td>" +
                    "<td>" + distritos[i].mandatos + "</td>" +
                    "<td>" + (distritos[i].eleitores / totalEleitores * 226).toFixed(2) + "</td>" +
                    "<td>" + (distritos[i].mpv * 100000).toFixed(2) + "</td>" +
                    "<td>" + (distritos[i].mpv / medMPV * 100).toFixed(0) + "%</td>" +
                    "<td>" + (distritos[i].mpv / maxMPV * 100).toFixed(0) + "%</td></tr>";
            }
        }
        
        out += "</table>"
        
        return out;
    }
    
    return {
        init: function() {
            distribuirMandatos();
            calcularMandatosPorVoto();
            document.write(output());
        }
    }
}());

legislativas2015.init();
Comentários Nenhum comentário Continuar a ler Continuar a ler »

Rabiscos

Num destes últimos fins-de-semana, em descanso por terras de onde sou natural, dei um salto ao Yours. O Yours é um bar calmo, com bastante atenção aos detalhes, onde é fácil passar-se horas a conversar (e a beber – com baldes de 5 minis, não consegues beber só uma).

Publicidades à parte, o dono deve ter uma predilecção especial por quebra-cabeças – começou por trazer-nos alguns dos mais clássicos com palitos, mas depois subiu a parada com Logicubes.


TL;DR:

Fiz um jogo. Ide jogar.


Eu não consegui encontrar grande informação sobre este jogo; o máximo que cheguei foi ao site do inventor, Ili Kaufman, onde o próprio vende uma versão do jogo, e a esta loja alemã, que vende uma versão diferente. Nenhuma destas versões é igual (nos símbolos – deduzo que a lógica subjacente seja igual) à que encontrei no Yours.

O objectivo do jogo é colocar quatro cubos em fila, em que cada lado terá quatro símbolos diferentes. Parece fácil o suficiente. Os desdobramentos dos cubos são os seguintes (as imagens foram adaptadas, mas são semelhantes):

Desdobramento logicubes

Eu e a V. ainda tentámos algumas coisas durante uns 10 minutos, mas como estava a ficar para o tarde e estas coisas entranham-se-me na cabeça, acabei por copiar o esquema dos cubos para a factura, onde até já estavam algumas contas (erradas) e um esboço do plano lógico de resolução (é a imagem que está ao topo deste post).

Uma solução puramente por força bruta estava fora de questão. Se cada cubo tiver 24 posições possíveis (cada uma das seis faces possíveis virada para a frente a multiplicar pelas quatro rotações possíveis em que pode estar sem mexer essa face), as combinações totais a testar seriam 244 = 331.776. Mesmo dividindo por 4 (porque uma determinada posição corresponde a três outras iguais, rodando toda a fila pelo seu eixo), são 82.944. Ainda que conseguíssemos verificar uma a cada dois segundos, demoraríamos um pouquinho mais que 48 horas. Pois…

Uma das coisas que topámos logo foi que havia mais símbolos do que sítios onde os pôr. Se cada cubo tem seis lados, há um total 24 faces possíveis, mas como só contam as 4 faces da fila de cubos, só há 16 posições – quer dizer que tem de se eliminar 8 posições. Essas posições correspondem aos dois topos da fila, e às faces dos cubos que ficam encostadas nas junções. Não esquecendo que cada símbolo tem que aparecer exactamente quatro vezes e contando quantas vezes aparecia cada símbolo nos cubos (bolas pretas, bolas brancas, zig-zags e escuras), foi fácil verificar quantos símbolos deveriam ser cortados:

  • p: 5 - 4 = 1
  • b: 7 - 4 = 3
  • z: 6 - 4 = 2
  • e: 6 - 4 = 2

As faces a cortar em cada cubo têm de pertencer, obviamente, ao mesmo eixo; cada cubo tem três eixos (vamos ignorar, por enquanto, se uma determinada face é cortada à esquerda ou à direita), o que vem a dar 34 = 81 combinações de corte. Supondo que muitas dessas combinações serão inválidas, isto já se aproximava de algo que pudesse ser resolvido com papel e caneta em tempo útil.

Até aqui chegámos; daqui não passámos, que a noite já ia longa – mas estas coisas ficam-me cravadas na tola e, entre as milhentas coisas que tenho para fazer, fui conseguindo roubar 10 minutinhos todas as noites para pensar no assunto.

A forma de resolver isto é com um grafo, especificamente, com uma árvore. No primeiro nível da árvore temos os três cortes possíveis do primeiro cubo, [p, z], [b, b] e [b, e]. De cada um desses vértices, partem três ramos, para os três cortes possíveis do segundo cubo ([z, e], [p, b] e [z, b]), deixando o segundo nível da árvore com 9 vértices. Logo aqui, podemos verificar que não vale a pena prosseguirmos com o ramo iniciado em [p, z] e passando por [p, b], visto que já eliminámos dois p – o que é impossível pelas condições impostas acima. É só continuar a construir a árvore nos mesmos moldes, o que daria os tais 81 vértices no quarto nível, se muitos ramos não fossem ficando pelo caminho (que ficam).

Anyway, estas coisas não se fazem à mão – pelo menos, não é à mão que um programador faz estas coisas (um programador perde 20 minutos a implementar um bash script para um problema que iria demorar 15 a resolver à mão). Mas volto a ressalvar: é perfeitamente possível resolver isto com papel e caneta. Posto isto, este sub-problema tem cinco soluções, a saber:

  • [[b, e], [z, b], [e, b], [p, z]]
  • [[b, e], [z, b], [e, z], [b, p]]
  • [[b, b], [z, e], [e, b], [p, z]]
  • [[b, b], [z, e], [e, z], [b, p]]
  • [[b, b], [z, b], [p, z], [e, e]]

Chegando a esta fase, é conveniente fazermos um ponto da situação. Temos cinco soluções. Cada cubo, em cada solução, pode ter duas posições de corte (tal como está, ou invertido). Em cada posição de corte, cada cubo pode ter 4 rotações. Por isso: 5 x 24 x 44 = 20.480. Dividindo pelas tais quatro soluções iguais em volta do eixo da fila, são 5.120. Voltando ao antigo cenário de um teste a cada dois segundos, já dá pouco menos de 3 horas.

Confesso que aqui atingi uma parede. Não consegui descortinar nenhuma solução puramente lógica para o problema. A única solução que se me afigura é mesmo um ataque de força bruta – quase 3 horas, no pior dos cenários.

Obviamente que implementei uma solução de força bruta, mas não manual, claro. Afinal, sou programador.

Incrivelmente, da forma como postulei o problema, se tivesse tentado manualmente, ia mesmo demorar as tais 3 horas – é que as soluções válidas (que é só uma com diferentes rotações) estão todas no 5º parcial anterior! É que é preciso ter sorte…

Como uma coisa leva a outra (de uma solução puramente analítica passei para a necessidade de uma visualização de grafos, depois para uma visualização em realidade virtual e finalmente já queria era mexer nos cubos), acabei por reconstruir o jogo por completo em ambiente web (because… reasons). Quem quiser, pode ir brincar com os cubos. Quando se fartarem, podem carregar na prendinha para ver a solução.

Nos próximos dias hei-de escrever dois ou três posts técnicos, porque aprendi umas coisas novas ao construir esse micro-site. Por agora, é tudo.

Comentários Nenhum comentário Continuar a ler Continuar a ler »

Expirou hoje o período de adaptação ao Acordo Ortográfico de 1990 (AO90). Isto é, ao fim de 25 anos desde a assinatura e depois de 6 anos em vigor em regime de adaptação, toma finalmente carácter definitivo. E se deveria tomar carácter definitivo a 13 de Maio é discutível – há quem defenda que devia ser apenas a 22 de Setembro de 2016, porque – oh, céus! – mais um ano e uns trocos vão fazer tanta diferença.

Como devem ter reparado pelo parágrafo anterior, eu não uso o AO90 (“carácter”, meses capitalizados). Sou opositor? Não. Sou marimbista, o que é diferente. Estou-me bem nas tintas. As linguagens não mudam por decreto, mudam pela praxis. Se as pessoas mudarem a forma de escrever (e de falar) ao longo do tempo, a linguagem muda com elas, quer os linguistas queiram, quer não. O máximo que os linguistas opositores ao AO de 1911 puderam dizer foi “hay, phoda-se!” (por acaso, disseram mais coisas - ver aqui os testemunhos de Alexandre Fontes, Teixeira de Pascoaes e Fernando Pessoa).

Mas também sou um formalista. Eu acredito que, tirando o que é do domínio do senso comum, toda a praxis deverá ser estruturada e formalizada em theoria. É para isso que temos a Lei. E não estou a falar da linguagem. O “não matarás” de origem religiosa transformou-se – nalgumas regiões, muito lentamente – em praxis do povo e acabou por fazer caminho até às leis mais laicas do mundo (sobretudo as europeias, fortemente influenciadas pela matriz judaico-cristã vigente).

Neste caso, no entanto, colocou-se a carroça à frente dos bois, ou pelo menos, dos bois europeus (e de alguns bois brasileiros também). Ninguém escreve “ato” ou “batismo” (estas são as que me fazem mais confusão) deste lado do Atlântico. Por outro lado, com a eliminação total do trema, os intelectuais brasileiros também ficaram bem à rasca, se bem que o povo em si já pouco o usava.

De qualquer forma, foram 25 anos – ou, pelo menos, 6 anos – para se habituarem e lerem o que está efectivamente no acordo. Ao menos as notas explicativas, que sempre são mais simples de entender. Dá-me cabo dos nervos ver certas coisas publicadas por opositores do AO90, como “quero ver como é que vamos escrever cágado sem acento” (nenhuma palavra esdrúxula perde o acento), “como é que vamos distinguir o fato consumado do fato de treino” (só as consoantes efectivamente mudas desaparecem e, em Portugal, o “c” de “facto” não é mudo, logo, não desaparece).

Mas, especialmente, aborrece-me de morte a polémica entre o “para”, do verbo parar (que continuarei a escrever pára porque, lá está, a isso não sou obrigado) e o “para”, a preposição. É como se todo um conjunto de gente tivesse descoberto agora a existência das palavras homógrafas. Esta polémica dá-me sede, que só posso matar na sede do grupo recreativo cá do sítio (viram o que eu fiz aqui?).

Mas ainda mais grave do que os linguistas de Facebook e abaixo-assinados, preocupam-me professores que andam aos papéis, seja por repetirem acefalamente os erros acima, seja por indicarem outros novos, que nem sei de onde tiraram. Por exemplo, no fim-de-semana estava a corrigir uma apresentação da minha filha onde, a certo ponto, ela tinha escrito “paramos”. Pelo sentido da frase, perguntei se não queria ter escrito “parámos”, ao que ela respondeu que a professora tinha dito que se podia escrever das duas maneiras. Eu espero, sinceramente, que a minha filha tenha entendido mal. Não estou pronto para aceitar que uma professora de português tenha dito isto. O que o AO90 diz, na Base IX, ponto 4.º, é o seguinte (ênfase meu):

É facultativo assinalar com acento agudo as formas verbais de pretérito perfeito do indicativo, do tipo amámos, louvámos, para as distinguir das correspondentes formas do presente do indicativo (amamos, louvamos), já que o timbre da vogal tónica/tônica é aberto naquele caso em certas variantes do português.

O timbre da vogal em Portugal é aberto nestes casos. Não há discussão possível. O acento é facultativo, de molde a que nenhuma das grafias esteja errada, mas um estudante português deverá ser ensinado a grafá-lo (e, num exame, não seja penalizado, mas que tenha uma nota informativa pedagógica).

E já que falamos em penalização...

Uma das minhas citações preferidas (que não sei de quem é, só sei que a digo há muitos anos – na volta, até é minha) é “uma regra só existe na mesma medida da efectividade da penalização pela sua não aplicabilidade”.

Qual é a penalização pelo não uso do AO90? Para mim, e para muitos outros portugueses, nenhuma. A lei não prevê qualquer penalização. Prevê quem a deve aplicar (tudo o que seja Estado ou por ele seja tutelado), mas nenhuma penalização. Mas será assim, de facto, para toda a gente?

Existe, na realidade, uma potencial penalização: o despedimento, sobretudo de funcionários públicos. Como? Ora, usando a figura de despedimento por inadaptação, claro (artigo 373.º e seguintes do código de trabalho). Afinal, a qualidade de trabalho degrada-se (tudo o que é anterior ao AO90 passa a ser erro), houve a introdução de uma nova forma de trabalhar, foi facultado um período de adaptação e não existe outro posto de trabalho compatível com a qualificação profissional do trabalhador (não vão colocar a senhora da secretaria como afecta às limpezas, certo?).

Claro que isto não vai acontecer. Afinal, nós somos o país dos brandos costumes. Não prevejo objectores de consciência em entrevistas de emprego:

— As suas qualificações são óptimas, é exactamente o que procurávamos. Mas tenho uma última pergunta: o senhor consegue escrever correctamente com a grafia posterior ao Acordo Ortográfico de 1990? É que isso é vital para nós, que temos parcerias/somos tutelados/pertencemos ao Estado...

— Lamento, mas não. Conseguir, até conseguia, mas por uma questão de consciência, não o farei.

— Obrigadoportervindoebomdia.

 

Comentários Nenhum comentário Continuar a ler Continuar a ler »
Entrada de escola
A partir desta foto de João Ornelas – Creative Commons BY-NC-SA 2.0

Conhecem a GIAE? Não? E se for a Gestão Integrada para Administração Escolar, ring a bell (pun oh-so-much intended)? Trocado por miúdos (vou tentar que este seja o último trocadinho deste post), é o sistema que gere os cartões de identificação dos putos nas escolas. Numas escolas é este, noutros é o SIGE (Sistema Integrado de Gestão de Escolas). Desconheço se há mais. Estes sistemas são implementados e (presumo) mantidos por empresas privadas.

Este post é sobre o GIAE, que é o usado na escola frequentada pela minha filha mais velha.

A coisa é conceptualmente interessante: serve para pagamentos dentro da escola (sujeito a pré-carregamento), controla as entradas e saídas e dispõe de um portal online onde os alunos e os encarregados de educação podem consultar os dados pessoais do aluno e dos encarregados de educação, saldos, consumos e registo de entradas¹. Até dá para comprar a senha da cantina (e ver as ementas da semana).

Portanto, o ano escolar iniciou-se no dia 15 de Setembro. Não sei porque raio, mas os cartões para alunos novos só vieram parar à mão da canalha no dia 10 de Outubro. Quase um mês, quando as listas de estudantes, turmas e tudo isso está feito há que tempos, mas pronto - sei lá, podem ter ficado sem smart cards em stock, ou assim.

No dia 10, em vez de darem logo os códigos aos alunos, não - ainda têm que se deslocar ao gabinete de apoio ao aluno para os pedir. Como agora os miúdos nem furos têm¹, isto foi por si só uma aventura; entre falta de tempo, e falta da pessoa responsável nas vezes em que lá foi, a minha filha só conseguiu pedir o código hoje. Pediram-lhe o cartão para confirmar a identidade (o cartão tem fotografia), e gastaram uma folha A4 inteirinha com uma tabela de duas linhas com o número do cartão, o nome dela, o código para consultas presenciais e as duas senhas para acesso online, aluno e encarregado de educação.

Os problemas começaram à tarde. Tínhamos uma reunião marcada com a directora de turma² e, enquanto esperávamos, sem saber que a nossa filha já tinha o código, resolvemos pedi-lo também.

Problema #1: o sistema não avisou o responsável que o código já tinha sido pedido (e o responsável também não deu conta que era a segunda vez naquele dia que lhe pediam os códigos daquele cartão).

Problema #2: o responsável não confirmou a nossa identidade. Chegámos, dissemos a turma e o nome, e ele passou-nos o papel para a mão. Aliás, ainda mais grave, imprimiu o papel para a secretaria e eu fui lá buscá-lo. Nem confirmou se éramos encarregados de educação da criança. É assim, à papo-seco.

Problema #3: ao chegar a casa, o receio que eu tinha confirmou-se logo: o código e as senhas eram os mesmos no papel da minha filha e no que eu tinha. Isto quer dizer que as senhas estão guardadas no sistema de forma recuperável. Nunca, ever, em qualquer circunstância se guardam senhas em sistemas online. Guardam-se hashes, com salt. Isto é um processo irreversível. É possível confirmar que a senha introduzida está correcta, mas é impossível³, tendo-se acesso à hash e ao salt, recuperar a senha original. Da forma como está feito, se algum dia o sistema for comprometido, existem milhares de senhas de alunos e encarregados de educação por aí à solta, com acesso aos nomes completos, moradas, o que é comeu, a que horas entra e sai... E, dado o interesse suficiente, qualquer sistema é comprometido. A questão não é se, mas sim quando.

Problema #4: o procedimento padrão cá em casa quando se recebem códigos de algum lado, é mudá-los imediatamente. Entra-se na plataforma online e as condições para as senhas é serem alfanuméricas (A-Z, a-z e 0-9) e terem 8 caracteres. Não é até 8 ou no mínimo 8. É 8. Ponto. Isto é facilitar ainda mais o trabalho a um ataque brute force. E como quem cometeu estes erros até aqui provavelmente nem sabe o que é uma comparação XOR de tempo constante, palpita-me que tinha senhas nas mãos numa noite com um ataque de análise temporal.

São os sistemas que temos.


¹ Qualquer dia escrevo mais sobre o assunto, mas as escolas agora parecem presídios: controlo de entradas, os furos já nem são furos, que os miúdos têm aulas de substituição, os funcionários têm que andar sempre atrás deles... Porra, no meu tempo íamos para trás do ginásio jogar ao bate-pé!

² Felizmente, a nossa filha não dá problemas. O que me levou lá, e qualquer dia também escrevo mais sobre isto, é a insistência que a administração pública tem em usar tecnologias Microsoft sem qualquer alternativa. Isto é um problema de princípio para mim, até porque existe legislação nacional nesse sentido (Lei n.º 36/2011 e Resolução do Conselho de Ministros n.º 91/2012).

³ Impossível é uma palavra muito forte. Bastante improvável será mais o caso. De facto, é impossível calcular a senha original, mas é possível construir rainbow tables de todas as combinações de hashsalt possíveis e extrapolar uma senha que dê origem à mesma hash. O tempo e espaço necessários para esta construção com algoritmos recentes (recentes - nada de MD5, por favor) são impraticáveis.

Comentários Nenhum comentário Continuar a ler Continuar a ler »
 Categorias
 Arquivo
 Projectos em Destaque
 Últimas Postas no Blog
 Últimos Comentários do Blog