Palestra Teaching Clojure

Participei hoje e ontem do evento TheConf em São Paulo. Ontem de manhã, dei uma palestra contando a experiência de ter ensinado a linguagem de programação Clojure, num curso de extensão do IFSP Campinas. Foi muito legal! Seguem os slides:

Teaching Clojure – Palestra em inglês ministrada no TheConf 2019

Comandinhos rapidões no Linux (Debian/Ubuntu/Mint)

ComandoO que faz
apt install pacoteAtalho para sudo apt-get install pacote
apt version pacoteMostra versão de um pacote instalado
poweroffDesliga máquina. No Mint, não precisa de sudo.
rebootReinicia máquina . No Mint, não precisa de sudo.
CTRL+DFecha terminal
sed -r ‘s/(de)/\1para/’Exemplo simples de conversão com sed: de -> depara

Operador vírgula: o ilustre desconhecido

Você já quis inserir um elemento num vetor e obter o vetor numa tacada só? Já quis que o vetor.push(el) do JavaScript retornasse o vetor em vez de o tamanho?

Se já quis e ficou frustrado, saiba que tem como fazer! Existe um operador que serve exatamente para esses momentos:

vetor.push(el), vetor

Como assim, André? Que operador? Que raio foi isso aí?

Sim! Esse é o mágico e desconhecido operador , (vírgula) da linguagem C, herdado por JavaScript. Ele avalia cada expressão e dá como resposta o resultado da última:

// Os parênteses são necessários aqui porque 
// o operador vírgula tem uma precedência baixíssima

const resultado = (expr0, expr1, expr2); // resultado = expr2

Já fazia uns 15 anos que eu me perguntava para quê ele servia na prática, e, hoje, finalmente, encontrei a resposta! O operador vírgula serve quando você está num ponto do código que precisa de uma expressão e você quer causar um efeito colateral.

Você talvez já o tenha visto no incremento de um for com mais de uma variável: for (int i = 0, j = 0; i < 10; ++i, ++j). Nesta resposta do StackOverflow tem um outro exemplo de uso, para fazer leitura de dados. É tipo quando a gente faz assim em Java:

while ((byteLido = inputStream.read()) != -1) {
// ...
}

O while pede uma expressão booleana. Entregamos uma para ele, mas, antes disso, damos uma mexidinha no estado do sistema!

Se você já fez programação funcional com vetores em JavaScript, provavelmente já sentiu falta das funções cons e conj do Clojure, ou : do Haskell.

Dá para simular essas funções assim: [elemento].concat(vetor) ou vetor.concat([elemento]). Meio feião e cria um vetor bobo para jogar fora pouco depois. Vamos usar isso para fazer uma implementação recursiva de cauda da função zip:

function zip(v1, v2) {
const loop = (ret, v1, v2) =>
v1.length === 0 || v2.length === 0 ? ret : loop(
ret.concat([[v1[0], v2[0]]]), v1.slice(1), v2.slice(1));
return loop([], v1, v2);
}

Ficou razoável… Mas que colchetaiada!

E com push, como ficaria? Normalmente, evitamos alterar variáveis. No caso, ret é um vetor novo, então não tem muito problema. Além disso, evitar criar vetores extras pode ser uma boa aqui porque estamos em JavaScript, que não tem as otimizações comuns em linguagens funcionais. Ficaria assim:

function zip(v1, v2) {
const ret = [];
function loop(v1, v2) {
if (v1.length === 0 || v2.length === 0) {
return ret;
} else {
ret.push([v1[0], v2[0]]);
return loop(v1.slice(1), v2.slice(1));
}
}
return loop(v1, v2);
}

Eita… Um monte de ; {} return! Nem parece mais programação funcional. loop era só uma funçãozinha de uma expressão só, agora virou um trambolho, devido a termos que mudar de ? para if/else.

E com se usarmos o operador vírgula?

function zip(v1, v2) {
const loop = (ret, v1, v2) =>
v1.length === 0 || v2.length === 0 ? ret : loop(
(ret.push([v1[0], v2[0]]), ret), v1.slice(1),v2.slice(1));
return loop([], v1, v2);
}

Opa… Aí, sim, hein! push só é executado quando os tamanhos dos vetores são diferentes de zero, e o resultado da expressão entre parênteses será ret. Causamos um efeito colateral maroto e inofensivo.

Simples ou complicado, claro ou obscuro, o fato é que agora está explicada a existência desse misterioso operador!

Espantoso? Nem tanto… O comando do em Clojure faz a mesma coisa!

Twitter episódio 3: A Volta Dos Que Não Foram

Criei minha conta no Twitter acho que em 2009. Usei o nome de usuário awvFi, diferente do awvalenti que eu costumava usar em quase todo lugar, e uso até hoje.

Descobri acho que em 2010, no Facebook, um usuário awvalenti que não era eu! Fiquei chateado, pois sempre usei esse nome por aí e de repente haveria alguém “se passando por mim”. Pois bem, resolvi que ninguém iria fazer isso no Twitter! Criei uma segunda conta lá, com usuário awvalenti, usando meu e-mail da faculdade. Essa conta ficou parada lá, servindo apenas para ninguém mais criá-la e usá-la!

Bom… Muitos anos se passaram e muita água rolou! Em 2016, apaguei minha conta @awvFi do Twitter. Esse nome nem fazia mais sentido para mim, pois o apelido Fi é antigo e já nem uso mais.

Ocorre que, nos últimos anos, ouvi tanto o pessoal da minha área falar em contato pelo Twitter que fiquei pensando se não poderia ser uma boa voltar a usá-lo. A conta já tá lá, mesmo, não é? @awvalenti, só esperando um primeiro acesso… Ninguém catou, já que eu reservei, hehe.

O problema: obviamente, eu não lembrava a senha; afinal, criei só para ninguém mais criar, certo? Quanto ao e-mail cadastrado, eu já não tinha acesso havia uns bons anos. Volta e meia, eu pensava:

Bom, é só eu ir lá na faculdade, trocar uma ideia com o pessoal da TI, pedir um acesso durante 5 minutos ao antigo e-mail. Aí eu redefino a senha do Twitter, troco o e-mail cadastrado e é sucesso!

Bom, eis que, nesta última segunda-feira, recebi uma piadinha por WhatsApp, que me lembrou de uma parecida que eu mesmo havia feito no meu antigo Twitter @awvFi. Resolvi entrar no site e fazer uma busca para ver se encontrava a tal antiga piada, mesmo com a conta deletada. Qual não foi a minha surpresa ao deparar com isto:

Ler mais

Palestra Bauhinia: Wii Remote technologies for a sustainable world

Uma vez, eu quis ter um apresentador remoto (daqueles de avançar slide). Mas não quis comprar um.

Resultado? Um novo projeto de software, envolvendo sustentabilidade, Wii, Java, Bluetooth, pata-de-vaca, portabilidade e até JNI/bibliotecas nativas!

Links: Slides / GitHub

Esta palestra foi dada em 2015, em Caraguatatuba-SP, num evento internacional do qual participei. Raramente palestro em inglês, por isso considero este vídeo muito importante!

Reciclagem

O mundo não é nenhum mar de rosas. É um lugar sujo, feio e cruel.

Não importa quão durão você seja. Um dia, a vida vai te pegar de jeito.
Um dia, a vida vai enfiar a porrada na sua cara.
E você vai cair bonito no chão, exausto, sem esperança.

O negócio não é surrar a vida de volta;
o negócio é aguentar firme.
O negócio não é fingir que não é assim.
O negócio não é criar um mundo paralelo perfeito.
O negócio é seguir adiante, apesar de todos os males.

Não se faz o bem eliminando todos os males;
faz-se o bem APESAR de todos os males.

É chegada uma nova era.
É chegada a era de encarar a realidade, de igual para igual.
Buscar o ideal já não rola mais.
Irreverência e julgamento ficaram para trás.

O tempo é de aceitar, decidir, produzir.
As velhas facas já não cortam mais, estão cegas.
É hora de afiar, ressignificar, reciclar.

O novo sempre vem, não importa como a gente se sinta.
O mundo do sentimento infinito é um mundo vazio, solitário, improfícuo.
O mundo real é vasto, produtivo, comunitário.

Meios foram dados. Vida pede resultados.