# Antes que o Diabo Saiba que Você Está Morto

Caloni, 2012-05-02 cinema movies [up] [copy]

Não é fácil perceber a genialidade de um dos diretores mais esquecidos pela academia (nunca ganhou um Oscar) e pelo público em geral. Regente de projetos aparentemente simplórios, mas que envolvem o espectador de uma maneira sem volta (Um Dia de Cão), quem leu seu livro Making Movies (Fazendo Filmes) percebe que sua maneira de trabalhar é ordenada e disciplinada, o que mais ou menos garante que os objetivos do filme estejam tanto no início do projeto quanto no final, na sessão de estreia.

Esse é o caso de seu último filme, Antes que o Diabo Saiba que Você Está Morto, que apresenta Philip Seymour Hoffman e Ethan Hawke em suas máximas atuações (principalmente Hawke). A história gira basicamente em torno de um assalto que não deu certo. Porém, de uma maneira divertida e sagaz, os detalhes da história só nos são revelados aos poucos, em uma estrutura como as camadas de uma cebola.

Essa estrutura é necessária para o que Lumet e o roteirista estreante Kelly Masterson têm em mente: com uma visão mais intimista da história, o filme vai aos poucos nos revelando quem são realmente aquelas pessoas em torno do assalto, e o que aconteceria na vida real caso essas pessoas e seus temperamentos de fato tivessem que interagir frente ao inevitável?

Por fim, o título sugere o que a montagem nos mostra: enquanto não conhecemos o suficiente sobre os fatos, todos são inocentes.


# St. Nick

Caloni, 2012-05-04 cinema movies [up] [copy]

Quando o filme se inicia, e não sabemos exatamente quem são aquelas crianças, é muito fácil confundi-las com uma situação comum que vemos todos os dias: crianças brincando de aventureiros. Porém, conforme adentramos no mundo lúdico, mas cruel, de suas realidades, a consciência pesa demais para um filme supostamente despretensioso. Mais interessante, porém, é constatar que as pessoas que as encontram imaginam o mesmo que nós imaginávamos minutos antes, o que não deixa de ser irônico e trágico, pois agora vemos que muito da vida passa na nossa frente sem sequer nos darmos conta. A nossa realidade, andando com pressa pela calçada, não enxerga muito além dela própria.

Melancólico sem sequer forçar uma situação, mas simplesmente expondo a vida dos dois irmãos da maneira mais simples e bucólica possível, o peso dramático acaba ficando maior do que se nos tivessem empurrado uma trilha sonora triste de violinos. No fundo, o simples fato de vermos o menino carregando um porta-violinos e admirando sorrateiramente uma jovem ensaiando o violão em seu quintal é o suficiente para que entendamos muito mais do que qualquer fala que pudesse sair de sua boca pudesse nos revelar.

A menina, em seus gestos e andar tímidos entre as crianças de uma festa de aniversário, em contraponto com sua segurança quando está com o irmão, é um poço de expressão, ainda que na maioria das situações esteja anônima e muda. Fala quando tem algo a dizer (como quando reclama do sanduíche do irmão, para logo depois a vermos degustando o tipo de sanduíche que a faz feliz). O menino, na posição de maior responsável, quase não exibe sorrisos, mas uma distante tristeza em seus olhos sempre serenos.

Cortes certeiros e um ritmo mais que correto dão o tom milimetricamente planejado com uma embalagem indie, mas sem soar clichê/oportunista. É o cinema puro e singelo construído em torno de duas criaturas que aos poucos se tornam adoráveis e melancólicas. Seus motivos não nos interessam, mas o fato de estarem lá, sim. Compartilhamos com elas esse pensamento maldoso de qualquer adulto medroso: como será o amanhã? Haverá mais marshmallows?

Traçando um pouco das influências que Terrence Malick teve para criar sua A Árvore da Vida, a fotografia naturalista e os movimentos involuntários ao sabor do vento criam uma poesia involuntária incapaz de ser atingida por qualquer filtro fotográfico qualquer, embora as paisagens do horizonte sejam de encher o coração. É a poesia da vida real, da dura realidade de duas crianças que, ainda que passem seus sufocos, ainda podem sonhar.


# A Noite dos Mortos-Vivos

Caloni, 2012-05-07 cinema movies [up] [copy]

Filmado com um orçamento apertado, mas empenhado na construção da tensão e do imaginário ao máximo. Romero começa sua carreira criando um marco no terror absurdo, e ao mesmo tempo cria uma mitologia em cima dos mortos-vivos do título: eles viram os famigerados zumbis, criaturas derivadas de humanos que morreram e voltaram a caminhar sobre a terra. Lentos e trôpegos, conseguem muitas vezes ganhar em inteligência e sagacidade dos atônitos humanos vivos.

Aliás, Romero aqui já cria uma fascinante simbologia em cima da figura dos mortos-vivos: quem, realmente, é o vivo e quem é o morto? Quem possui um objetivo bem definido em sua rota (caçar e comer carne humana) e quem está perdido, desesperado e desunido como um grupo? Seria um humano desses um ser vivo completo ou mais carne humana para ser atingida pelo ódio coletivo?

Conseguiremos sobreviver aos zumbis da vida real? Romero, desde o começo, é atual.


# Flores Partidas

Caloni, 2012-05-07 cinema movies [up] [copy]

Don Johnston (Bill Murray, impagável) tem seu nome frequentemente confundido com seu quasi-homônimo Don Johnson ("o meu é com T"). No entanto, o que intimamente gostaria de ser é seu outro homônimo, Don Juan, conquistador inveterado de corações femininos. Um belo dia recebe uma carta rosa que menciona a existência de um filho já crescido, fruto de uma de suas inúmeras amantes. Crente de ter as qualidades de um verdadeiro conquistador, Don parte em uma jornada pelo país para verificar qual das quatro mulheres que consegue se lembrar de seu passado possuem vínculo com a suposta carta.

Dirigido e escrito por Jim Jarmusch (Sobre Café e Cigarros, Estranhos no Paraíso) baseado em ideias de seus colegas Bill Radem e Sara Driver, Flores Partidas parte de um pressuposto personagem e realiza um arco dramático que diz muito sobre a visão do homem moderno sobre suas conquistas femininas e sobre a auto-imagem que fazemos de nós mesmos e que na esmagadora maioria das vezes não passa de uma ilusão bem construída com a ajuda da opinião de amigos e conhecidos. No caso de Don, o conhecido é seu vizinho Winston (Jeffrey Wright), que, aparentando monotonia de sua própria vida, frequentemente se mete nos detalhes da vida íntima de seu amigo.

Sem muitos detalhes sobre quem é aquele homem ou do que vive, a evolução de um relacionamento é ilustrado com cada visita que ele faz, começando super-bem com uma ex-amante que possui uma ninfeta, ambas atraentes e convidativas (de uma maneira exagerada, pois é a ilusão ainda fazendo valer). No entanto, conforme vamos avançando começamos a entender coisas sobre o passado de Don que seria melhor se fosse deixado de lado. A jornada, no entanto, nunca perde o interesse, apresentando transições inteligentes que sempre estão em harmonia com o estado de espírito de nosso incansável protagonista.

Ao final, um giro de 360 graus nos revela o homem completo e ao mesmo tempo faltando partes. As ideias não encaixam perfeitamente, como a vida muitas vezes é.


# Paradise Now

Caloni, 2012-05-09 cinema movies [up] [copy]

Não é o fato de um filme contar a história de um homem-bomba sob seu ponto de vista, algo incomum para o Ocidente, que ele se torna automaticamente uma ótima referência ao tema. Contudo, quando esse ponto de vista está embebido em melancolia e ressentimentos de uma infância que não conheceu uma realidade diferente do inferno da Guerra (inclusive com a perda do pai causada diretamente por esta), é aí que começamos a analisar se o projeto de fato merece crédito.

Cores básicas, azul, vermelho, verde, tomam conta do figurino dos personagens principais, enquanto as secas e drenadas paisagens fazem rima de um lugar nada agradável para se viver, em meio a ruínas de prédios e eventuais tiros e bombas no caminho para casa. Curiosamente, Khaled (Ali Suliman) e Jamal (Amer Hlehel), colaboradores do movimento contra a ocupação israelita na região da Palestina, decidem fazer o último esforço e morrer como heróis de um atentado contra os soldados do estado de Israel; eles se vestem de preto e branco de maneira impecável, em uma espécie de contraste que ecoa por todo o horizonte amarelado e miserável.

Conforme acompanhamos o planejamento do ataque, tanto no "plano terreno" como depois ("dois anjos virão te buscar"), não nos parece absurdo que essa realidade exista e seja tão simples de persuadir pessoas a explodirem seus corpos por uma causa nobre e além-vida. Consideramos que a infância desses rapazes se passou em um ambiente conturbado, mas pior que isso, preparado de maneira inconsciente, cultural, de forma que fosse aceita a máxima "morrer como um herói" em prol de um futuro menos árido e destrutivo. Tudo está lá, menos o bom senso, que chega tarde, ou está dormindo ("para o mal prevalecer, basta os bons não fazerem nada"). Não há alternativa sob o ponto de vista do protagonista. E nem deveria. Certos de suas razões, não há motivo para temer, mas sim se orgulhar.

Dando-nos a oportunidade de conhecer as relações do homem-suicida (família, amigos, afeto) conseguimos manter uma proximidade, essa sim inédita e digna de nota, das pessoas que se sacrificam por um ato terrorista. Nesse sentido, o filme tem o mérito de conseguir transmitir essa importante mensagem de que ideologias podem sim ser perigosas não apenas para indivíduos, mas para povos e gerações a fio. Seja religioso ou meramente político, a ideia consegue nos mover para o melhor ou para o pior do ser humano.

Nesse sentido, fazer um filme sobre homens-bomba é sim bem-vindo e digno de nota.


# Qualquer Gato Vira-Lata

Caloni, 2012-05-10 cinema movies [up] [copy]

A influência norte-americana e suas comédias românticas de caráter duvidoso trouxeram uma produção com elenco brasileiro que não é apenas covarde em sua premissa, mas retrógrada e oportunista. Dirigido por Tomas Portella e Daniela de Carlo, ambos já envolvidos em produções hollywoodianas, o filme gira em torno do roteiro de uma peça de teatro (muito ruim, por sinal) em que a jovem e fisicamente atraente Tati (Cléo Pires) briga com seu namorado Marcelo (Dudu Azevedo) em seu aniversário por conta de suas aventuras fora do relacionamento; ao tentar procurar uma solução para seu relacionamento descobre através das teorias de um professor de biologia, Conrado (Malvino Salvador), que talvez estivesse usando a abordagem errada para seduzir homens.

Tendo como premissa a ideia retrógrada e extremamente machista de que as mulheres não podem ir à caça de seus partidos, mas sim seduzirem seus homens de forma velada aguardando por uma iniciativa destes, Qualquer Gato Vira-Lata já começa, nos seus primeiros 15 minutos, a ser insuportável apenas pelas ideias que defende. Ideias essas colocadas na cabeça do tal professor de biologia, que apesar de ser fã da teoria da Seleção Natural (possui um cachorro com o nome de Darwin) reage de maneira extremamente contraditória ao constatar que não só os humanos, mas o animais devem sempre se comportar da mesma maneira pelos milhões de anos de sua existência como espécie, ignorando igualmente que a consciência e raciocínio humanos, que criaram a moral e a filosofia, por exemplo, não conseguissem nos levar por caminhos diferentes do que reza nosso código genético.

Pior do que isso apenas a futilidade de Tati, que não conseguindo se livrar da paixão que sente por Marcelo, tenta se moldar de acordo com as teorias de Conrado. Ou seja, ainda que ignorássemos as ideias por trás da história e nos focássemos no drama vivido pela protagonista, isso seria impossível, pois ela é inatingível, atrás da inexistente e/ou inexpressiva interpretação de Cléo Pires, que se resume em fazer os mesmos sorrisos e caras de choro (ajudada pelos seus belos lábios) durante o filme inteiro. Vendo Pires como atriz é acabar dando mais méritos de interpretação para sua assemelhada Juliana Paes, por menos talentosa que fosse. Além do mais, nunca sabemos muito sobre Tati, além de que ela é capaz de mudar toda sua forma de ser e agir apenas para ficar do lado de seu macho-alfa, um rapaz deselegante e arrogante cujas únicas virtudes provavelmente foram adquiridas em sessões intermináveis de academia e Jiu-Jitsu.

Não contente com uma fraca trama central, o filme ainda nos brinda com fraquíssimas piadas recicladas de programas de humor televisivos (ou a internet) muito mal sincronizadas nas bocas de personagens secundários que poderiam tranquilamente deixar de existir em um enxugamento do roteiro, já que na maioria das cenas eles se limitam a fazer parte da decoração do cenário e criar contra textos para que os protagonistas não falem sozinhos e sejam tomados por loucos.

Todos esses tropeços fazem com que fique fácil ignorar a amadora fotografia, que perde tantas vezes o foco que parece ter sido mal-feita de propósito para dar um ar mais "artístico" (assim como a "trama"), fazendo rima com a péssima qualidade da mixagem de som, dado que em muitos momentos, principalmente em ambientes barulhentos, as vozes dos atores ficam abafadas, restando a nós, espectadores, tentar adivinhar as falas pelo contexto. Somando-se a isso temos uma equivocada Direção de Arte que planejou a casa de Tati, por exemplo, com um branco e uma largura de quadro que é incompatível com sua mente difusa e minúscula.

O fato é que, mesmo que o ritmo da história seja agradável apesar de todos os poréns, não há nada que nos leve a ser atraídos pelos personas de Tati e Marcelo, que são fúteis e antipáticos (ainda que seus corpos digam o contrário). Nesse sentido, além da trajetória de suas vidas não nos levarem a lugar algum, seus destinos pouco importam, desde que a projeção acabe logo.

O que, felizmente, é um dos poucos acertos do filme.


# Hairspray: Em Busca da Fama

Caloni, 2012-05-14 cinema movies [up] [copy]

Há uma mensagem muito bela em Hairspray, sobre o fim da guerra inter-racial ocorrida nos EUA na década de 60. Aliada a danças empolgantes e teatrais, nos leva a concluir tristemente que sua moral pertence ao mundo dos sonhos, da dança. E é na dança que está a maior virtude e o maior defeito desse filme.

Ao empolgar pelas performances saudosas e vigorosas de personagens vindos de um filme dos anos 80 imitando a época dos anos 60, o musical perde ainda mais seu contato com o público. A trama principal, sabemos ser tão irreal quanto as cores pastéis estilizadas para os cenários, os figurinos e a maquiagem dos personagens. Até mesmo John Travolta, apesar de toda a técnica envolvida em transformá-lo em uma quarentona enorme servir apenas para ilustrar a bizarrice de uma história sem muito embasamento.

Não sei se é a figura ingênua encarnada por Nikki Blonsky que não consegue transmitir a emoção real da adolescência da época, ou até mesmo do original dos anos 80. Tudo é muito teatral. Isso não costuma ser ruim em filmes como A Noviça Rebelde, que virou um clássico exatamente por conseguir transpor facilmente a realidade e a ilusão. Porém, aqui tudo é muito difícil de engolir. Aqui a velha crítica das pessoas que os musicais são chatos porque as pessoas saem de qualquer lugar e começam a cantar e a dançar faz sentido. Até a figura de Queen Latifah como a idealista Motormouth Maybelle é excessiva e desmerece a dramática luta para a aceitação do negro na sociedade americana da década de 60.

Se há algo que conseguimos tirar de Hairspray, são ótimas danças com sentimentos mistos de magia e decepção. A viagem para os anos 60 ficou incompleta nesse caso.


# Taxi Driver: Motorista de Táxi

Caloni, 2012-05-14 cinema movies [up] [copy]

A primeira coisa que senti ao iniciar a sessão do filme noir do Scorcese foi pensar que talvez eu não estivesse pronto para o que veria a seguir. De certa forma, "Táxi Driver" é um filme com tantas camadas e significados que fica difícil classificá-lo apenas como um excelente filme. A princípio, ele nem parece tão bom assim. Se perde em uma história sem cabimento, ou que tenha algum tipo de lógica em sua trama. Porém, ao olhar mais de perto, o que vemos é o resultado de uma catarse artística que pode-se notar em diversos indícios da produção: um roteiro (Paul Schrader, que assina também "Touro Indomável") que foca mais em seu personagem e não em suas falas; uma direção que assegura que o ponto de vista do motorista de táxi seja o único ponto de vista do filme inteiro; interpretações que enriquecem os personagens pelas expressões e movimentos, não se tornando afáveis para o público, mas antes soando autênticos (Robert de Niro e Jodie Foster); a fotografia de Michael Chapman que anda de mãos dadas com uma montagem segura feita por uma dupla que investe nas tomadas noturnas em planos-detalhe significativos apenas para o protagonista (como o espelho do motorista), enfocando sempre o que ele vê; por fim, uma trilha sonora ocasional mas impactante de Bernard Herrmann, colaborador frequente de Hitchcock, que, mesmo que repetitiva, mescla com competência seus dois temas principais.

Algo estranho emerge de Travis (de Niro), o motorista solitário de Nova York. Sua feição inexpressiva diz muito mais. Está exausto daquilo tudo. Não sabemos exatamente o que está pensando, mas o vemos mudar através de seus atos. A fotografia pesada de noite contrasta com a limpidez do dia. Nada à noite parece ser o mesmo. As pessoas mudam. Estão iluminadas por neon. Neon vermelho cor de sangue.

Só há maus exemplos nas ruas. Só há, segundo Travis, a escória. Alguém precisa limpar as ruas da quantidade absurda de prostitutas e seus cafetões, assassinos, ladrões, arruaceiros. Não há nada de bom nas ruas. Alguém tem que começar a fazer alguma coisa.

Travis entende que há algo a fazer, mas não sabe exatamente o quê. Está afim de fazer algo, qualquer coisa, para mudar sua realidade. Sua solidão o força a fazer algo, se não ficará louco. Não consegue dormir nem trabalhando 14 horas seguidas por 7 dias. Não consegue se comunicar, se relacionar com seus colegas. Não consegue ter uma namorada. Não sabe o que fazer. Sua rotina não é a de um cara que se deu bem, mas Travis não é um fracasso completo. É apenas como um dos seus clientes, andando sem rumo pelas ruas da cruel metrópole.

Somos levados desde o começo dentro do carro de Travis, mais para observar a realidade em sua volta. Sua narração em off determina apenas seu raciocínio, mas podemos "testemunhar" o que faz uma pessoa tomar as decisões que ele toma. Não há muito o que interpretar quando se trata de entrar na mente de um lunático, mas muito mais quando nossa mente conversa com ele através do que estamos vendo. Talvez o Cinema, como visual, sirva como uma luva para filmes desse tipo. Conseguimos pelos enquadramentos e movimentos de câmera de Scorsese enxergar além do cenário óbvio de dentro de um táxi. Conseguimos acompanhar o passar do tempo e nenhuma mudança. Essa falta de mudança, essa ausência de um rumo, é exatamente o que move Travis, e talvez mova muito mais gente pelas ruas.

Hoje "Táxi Driver" reflete uma filosofia profunda ainda que dita de forma simples sobre política, violência, justiça e impunidade. Muito mais do que Batman de Nolan, o Travis de Scorsese é mais palpável, mais real, tanto que quando há ação, ela não é desenfreada como nos filmes de ação, mas trágica e mais difícil a cada passo de nosso herói. Vemos "Travisses" em todo canto, com seu discurso justiceiro. Muitos deles são taxistas, também. Gente que trabalha por todo o lado, e vê que a coisa não pode melhorar. Na verdade, vem piorando cada vez mais. Políticos não fazem nada a não ser investir mais na miséria humana, dando a sensação que há uma tarefa difícil dentro de seus escritórios e que nós, cidadãos de bem, podemos apenas votar nesses senhores e esperar pelo melhor.

Em uma América cada vez mais armada, não é o governo que dita as regras. Entre uma tragédia e outra, vidas inocentes são salvas. Diferente do nosso Capitão Nascimento de Tropa de Elite, um herói com nome para salvar os indefesos dos bandidos cruéis, o Travis dos americanos está pulverizado em milhares de cidadãos inconformados e que decidem agir. Eles estão prontos. Sempre estiveram. Sua cultura os permite isso. Não são ovelhas prontas para serem salvas. São lobos prontos para serem usados. Ao menos isso eles têm.


# Um Misterioso Assassinato em Manhattan

Caloni, 2012-05-14 cinema movies [up] [copy]

Nova York, chuva, assassinato e um filme de Woody Allen. Uma combinação que costuma ser fértil para o Cinema, seja pela inteligência e ironia das falas dos personagens, ou até mesmo pela situação que eles vivem. Aqui, temos o casal de meia-idade Larry e Carol Lipton (Allen e Keaton) que, após conhecerem um idoso e simpático casal, no dia seguinte presenciam a morte súbita da esposa, consequência de um ataque cardíaco.

A questão, porém, é que o marido não parece tão abalado assim. Carol observa isso e uma ideia nasce em sua cabeça e vai crescendo: não seria ele um assassino daqueles de livros de mistério? Quais pistas eles presenciaram que poderia significar algo mais do que uma morte por doença? As questões vão aumentando conforme acompanhamos não só o espírito de aventura de Carol (ou de busca por algo incomum na enfadonha vida do casal) se contrapondo com a neurose controlada de Larry, com a interpretação de Allen no automático, mas ainda assim divertido.

Como roteirista, é esperto não entregar as coisas de mão beijada. Ele convida o espectador pela história a perceber aos poucos e experimentar a sensação de algo errado junto com Carol, que vai encontrando pista atrás de pista, que podem muito bem não significar nada, o que gera como sempre deliciosos e sarcásticos diálogos. Porém, a trama é forte o suficiente para chamar a atenção até mesmo no meio da comédia.

Para tornar a coisa mais realista, uma direção esforçada por ressaltar as diferentes nuances da investigação faz balançar a câmera em torno de Carol quando esta está bêbada após uma degustação de vinhos, e troca o foco rapidamente enquanto em uma conversa entre Carol e Larry decidimos quem está com a razão. Da mesma forma, os personagens secundários não estão totalmente à toa na trama, e cada um participa com suas personalidades, e obviamente Allen mais uma vez retorna o tema traição e crise de meia-idade dos casais.

Assassinato em Manhatan é passado e batido, mas consegue divertir sem ofender ou entediar. Como se diz por aí, Allen até quando é medíocre consegue ser acima da média.


# Coletando dumps automaticamente

Caloni, 2012-05-17 blogging [up] [copy]

Existe uma forma de configurar o Windows para que todo crash que ocorrer na máquina gere um dump em uma pasta específica. Há opções como tamanho do dump e máximo de arquivos mantidos nessa pasta.


# Consumo abusivo de memória

Caloni, 2012-05-19 computer [up] [copy]

Era um belo dia em um ambiente de processamento fictício de filas fictícias e threads fictícias. Eis um belo código com filas, threads e processamentos feitos em stop-motion:

#include <windows.h> // critical section, create thread...
#include <list> // nossa lista interna
#include <time.h> // randomização
struct Queue // uma fila (duh)
{
    size_t bufferSize; // cada item é um buffer de tamanho fixo
    DWORD wait; // antes de processar, aguardemos esse tempo fixo
    CRITICAL_SECTION cs; // stl é thread-safe, pero no mucho
    std::list<char*> items; // os itens!
};
DWORD WINAPI InsertItems(LPVOID pvQueue) // insere, insere, insere....
{
    Queue& queue = *(Queue*) pvQueue;
    for( int i = 0; i < 10 * 1000; ++i ) // 10k itens!
    {
        char* buffer = new char[queue.bufferSize];
        memset(buffer, (int) (i % ('Z' - 'A')) + 'A', queue.bufferSize); // teoricamente de A a Z
        buffer[queue.bufferSize - 1] = 0; // string C pra facilitar nossa depuração
        EnterCriticalSection(&queue.cs); // deixa eu entrar!
        queue.items.push_back(buffer);
        LeaveCriticalSection(&queue.cs); // deixa eu sair!
        Sleep(10); // dá uma dormidinha (sempre menor dormidinhas do processamento)
    }
    return ERROR_SUCCESS; // "tá tudo certo!" (by Starcraft 2)
}
DWORD WINAPI ProcessItems(LPVOID pvQueue) // processa, processa, processa...
{
    Queue& queue = *(Queue*) pvQueue;
    DWORD wait = 2;
    Sleep(10000); // como um advogado oportunista, aguardamos por alguém pra processar
    while( ! queue.items.empty() ) // agora vai até esvaziar o recinto
    {
        EnterCriticalSection(&queue.cs); // deixa eu entrar!
        char* buffer = queue.items.front();
        queue.items.pop_front();
        LeaveCriticalSection(&queue.cs); // deixa eu sair!
        delete [] buffer;
        Sleep(queue.wait); // aguarda por... por quanto mesmo?
    }
    return ERROR_SUCCESS; // "tá tudo certo!" (by Starcraft 2)
}
int main(int argc, char* argv[]) // No princípio havia a pilha, quando Deus disse: 'int main!'
{
    static const size_t QUEUES_SIZE = 20; // número de filas sendo processadas
    static const size_t QUEUE_ITEM_SIZE = 0x1000; // 1KB é o chunk alocado por item
    static const DWORD WAIT_TIMES[] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1000 }; // alguém vai esperar demais
    Queue queues[QUEUES_SIZE]; // as filas
    HANDLE queueThreads[QUEUES_SIZE * 2]; // as threads que processam as filas
    srand((unsigned int)time(0)); // randomizemos tudo
    for( size_t i = 0; i < QUEUES_SIZE; ++i )
    {
        queues[i].bufferSize = QUEUE_ITEM_SIZE + i; // para diferenciarmos as filas
        queues[i].wait = WAIT_TIMES[ rand() % (sizeof(WAIT_TIMES) / sizeof(DWORD)) ]; // vamos esperar por... por quanto mesmo?
        InitializeCriticalSection(&queues[i].cs); // deu crash em algumas situações em release (stl deveria ser thread-safe...)
        queueThreads[i] = CreateThread(NULL, 0, InsertItems, &queues[i], 0, NULL); // criamos thread de inserção
        queueThreads[QUEUES_SIZE + i] = CreateThread(NULL, 0, ProcessItems, &queues[i], 0, NULL); // criamos thread de processamento
    }
    WaitForMultipleObjects(QUEUES_SIZE * 2, queueThreads, TRUE, INFINITE); // espera a 'gaguera'
    return 0; // "tá tudo certo!" (by Starcraft 2)
}
 

Se olharmos de perto o processamento e a memória consumida por esse processo, veremos que no início existe um boom de ambos, mas após um momento de pico, o processamento praticamente pára, mas a memória se mantém:

Depois de pesquisar por meus tweets favoritos, fica fácil ter a receita para verificarmos isso usando nosso depurador favorito: <del>Visual Studio</del> WinDbg!

windbg -pn MemoryConsumption.exe

Achamos onde está a memória consumida. Agora precisamos de dicas do que pode estar consumindo essa memória. Vamos começar por listar os chunks alocados por tamanho de alocação:

   
   0:004> !heap -stat -h 0
   Allocations statistics for
    heap @ 00670000
   group-by: TOTSIZE max-display: 20
   
    size #blocks total ( %) (percent of total busy bytes)
    1037 25e5 - 2667433 (33.04)
    1025 25e6 - 263da3e (32.90)
    1024 25e4 - 2639410 (32.89)
   ...

O Top 3 é de tamanhos conhecidos pelo código, de 1024 a 1024 + QUEUES_SIZE - 1. O de tamanho 1037, por exemplo, possui 0x25e5 blocos alocados. Vamos listar cada um deles:

   
   0:004> !heap -flt s 1037
    _HEAP @ 420000
    _HEAP @ 670000
    HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
   <span style="color: #ff0000;"> 00558600 0221 0000 [00] 00558618 01037 - (busy)</span>         <--- vamos usar esse primeiro mais tarde
    0055fd38 0221 0221 [00] 0055fd50 01037 - (busy)
    00561f48 0221 0221 [00] 00561f60 01037 - (busy)
    00565260 0221 0221 [00] 00565278 01037 - (busy)
    0056c998 0221 0221 [00] 0056c9b0 01037 - (busy)
    0056daa0 0221 0221 [00] 0056dab8 01037 - (busy)
    0056eba8 0221 0221 [00] 0056ebc0 01037 - (busy)
    00570db8 0221 0221 [00] 00570dd0 01037 - (busy)
    00572fc8 0221 0221 [00] 00572fe0 01037 - (busy)
    005740d0 0221 0221 [00] 005740e8 01037 - (busy)
    0058abc8 0221 0221 [00] 0058abe0 01037 - (busy)
    00595618 0221 0221 [00] 00595630 01037 - (busy)
    00599a38 0221 0221 [00] 00599a50 01037 - (busy)
    0059de58 0(...)

A listagem do depurador nos dá o endereço onde o chunk foi alocado no heap e o endereço devolvido para o usuário, onde colocamos nossas tralhas. Através de ambos é possível trackear a pilha da chamada que alocou cada pedaço de memória. Isso, claro, se previamente tivermos habilitado essa informação através do GFlags:

   
   0:004> !heap -p -a <span style="color: #ff0000;">00558600</span>
    address 00558600 found in
    _HEAP @ 670000
    HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
    <span style="color: #ff0000;">00558600 0221 0000 [00] 00558618 01037 - (busy)</span>
    Trace: b7a24
    7722dfa2 ntdll!RtlAllocateHeap+0x00000274
    5b628343 MSVCR100D!_heap_alloc_base+0x00000053
    5b63697c MSVCR100D!_nh_malloc_dbg+0x000002dc
    5b63671f MSVCR100D!_nh_malloc_dbg+0x0000007f
    5b6366cc MSVCR100D!_nh_malloc_dbg+0x0000002c
    5b639c5b MSVCR100D!malloc+0x0000001b
    5b627db1 MSVCR100D!operator new+0x00000011
    e84dee MemoryConsumption!operator new[]+0x0000000e
   <span style="color: #ff0000;"> e818be MemoryConsumption!InsertItems+0x0000004e</span>
    7679339a kernel32!BaseThreadInitThunk+0x0000000e
    771e9ef2 ntdll!__RtlUserThreadStart+0x00000070
    771e9ec5 ntdll!_RtlUserThreadStart+0x0000001b

Dessa forma temos onde cada memória foi alocada, o que nos dará uma informação valiosa, dependendo qual o tipo de problema estamos tentando resolver.

   
   0:004> u <span style="color: #ff0000;">e818be</span>
   MemoryConsumption!InsertItems+0x4e [c:\...\memoryconsumption.cpp @ 18]:
   00e818be 83c404 add esp,4
   00e818c1 898514ffffff mov dword ptr [ebp-0ECh],eax
   00e818c7 8b9514ffffff mov edx,dword ptr [ebp-0ECh]
   00e818cd 8955e0 mov dword ptr [ebp-20h],edx
   00e818d0 8b45f8 mov eax,dword ptr [ebp-8]
   00e818d3 8b08 mov ecx,dword ptr [eax]
   00e818d5 51 push ecx
   00e818d6 8b45ec mov eax,dword ptr [ebp-14h]

Outra informação relevante é o que está gravado na memória, que pode nos dar insights de que tipo de objeto estamos lidando:

   
   0:004> db <span style="color: #ff0000;">00558618</span>
   00558618 c0 b7 8c 0b 98 03 55 00-00 00 00 00 00 00 00 00 ......U.........
   00558628 13 10 00 00 01 00 00 00-15 94 00 00 fd fd fd fd ................
   00558638 51 51 51 51 51 51 51 51-51 51 51 51 51 51 51 51 QQQQQQQQQQQQQQQQ
   00558648 51 51 51 51 51 51 51 51-51 51 51 51 51 51 51 51 QQQQQQQQQQQQQQQQ
   00558658 51 51 51 51 51 51 51 51-51 51 51 51 51 51 51 51 QQQQQQQQQQQQQQQQ
   00558668 51 51 51 51 51 51 51 51-51 51 51 51 51 51 51 51 QQQQQQQQQQQQQQQQ
   00558678 51 51 51 51 51 51 51 51-51 51 51 51 51 51 51 51 QQQQQQQQQQQQQQQQ
   00558688 51 51 51 51 51 51 51 51-51 51 51 51 51 51 51 51 QQQQQQQQQQQQQQQQ

Não é o caso, mas vamos supor que fosse um objeto/tipo conhecido. Poderíamos simplesmente "importar" o tipo diretamente do PDB que estamos para modelar a memória que encontramos em volta. Mais detalhes em outro artigo.

Funções/classes usadas nesse artigo

   

* CreateThread. Cria uma nova linha de execução.

   

* WaitForMultipleObjects. Pode aguardar diferentes linhas de execução terminarem.

   

* std::list. Lista na STL para inserir/remover objetos na frente e atrás (ui).

   

* Initialize, Enter e LeaveCriticalSection. Uma maneira simples de criar blocos de entrada atômica (apenas uma thread entra por vez).

   

* memset. Se você não sabe usar memset, provavelmente não entendeu nada desse artigo.

Initialize, Enter: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682608(v=vs.85

Initialize, Enter e LeaveCriticalSection: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684169(v=vs.85


# Sobrecarga de função às avessas

Caloni, 2012-05-20 computer ccpp [up] [copy]
Nota do autor: navegando pelo Archive.org, que possibilita viajar no tempo e encontrar coisas enterradas que seria melhor deixar por lá, consegui encontrar um post que se perdeu na dobra espaço-temporal entre o old-fashioned Caloni.com.br (com direito à velha joaninha psicodélica, desenho do meu amigo que uso até hoje no blogue) e um finado outro domínio meu, o CThings. No final, consegui matar a marmota, chegar a 80 milhas por hora e voltar para o presente. Enjoy!

Alguém já se perguntou se é possível usar sobrecarga de função quando a diferença não está nos parâmetros recebidos, mas no tipo de retorno? Melhor dizendo, imagine que eu tenha o seguinte código:

   void CreateNewGUID(wstring&);
   void CreateNewGUID(GUID&);
   GUID guid;
   wstring guidS;
   CreateNewGUID(guidS);
   CreateNewGUID(guid);

É um uso sensato de sobrecarga. Mas vamos supor que eu queira uma sintaxe mais intuitiva, com o retorno sendo atribuído à variável:

   wstring CreateNewGUID();
   GUID CreateNewGUID();
   GUID guid;
   wstring guidS;
   guid = CreateNewGUID();
   guidS = CreateNewGUID();

Voltando às teorias de C++ veremos que o código acima NÃO funciona. Ou, pelo menos, não deveria. Só pelo fato das duas funções serem definidas o compilador já reclama com um "error C2556: 'GUID CreateNewGUID(void)': overloaded function differs only by return type from 'std::wstring CreateNewGUID(void)'". E obviamente ele está correto. O tipo de retorno não é uma propriedade da função que exclua a ambiguidade em sua chamada. Apenas a assinatura pode fazer isso (que são os tipos dos parâmetros recebidos pela função).

Como não podemos utilizar funções ordinárias o jeito é criar nosso próprio tipo de função que dê conta do recado usando a sobrecarga do operador de conversão de tipos. O operador de conversão suporta sobrecarga porque é na conversão que o compilador decide qual função chamar.

   struct CreateNewGUID
   {
     operator wstring ();
     operator GUID ();
   }; 
   guid = CreateNewGUID();
   guidS = CreateNewGUID();

Agora com o novo tipo CreateNewGUID é possível chamá-lo como uma função, o que na prática cria uma nova instância da struct. Ao atribuir o retorno dessa instância a uma variável do tipo wstring ou GUID os operadores de conversão serão requisitados, cada um dependendo do tipo da variável a qual será atribuído o retorno.

Uma vez que criamos um novo tipo, e considerando que este tipo é, portanto, diferente dos tipos wstring e GUID já existentes, devemos simplesmente converter nosso novo tipo para cada um dos tipos de retorno desejados:

   struct CreateNewGUID
   {
     operator wstring ()
     {
       wstring ret;
       // cria guid
       return ret;
     }
     operator GUID ()
     {
       GUID ret;
       // cria guid
       return ret;
     }
   };

E isso conclui a solução meio esquizofrênica de nossa sobrecarga às avessas. E voltando à pergunta original, penso que, com criatividade e C++, nada é impossível. =)


# O Corvo

Caloni, 2012-05-24 cinema movies [up] [copy]

Edgar Allan Poe é considerado um dos precursores da literatura norte-americana, e com Júlio Verne, dos gêneros de ficção-científica e fantástica. Suas histórias geralmente giram em torno de crimes e mortes bizarras, o que revela não apenas a genialidade na arte de escrever como também sua criatividade mórbida, fruto do mais novo filme sobre ele, O Corvo, estrelando John Cusack na pele do escritor de contos.

A ideia da trama gira em torno de seus contos e a morte misteriosa de Poe, encontrado em estado catatônico em um parque. Tudo se inicia quando um assassinato começa a recriar as cenas de crimes contidas nos contos do escritor. Determinado a encontrar o lunático, o detetive Fields (Luke Evans) encontra em Poe um forte aliado por ter todos os passos do próximo assassinato em sua mente, na memória de suas obras.

Contrariando as expectativas de ter um mestre e gênio da literatura encarnado, a introdução apresentada pelo filme desaponta pelos inúmeros diálogos expositivos sobre a figura de Allan Poe, como se estivéssemos falando já de uma figura ilustre da literatura, chegando a incluir desnecessariamente a anedota sobre o preço que sua obra-prima, o poema O Corvo, foi vendido para custear seu vício com bebidas.

A escolha de John Cusack torna-se logo de início obviamente errada, pois apesar de sua introspecção e ausência de expressão (ou exagero), a figura de Poe nunca corresponde às expectativas que são geradas por uma das figuras mais emblemáticas e geniais da literatura mundial. Sua ironia não é vista, apesar da história sugerir sutilmente próximo do desfecho, único momento em que vemos as influências de seus textos. Até quando o ilustre escritor visita pela primeira vez uma cena de um dos seus crimes fictícios para ele é como se apenas constatasse mecanicamente os detalhes de seus parágrafos visto em cores sombrias de uma Baltimore cinzenta e enevoada.

Porém, os erros não se limitam ao desempenho de Cusack, mas pioram na criação de um suposto interesse romântico do autor e ao mesmo tempo sua inspiração, o que soa artificial todo o tempo, ainda mais se considerarmos uma atuação nada significativa de Alice Eve como Emily Hamilton, o que chega a comprometer seriamente a história em momentos-chave da trama.

Os aspectos técnicos, no entanto, conseguem transmitir com precisão o ambiente sufocante de uma Baltimore do século IXX, em uma fotografia sem muitas cores saltando da tela, com um Egdar Allan Poe devidamente vestido de preto e com capa e, é claro, uma névoa que cobre boa parte do cenário nas cenas externas e que muito lembra Do Inferno, onde víamos em vez de um copycat do escritor o famigerado Jack o Estripador representado pelos becos escuros e sujos de Londres.

De uma forma talvez irônica, o fato das mortes terem como essência as mesmas cenas idealizadas nas obras do escritor gera a interessante questão que talvez a vontade de ver mais assassinatos clássicos é o que move a trama e não a resolução dos crimes e descobrimento do culpado, que nunca chega a ocupar o tema central. Nesse sentido a história parece ficar sempre estacionada em uma investigação infértil e que vai aos poucos criando episódios separados, recortados e juntos apenas pela trilha que lembra erroneamente mais uma aventura de games do que um filme de mistério, esse que seria talvez o maior equívoco do longa.

Ainda assim, seu desfecho desperta uma atenção que até então estava adormecida, e seu feitor é igualmente interessante, motivo pelo qual o terceiro ato parece tão mais curto e tão menos desenvolvido que todo o resto. Porém, terminando desastrosamente mal, com o uso de um clichê que mais envergonha do que homenageia a figura de Poe, os créditos acabam expondo o que desconfiávamos desde o princípio: não havia sombra de um objetivo definido ao contar a história.


# Problemas comuns no WinDbg e suas soluções

Caloni, 2012-05-27 [up] [copy]

Depois de uma agradável manhã e tarde acompanhando o curso de desenvolvimento de drivers do meu amigo Ferdinando voltei para a casa para brincar um pouco mais com o mundo kernel e voltar a encontrar problemas com o WinDbg & Cia que há mais ou menos 1 ano atrás não tinha.

Pesquisando por um problema específico envolvendo PDBs reencontrei o blogue do Ken Johnson, MVP Microsoft e analista por profissão e diversão, é conhecido por suas excelentes contribuições no mundo da depuração de sistema (notadamente WinDbg). Existe um post específico que ele escreveu para economizar tempo com problemas que ocorrem de vez em quando em uma sessão ou outra de depuração, mas nunca paramos tempo o suficiente para resolver.

Além de outros, ele lista alguns que particularmente já aconteceram comigo ou com colegas de depuração:

**O WinDbg demora um tempo absurdo para processar o carregamento dos módulos e está usando tempo máximo de processamento em apenas uma CPU.**

Isso ocorre porque existem breakpoints ainda  não resolvidos. Resolva deixando apenas esses tipos de breakpoints que são absolutamente necessários, pois cada vez que um módulo é carregado o depurador precisa fazer o parser de cada um deles para verificar se ele já consegue resolve-lo.

Às vezes, porém, existe algum lixo nos workspaces carregados por ele que permanecem mesmo depois de apagarmos todos os breakpoints inúteis ou reiniciar o sistema. Em último caso, sempre podemos apagar o workspace do registro, em **HKCU\Software\Microsoft\Windbg\Workspaces**.

**O WinDbg continua demorando décadas para analisar o carregamento, mas agora nem consome tanta CPU assim.**

Isso ocorre porque na cadeia de paths para procurar por símbolos existe algum endereço de rede/internet errado que faz com que ele tenha que caminhar em falso diversas vezes. Esse e outros erros de símbolos sempre poderão ser analisados através do universal **!sym noisy**, que imprime todo tipo de informação útil do que pode dar errado durante um .reload explícito (eu digitei) ou implícito (lazy reload).

**O WinDbg continua recusando carregar um símbolo que eu sei que existe e sei que é válido.**

Talvez ele exista, mas por algum motivo foi copiado corrompido para o symbol server. Mais uma vez, **!sym noisy** nele e deve acontecer algum erro de **E_PDB_CORRUPT**. Nesse caso, apague o PDB culpado e tente de novo.

E, como brinde, um grande aliado da produtividade: **como evitar que o WinDbg bloqueie seu PDB enquanto você precisa constantemente recompilar seu driver:**

.reload -u modulo

Fonte: Blog do Nynaeve.


[2012-04] [2012-06]