Super Mário Galaxy recebeu excelente crítica dos principais sites de gamers.

O jogo não tem terra, nem céu, a única referência é a gravidade que às vezes te puxa para baixo e às vezes para cima. O jogo é completamente 3D e segue a mesma linha do Super Mario 64.
Entre os críticos que lí, todos concordam que o último grande épico do Super Mário foi o 64. Porém eu discordo. O Super Mario World do Nintendo DS trouxe de volta o saudosismo dos jogos 2D dos anos 80.
Kopimi, em inglês, é pronunciado “copy me” – ou “me copiem”.
Encontrei enquanto navegava o The Pirate Bay buscando mais informacão sobre o fechamento do OiNK.com. Trata-se de um ícone que você coloca em seu site pedindo para ter seu conteúdo copiado. Ou seja, é uma resposta anarquista à campanha anti-pirataria sendo travada pelas polícias do Reino Unido, Estados Unidos e Holanda(entre outros).
Se você encontrar algum dos ícones abaixo num site, significa uma adesão ao movimento “me copiem”.





Ontem reencontrei os amigos Sandro e Mariana que passam o fim de semana em Brasília. Combinamos uma sessão de “filme horrível” na casa do nosso querido Mateus Tormin e, acreditem, o filme que Mateus escolheu era deveras horrível. Bem, acontece que Sandro e eu fundamos o Perl Mongers Brasilia em 1999, que era na verdade uma desculpa pra tomar cerveja e falar de Perl, e ontem o Sandro chamou minha atencão porque há tempos neste blog, segundo ele, “você só fala em Hugo Chavez e CPMF e onde diabos está o Perl!!??”. Claro que ele está com a razão e hoje decidí tentar recomecar a secão Perl aqui do blog que tem apenas uns 3 posts….
O assunto deste post é o operador de teste de arquivo -M
Ao trabalhar com o operador -M $ARQUIVO para obter o número de dias desde que $ARQUIVO foi alterado, deve-se observar que a forma como Perl trabalha com esse operador não é exatamente intuitiva.
Quando você testa um arquivo com -M, espera obter o tempo desde que foi alterado até o instante em que o operador -M é utilizado. Mas não é isso que acontece.
Perl irá lhe retornar o tempo de modificacão do arquivo até o momento em que o programa foi executado.
Se o seu programa utiliza o operador -M e é um servidor de rede, ou daemon local, ou qualquer processo que permaneca em funcionamento durante longos períodos, o resultado pode ser um desastre.
Veja o seguinte exemplo:
#!/usr/bin/perl
$data = -M "/etc/passwd";
print "$data\n";
sleep(30);
$data = -M "/etc/passwd";
print "$data\n";
Normalmente esperaríamos que a segunda chamada a -M, após 30 segundos, retornasse uma fracão do dia 30 segundos maior(lembre-se, -M não retorna segundos como time(), e sim o número de dias e a fracão do dia atual desde que o arquivo testado foi alterado).
Rodando o programa acima vemos que os 30 segundos não influenciam em nada o resultado de -M
root@clapton:~/perl# perl modificado.pl
514.301099537037
514.301099537037
Vejamos alguns casos em que isso pode causar problemas:
1) Voce utiliza -M para decidir se um arquivo de log deve ser arquivado e um novo criado(estilo logrotate). Neste caso o arquivo irá crescer infinitamente pois seu programa não verá qualquer diferenca na data de modificacão à partir do momento em que o programa é rodado.
2) Você utiliza -M para verificar se arquivos de sistema sofreram vandalismo, algo estilo tripwire. Também não vai funcionar, pois se o arquivo de sistema sendo monitorado for modificado após o nosso programa monitor ser rodado o tempo entre o retornado por -M e a data de alteracão será negativo! O que não faria sentido. Seria um bug difícil de encontrar e remover.
3) Você utiliza -M para decidir se deve, ou não, efetuar backup de um ou mais arquivos. Neste caso pode ocorrer o efeito da data negativa do exemplo 2 e seus backups de dados valiosos podem não ocorrer conforme planejado.
Então, o que fazer?
Claro que em programas quebra-galho, que rodam em minutos ou segundos, a não ser que se estejam organizando longas listas de arquivos por data de modificacão, provavelmente não será preciso se preocupar com isso.
Já em programas de longa duracão será preciso ter cuidado. Como todos os problemas em Perl, há sempre mais de uma solucão.
As duas solucões que conheco utilizando -M envolvem refrescar a data inicial à partir da qual -M efetua sua comparacão. E qual é essa data? É aquela gravada na variável especial $^T.
A terceira solucão que encontrei é deixar de usar -M em favor de stat().
Confira o seguinte programa:
#!/usr/bin/perl
print "$^T\n";
sleep(30);
print "$^T\n";
Rodando, temos o seguinte resultado:
root@clapton:~/perl# perl modificado2.pl
1194827682
1194827682
Aí está o nosso culpado. -M utiliza $^T para determinar a data de modificacão dos arquivos mas $^T não muda durante o runtime de nosso programa. Assim, tenho em mente as seguintes solucões, crie a sua ou escolha a mais apropriada.
Solucão 1 – refrescar $^T toda vez que usar -M.
Exemplo:
#!/usr/bin/perl
$data = -M "/etc/passwd";
print "$data\n";
#..... PROCESSO DE LONGA DURACÃO .....
# mais tarde...
$^T = time();
$data = -M "/etc/passwd";
print "$data\n";
Solucão 2 – criar um timer com signal handler que refresca $^T para voce periodicamente. Assim há menos risco de você esquecer de refrescar $^T antes de uma chamada.
Exemplo:
#!/usr/bin/perl
# arma o relogio do SIGALARM
$SIG{ALRM} = sub { $^T = time(); alarm 5; };
# dispara a 1a vez, daqui a 5 segundos
alarm 5;
print "$^T\n";
#..... PROCESSO DE LONGA DURACÃO .....
# $^T deve estar atualizado, com um erro máximo de 5 segundos
# ajuste o valor do tempo do alarm de acordo com a necessidade
print "$^T\n";
Rodando o código acima, substituindo #….. PROCESSO DE LONGA DURACÃO ….. por um sleep(30), obtemos:
root@clapton:~/perl# perl modificado_alarm.pl
1194828811
1194828816
Percebeu que o tempo inicial não é o tempo final menos 30 segundos? Lembre-se que o sleep() acima é apenas para ilustrar um processo demorado. O sinal ALRM interrompe o sleep() aos 5 segundos(tempo que escolhemos para o alarm()) e retorna na linha após ele. Tratar corretamente de sinais UNIX é assunto para outro artigo. Lembre-se que o sinal interrompe tudo que está acontecendo e retorna no procedimento seguinte ao que foi interrompido. Saiba mais clicando aqui(link em inglês, se você conhecer em português por favor indique nos comentários deste post, obrigado).
Solucão 3 – use stat() no lugar de -M
stat() sempre retorna as datas de modificacão em segundos, assim basta subtrair de time() e teremos sempre preciso o periodo desde que o arquivo foi modificado.
Exemplo:
#!/usr/bin/perl
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat("/etc/passwd");
$modificado_segundos = time() - $mtime;
print "$modificado_segundos\n";
#..... PROCESSO DE LONGA DURACÃO .....
sleep(30);
$^T = time();
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat("/etc/passwd");
$modificado_segundos = time() - $mtime;
print "$modificado_segundos\n";
Obtemos:
root@clapton:~/perl# perl modificado_stat.pl
44439213
44439243
Lembre-se que, utilizando stat(), você obtém o retorno em segundos. Se o seu programa utilizar o número de dias e fracão de dia retornada pelo -M você deve se lembrar de converter esse dado dividindo o valor retornado do time() – stat()[9] por 86400(número de segundos num dia).
Como em todos os artigos aqui do blog, se tiver sugestões e outras solucões para este problema, envie através do campo de comentários aqui do blog. As melhores sugestões serão publicadas juntamente com o devido crédito ao autor.
Segundo um antigo colunista da PC Mag, John Dvorak, o Windows Vista é um fracasso tão gritante que a Microsoft praticamente decidiu continuar melhorando o Windows XP ao invés de empurrar o novo Windows na marra.
Eu não sei bem o que dizer do Windows Vista. Pelo que andei lendo na imprensa técnica é mais ou menos unânime que o Vista é um elefante no sofá da sala(roubando, em parte, expressão usada pelo Mr. Dvorak).
Leia o artigo de Dvorak clicando aqui (em inglês).
Bem, você deve estar pensando o que isso tem a ver com o título do artigo. É que eu não poderia começar um artigo sobre Windows sem antes mencionar a matéria do Mr. Dvorak cujo título pode se traduzir algo como “Monitorando a Morte do Windows Vista”…. Pra não fazer 2 posts, está aí : Dvorak diz que o Vista já morreu a não ser que a Microsoft tome algumas atitudes, as quais você pode conferir na matéria dele.
Voltando ao Windows XP(que ainda não morreu) : O que me deixa grilado é o tal do “Tempo ocioso do sistema” no Gerenciador de Tarefas. Já notou esse ítem por lá? Pois é, se não notou, basta dar o famoso Ctrl+Alt+Del no seu teclado e selecionar a folha de “Processos” no Gerenciador. Olhe lá : seu sistema pode estar uma porcaria de lento e o processo que, em tese, consome a maior parte dos recursos é, geralmente, o “Tempo ocioso do sistema”.
O que é esse tal tempo ocioso? De ocioso não tem nada. “Tempo ocioso” foi o termo que o departamento de marketing da Microsoft encontrou para deixar o sistema “mais amigável”. Acontece que praticamente tudo de importante no Windows acontece no Tempo ocioso do sistema. Difícil de acreditar? Mas é verdade.
Explico.
O tempo ocioso do sistema é o que os técnicos chamam de “system time”. O sistema operacional tem que fazer milhões de coisas para seu Word ou Internet Explorer funcionarem. O gerenciador de tarefas mostra os processos em execução no momento, mas o trabalho realizado pelo sistema operacional Windows(ou, em termos de UNIX, o kernel do Windows) aparece nessa lista como Tempo ocioso.
Por exemplo. Todo acesso a rede envolve, necessariamente, um dispositivo físico para acesso à rede. Digamos, uma placa de rede comúm de R$ 25,00. Essa placa se comunica com o Windows através de um programa “driver”, ou “condutor” em português. Esse programa funciona dentro do kernel do windows, lá no centro do sistema operacional. Como esse driver funciona e os detalhes de como ele entra no centro do Windows são um assunto à parte. Quando você envia um email, ele é traduzido do idioma humano e vai sendo colocado dentro de “envelopes”. Para um email sair de seu computador e chegar ao outro lado do mundo, ele é embrulhado aproximadamente em 7 ou 8 envelopes distintos. Os vários encaminhadores pelo caminho vão abrindo os envelopes até que chega ao envelope final que é o endereço de email de seu recipiente.
Quando essa mensagem passa do seu programa de email e vai para ser “envelopado”, adivinha quem está trabalhando? O tempo ocioso do sistema.
Quando você copia um arquivo. O explorer pede ao “tempo ocioso do sistema” que efetue a transação de disco, lhe forneça um arquivo aberto, copie o arquivo, etc.
Quando você clica em outra janela e alterna entre programas, o explorer pede ao “tempo ocioso do sistema” que efetue os trabalhos necessários para que a tela seja desenhada corretamente, etc e o novo programa apareça feito mágica para você.
Quando você liga o Windows e aparece aquela tela inicial preta com o logotipo no centro, lá atrás o “tempo ocioso do sistema” está ocupadíssimo tentando fazer tudo funcionar o mais normalmente possível.
E por aí vai. O tal do tempo ocioso do sistema normalmente é o que trava minha máquina. Decidí escrever este post porque há uns 15 minutos o tal do tempo ocioso estava trabalhando feito um louco e me deixou aquí esperando…. Eu acessei uma pasta Samba num servidor Linux do outro lado da rede. Como havia esquecido de ligar o servidor Linux os “envelopadores” dos protocolos de rede não tinham resposta….o “tempo ocioso do sistema” tomou conta e travou até que descobriu que o Linux do outro lado da rede estava desligado. Um minuto depois o Windows em avisou “Este recurso de rede não está acessível e blah blah blah”.
Os marketeiros exigiram da Microsoft que chamassem a parte do sistema que mais trabalha de “Tempo ocioso do sistema”… Normal, vindo da Microsoft.
Para quem gosta do Firefox, não deixe de experimentar o navegador que iniciou o projeto Mozilla (Thunderbird, Firefox, Netscape, etc)