domingo, maio 31, 2009

Livro de Maio: Tintin - The Complete Companion

As aventuras de Tintim encantam pessoas desde 1929. Em "Tintin - The Complete Companion", Michael Farr disseca um a um os álbuns escritos por Hergé, descrevendo as fontes das imagens no mundo real, as condições em que eles foram escritos e algumas curiosidades.



Um livro de porte

A Amazon (como as demais livrarias virtuais) apresenta as imagens das capas "chapadas" (vista frontal perpendicular) e com tamanho normalizado. Isto tem me trazido várias surpresas, uma vez que não costumo prestar atenção aos dados de dimensão e número de páginas. The Complete Companion é um exemplo disto. É um livro de páginas grandes, um pouco maior que uma folha A4 ou que um álbum do Tintim, com capa dura (coberta por uma sobrecapa) e 200 páginas. Como merece o assunto, possui uma quantidade muito grande de ilustrações (ocupando mais de metade do espaço das páginas), grande parte colorida.

A qualidade é bastante inesperada para um livro com preço de US$20 .

Uma abordagem muito completa

O livro aborda os 24 álbuns disponíveis, de "Tintim no País dos Sovietes" (que Hergé descartou posteriormente como uma tolice de juventude) a "Tintim e a Alfa-Arte" (incompleto e publicado após a morte de Hergé).

Embora não se trate de uma biografia (que o autor escreveu posteriormente), é apresentado um resumo da situação de Hergé quando da escrita de cada álbum.

São também discutidas as diferenças entre as publicações seriadas (inicialmente no Le Vingtième Siècle, depois no Le Soir e finalmente na Revista Tintin) e as várias edições dos álbuns (inclusive diferenças de nomes entre as versões belgas e inglesas).

O mais interessante, entretanto, são as comparações entre os desenhos dos álbuns e as imagens ou fotos que os inspiraram. O detalhismo e a preocupação com a realidade sempre foram uma marca registrada de Tintim e o livro mostra os extremos a que Hergé foi para garantir isto.

Polêmicas

Hergé e Tintim não escaparam de algumas polêmicas ao longo dos anos, que o livro aborda com detalhes.

comentei a crítica ingênua e estereotipada ao comunismo em "Tintim no País dos Sovietes". Os dois livros seguintes, "Tintim no Congo" e "Tintim na América", foram criticados por terem um visão colonialista e racista. Por exemplo, em "Tintim no Congo" Tintim dá uma aula de geografia falando sobre "a pátria de vocês: a Bélgica!". Por outro lado, as pessoas supostamente vítimas deste racismo sempre manifestaram seu gosto por Tintim. Mais ironicamente ainda, quando os álbuns foram publicados nos EUA as editoras exigiram que fossem alteradas cenas que mostravam brancos e negros juntos.

Na época destes álbuns Hergé trabalhava no Le Vingtième Siècle que tinha uma linha bastante conservadora. Com a invasão da Bélgica pela Alemanha durante a Segunda Guerra, o Le Vingtième Siècle foi fechado. Hergé foi então trabalhar no Le Soir, que se comportava como um jornal oficial dos alemães. Isto rendeu-lhe a acusação de colaborador (e até de nazista) após a derrota dos alemães.

Novamente a censura foi irônica: "Tintim na América" e "A Ilha Negra" foram censurados pelos alemães por conter referências aos EUA (na verdade não exatamente elogiosas) e à Inglaterra, porém "O Cetro de Ottokar" foi liberado apesar de ser uma crítica nada velada à política expansionista dos alemães no pré-guerra. Outros álbuns anteriores eram também críticos ao imperalismo do "eixo": "O Loto Azul" critica o Japão e na "A Ilha Negra" o vilão é um alemão imprimindo notas falsas para enfraquecer a Inglaterra. A invasão da Bélgica obrigou Hergé a interromper "Tintim no País do Ouro Negro" que tinha como trama um plano alemão de sabotar os combustíveis para enfraquecer os demais países europeus.

Em "Perdidos no Mar" Hergé denuncia a exploração e escravidão dos negros africanos, porém viu-se atacado pelo fato dos negros serem apresentados falando um fancês cheio de erros.

Veredito

Se você é fã de Tintim e tem fluência em inglês, recomendo fortemente este livro. Ele dará uma dimensão a mais aos álbuns, revelando detalhes e colocando-os em um contexto maior. E o deixará de queixo caído ao comparar os desenhos com as fotos que os inspiraram.

sábado, maio 30, 2009

Jogo do Mês: Duke Nukem Manhattan Project

Aproveitando o rebuliço causado pelo cancelamento de Duke Nukem Forever, o site Good Old Games (que eu comentei aqui) está com uma promoção até 1 de Junho: Duke Nukem 3D: Atomic Edition + Duke Nukem Manhattan Project por US$8.98.

Embora eu ainda tenha o meu antigo Atomic Edition, estas versões tem a vantagem de estarem para rodar no Vista e não terem proteção contra cópia (ou seja, não precisa deixar o CD no drive, dá para fazer backup, etc). O Manhattan Project eu conhecia de nome, mas nunca tinha jogado.

O Manhattan Project (MP) está agora comendo as minhas noites. É um jogo do tipo "plataforma", onde o jogador se movimenta sobre uma superfície, correndo e pulando. Este tipo de jogo é inerentemente 2D, porém o MP possui uma apresentação 3D com o jogador limitado a um caminho fixo. O resultado é visualmente muito bom e aumenta a imersão no jogo (chega a dar medo quando você está pulando de um andaime para outro no alto de um prédio).


Como é de se esperar (é Duke Nukem, certo?) o jogo tem uma boa quantidade de sangue (mas nada assustador) e algumas mulheres seminuas (mas não chega perto ao que você vê numa banca de jornal - e eu não estou nem mesmo me referindo a revistas pornô). O palavreado do Duke é meio chulo, mas quem não soltaria um ou outro palavrão quando mutantes estão metendo bala em você?

As armas e acessórios não são originais, mas continua sendo divertido usar as pipe bombs e o jetpack.

O GOG fornece ainda alguns extras como um conjunto de MP3 com as falas do Duke e dos vilões e alguns efeitos especiais. Ótimo para quem quer um ringtone realmente de arrepiar.

Veredito: realmente uma pechincha. Mesmo se você estiver lendo isto depois que a promoção acabou, vale tranquilamente o preço normal.

quinta-feira, maio 28, 2009

Impressora 3D para Doces

Uma das tecnologias que mais me impressiona são as impressoras 3D. Basicamente estamos falando de uma impressora capaz de imprimir sólidos.

E não estamos falando de ficção científica: a tecnologia já está disponível para uso até mesmo aqui no Brasil. tem máquinas à venda nos EUA por preços inferiores ao que se pagava pelas primeiras impressoras laser nos anos 80. Por enquanto a aplicação principal é fazer protótipos em plástico, mas já tem gente pensando em fazer prédios.

Tem até um projeto open-source de impressora 3D. Esta previsto até mesmo a capacidade de auto-reprodução (isto é, conseguir fabricar nela própria as partes necessárias para montar uma máquina igual).

Mas a máquina descrita aqui realmente me impressionou: uma impressora 3D que trabalha com açucar (e montada por hobbistas):


PS: Descoberto a partir do feed do Evil Mad Scientist, um site muito doido que eu comecei a acessar recentemente e está me dando boas idéias para projetos eletrônicos futuros.

quarta-feira, maio 27, 2009

Porque a Microsoft tem tantas versões do Windows Vista e Seven?

Uma das coisas confusas e irritantes do Windows Vista, e que deverá ser mantida no Windows Seven, é a quantidade absurda de versões. Qual o motivo disto?

A razão é um dos conceitos mais poderosos e perigosos do Marketing: a segmentação. Uma boa explicação disto, e outros fatores de precificação de software, está neste artigo clássico de Joel Spolsky (em inglês). O que segue abaixo é a minha tentativa de explicação (em português).

Tipicamente a quantidade de cópias que se espera vender de um software tem uma relação direta com o preço: quanto menor o preço mais pessoas irão comprar. Obs.: enfase no tipicamente; existem muitos outros fatores em jogo, como a associação de preço a qualidade.

Inciando o meu exemplo hipotético, vamos supor que o potencial de venda (número de cópias) de um determinado software varie da seguinte forma com o preço:

Em outras palavras, se eu fixar um preço de R$500, vou vender apenas duzentas cópias; se baixar o preço para R$100,00 venderei 1500 cópias.

Mais importante que o número de cópias é o lucro que eu terei. Continuando as minhas hipóteses, vamos supor que eu tenha tido um custo fixo de R$50.000,00 para desenvolver o software e que eu tenha um custo variável de R$30 por cópia vendida. Alguns minutos mexendo na planilha e chegamos ao seguinte resultado:

Aha! O preço de R$300 maximiza o meu lucro! Apesar do faturamento ser o mesmo que com preços de R$100 e R$200, nestes dois casos o lucro por cópia é tão mais baixo que o lucro total fica menor.

Hora de imprimir as etiquetas de preço... Mas a nossa vista não consegue fugir da primeira tabela. Em um extremo, temos 200 pessoas que estariam dispostas a pagar R$500; vendendo por R$300 estamos "perdendo" R$40.000! Na outra ponta, temos 1000 pessoas estão deixando de comprar o software por achar caro.

E aí surge a idéia da segmentação: vamos criar três versões, a Lite, Standard e Pro e vendê-las, respectivamente, por R$ 100, 300 e 500. Chegamos à planilha "matadora":

Por um momento se imagine apresentando esta tabela em uma reunião de diretoria. Você será aclamado como um gênio! Maximizou o lucro e a quantidade de cópias. Vai ganhar uma sala, um aumento e até a chave do banheiro da diretoria1! Talvez o presidente da firma até fale para a gatinha da filha2 dele prestar mais atenção naquele rapaz esperto.

Entretanto, o diretor financeiro (que é bom de números), sugere: "porque não criarmos também versões a R$200 e R$400"? Ao que o diretor comercial sai com a sugestão definitiva: "Vamos abolir a lista de preços e vender o produto pelo máximo que o cliente estiver disposto a pagar"! Ops...

Hora de acordar, lavar a cara com água fria e voltar à dura realidade do mundo real. Clientes não são números que podem ser movidos de uma coluna para outra (apesar de muita gente insistir o contrário). Os clientes vão comparar as opções independente de quanto estão dispostos a gastar. Se você esconder as opções no momento da venda, o cliente acabará descobrindo depois e vai ficar ainda mais bravo. O cliente que optou pela versão Lite vai reclamar que aquela "pequena coisinha essencial" só está disponível na versão Pro (que custa 5x mais). O cliente que comprou a versão Pro vai sentir-se enganado ao descobrir que suas necessidades são atendidas pela versão Standard que custa "quase a metade do preço". E é claro que é preciso uma campanha para educar vendedores e clientes sobre as diferenças entre as versões.

O segredo do sucesso de uma estratégia de segmentação está na diversificação das versões, na percepção de valor comparada aos preços e à percepção dos custos.

O cliente não vai gostar se achar que está sendo feita uma segmentação "forçada". Colocar um componente adicional em uma impressora para ela ficar mais lenta e ser vendida como um modelo mais barato não rola. Fabricar osciloscópios digitais com "x" megabytes de memória, bloquear metade disso e vendar a senha para liberar não rola. Limitar o tamanho da tela do computador que vai rodar uma versão do sistema operacional, vai rolar?

Por outro lado, existem inúmeros exemplos de segmentação bem sucedida, tanto com software como com outros produtos. A indústria automobilística trabalha exclusivamente assim (o engenheiro que propos as "16 válvulas" deve ter ganhado a chave do banheiro).

Concluíndo: o Windows Vista e o Windows Seven tem um monte de versões porque a Microsoft escutou e seguiu o conselho do diretor financeiro. E não escuta os protestos dos seus clientes.

Notas:

1Típica referência americana. Alguém sabe se isto é símbolo de status aqui no Brasil?

2As leitoras sintam-se à vontade de substituir "gatinha" e "filho" por "gatão" e "filho". Ou o que for da sua preferência.

quarta-feira, maio 20, 2009

Segurança é problema somente dos usuários Windows?

A Microsoft está definitivamente manchada pelos vários problemas de segurança nos seus produtos e para muitos Windows é sinônimo de vulnerabilidade. Usuários de outras plataformas às vezes leem esta afirmação na ordem contrária (vulnerabilidade = Windows) e vivem num estado de falsa segurança.

Topei hoje com um artigo do The Register que ilustra como problemas de vulnerabilidade estão presentes também na plataforma Mac:

http://www.theregister.co.uk/2009/05/19/unpatched_apple_vulnerability/

Resumindo o artigo, a Sun detectou há seis meses uma vulnerabilidade na JVM que a Apple ainda não corrigiu, apesar de ter liberado updates e novas versões do MacOS neste período. Quem quiser que vare a noite tentando entender porque a Apple precisa corrigir um problema da Sun, mas o fato é que a vulnerabilidade está lá.

É interessante também olhar os links em Related stories:

http://www.theregister.co.uk/2009/05/06/browser_update_study/

Um estudo de logs do Google observou que os usuários de Safari e Opera demoram mais para atualizar as suas versões. Os autores do estudo atribuem isto ao fato destes browsers não serem tão agressivos quanto o Firefox e Chrome no oferecimento de atualizações. Obs: o IE não entrou no estudo porque não revela o número completo da versão.

http://www.theregister.co.uk/2009/03/03/safari_at_pwn2own/

Na véspera de um concurso de hacking (em março), um veterano da edição anterior aponta o Safari como uma presa fácil e chega a dizer pelo menos uma das barreiras anti-hacking está atualmente melhor na plataforma Windows.

http://www.theregister.co.uk/2009/03/19/pwn2own_day1/

E efetivamente em questão de horas um competidor derrubou o Safari, Firefox e IE na competição. Pelo menos ele achou que está bem mais difícil quebrar browser agora que há alguns anos.

http://www.theregister.co.uk/2009/04/16/new_ibotnet_analysis/

Para fechar, notícias de uma botnet de Macs, cortesia de trojans incluídos em cópias piratas do iWork e Photoshop, e a afirmação de especialistas que os ganhos de mercado da Apple atraíram as atenções dos autores de malware.

CONSTANT VIGILANCE!

terça-feira, maio 19, 2009

Compilador Erra!

Completando as informações do meu post sobre um código estranho gerado pelo compilador IAR para o microcontrolador MS430, seguem o resultado de alguns testes adicionais e a comprovação que era realmente um bug do compilador.

Ainda utilizando a versão 4.11B do compilador, experimentei mudar o nível de otimização (o default é Low). Praticamente não fez diferença, exceto pela troca de CLRC + RRC.B por RRA.W nos níveis mais altos de otimização. Aliás, se tem uma sequência melhor para fazer uma operação não vejo porque não usá-la sempre; este mudança não parece estar ligada às opções ligadas no nível seguinte (commom subexpression optimization e code motion).

Parti então para a instalação da versão mais recente (4.20.1). Um ponto positivo é que cada versão instala por padrão em um diretório diferente e elas parecem conviver sem problemas. Esta versão gerou o mesmo código que a versão antiga (3.42A).

Passando um pente fino nos Release Notes da 4.20.1, encontrei na lista de correções:

EW20239: Incorrect code could sometimes be generated when accessing parts of volatile objects. Instead of accessing all bits in the object part, the code would only access a single bit. Typically, this would occur when using volatile in combination with bitfields.

O registrador P1OUT é realmente volatile e o código estava acessando um bit ao invés de todos, apesar de eu não estar usando bitfields mas sim constantes explícitas. Portanto acho que o meu problema se encaixa nesta correção.

Fica a preocupação de um bug destes, que envolve uma operação que considero comum, ter passado pelos testes e ter ido a campo.

segunda-feira, maio 18, 2009

Mentiras, Grandes Mentiras e a Interpretação de Gráficos

Esta na minha lista, há um bom tempo, um post falando sobre como usar e como não usar gráficos. Infelizmente, ainda não aprendi o suficiente para isto. O que não me impede de criticar as conclusões destacadas pelo Estadão com relação a um gráfico de criação de empregos formais nos últimos meses (clique para ampliar):

Reparar como o texto destaca "terceiro mês de crescimento" e que a "geração de vagas em abril foi três vezes maior que em março" e convenientemente ignora aquele "pequeno" pulso negativo de dezembro e os dados próximos a constante na primeira metade do gráfico.

Na minha opinião, uma manchete mais realista seria "nível de empregos continua recuperação após baque do fim de ano, mas ainda é metade da média de antes da crise".

sábado, maio 16, 2009

Watchmen (Graphic Novel) - Crítica

Há muito tempo que escuto falar deste marco das história em quadrinhos - Watchmen. Com o lançamento do filme decidi que era hora de finalmente lê-lo (acabei demorando demais e o filme já está saindo de cartaz). Apesar de terem sido lançadas edições em português, preferi comprar uma edição americana para ter o texto original.


Segundo as informações na Livraria Cultura, esta edição de 2008 contém páginas restauradas com ajuda do colorista original. Embora seja uma brochura ("capa mole" e encadernação por cola) o material das páginas é bom (mas não excelente).

A Arte

Os desenhos são bastante bons, mas não de "babar" (como o incrível "Marvels"). Um ponto alto é a composição das páginas, baseada em um grid de nove painéis.

Na minha opinião a arte transmite bem a história, sem roubar as atenções.

A História

Não vou entrar em detalhes para não tirar as surpresas de quem ainda não leu, quem quiser tem tudo descrito na Wikipedia. A narrativa se passa em uma história alternativa, na qual a presença dos super-heróis mudou de forma significativa a história dos EUA (que ganham a Guerra do Vietnã) e afetou o equilíbrio de forças entre EUA e URSS. É bom lembrar que as revistas foram publicadas originalmente em 1986 e 1987 época em que ainda existia uma forte preocupação com a Guerra Fria e um risco muito maior de uma guerra nuclear. Parte desta temática pode parecer "aguada" para os leitores atuais.

O termo super-heróis me parece um pouco inadequado, já que apenas um deles possui "super-poderes"; os demais contam apenas com preparo físico e inteligência. Na época da história, os "super-heróis" estão proibidos, exceto os que trabalham diretamente sob a supervisão do governo. Os demais ou se aposentaram ou atuam na clandestinidade.

A marca registrada da obra é a forma complexa como os heróis são apresentados. Além de traumas e limitações, existe bastante violência explícita.

A trama em si começa quando um dos heróis (que trabalha sobre a supervisão do governo) é assassinado. Rorschach (um dos heróis que atuam clandestinamente) desconfia de um complô para matar os heróis e começa a investigar e a contactar os seus antigos companheiros. A partir daí ocorrem uma sucessão de ataques a heróis, culminando com a descoberta de um plano que coloca em risco o mundo todo.

A conclusão da história é bastante surpreendente (embora eu ache um pouco ingênua).

Outros Aspectos

Existem várias sub-histórias correndo em paralelo com a história principal. Algumas são apenas pequenos lampejos das vidas de pessoas comuns. Existe, entretanto, um história dentro da história: um dos personagens está lendo uma aventura de pirata+horror (Tales of the Black Freighter). Pessoalmente não gosto deste tipo de aventura e achei que não acrescenta nada à trama.

No final de cada revista existe um "material de apoio", simulando um jornal, revista ou outro documento do mundo real. Alguns deles tem informações relevantes para a trama mas outros são apenas complementos para aumentar a atmosfera de realidade.

Veredito

No geral eu gostei mas não achei maravilhoso. É claro que é difícil considerar como deve ter sido na época do lançamento, já que influenciou muita coisa que veio depois mas eu li antes.

Eu aconselharia outra pessoa a ler? Depende. Não é uma leitura para qualquer um. É preciso gostar de quadrinhos, estar preparado para um pouco de violência e ter a mente aberta para algo diferente das histórias convencionais.

quinta-feira, maio 14, 2009

Compilador Erra?

Muitas vezes encontramos alguém reclamando que o "compilador fez besteira". Na maioria dos casos, o problema não estava no compilador, mas sim no código fonte. Considero o caso que relato a seguir como uma rara exceção.

O meu filho resolver tentar dar uma mexida no código do Spoke-o-dometer que estou desenvolvendo. Para isto instalei o sistema de desenvolvimento no micro dele e copiei a versão mais recente do código (que está aqui). Como primeiro teste, ele compilou o programa do jeito que estava e gravou no microcontrolador. E os LEDs piscaram de forma incorreta.

Descobri então que a versão que instalei no micro dele é mais recente que a que está instalada no meu. Concluí então que eu tinha feito alguma besteira no código fonte, que por sorte funcionava no compilador antigo. Após examinar o código sem encontrar nada estranho, resolvi gerar a listagem do código fonte entremeado com o código assembly gerado nas duas versões, para ver se tinha alguma pista.

Acabei chegando à linha abaixo:

P1OUT = (P1OUT & 0xC1) | (valor & 0x3E);

Este é um código tipo de quem precisa "brincar" com os bits em um microcontrolador. P1OUT é um registrador que controla algumas das saídas digitais; um bit em 1 corresponde a uma saída em nível alto e um bit em 0 corresponde a uma saída em nível baixo. No meu hardware, os bits 0 a 5 controlam 5 LEDs, o bit 0 é um LED verde que uso para indicar a detecção do ima e os demais são usados para mostrar os caracteres. 'valor' contém a nova programação dos LEDs (a coluna atual do caracter a ser apresentado), nos bits 7 a 1. Para colocar esta nova programação é preciso trocar o valor dos bits 5 a 1 de P1OUT, sem alterar os demais. É isto que a expressão booleana acima faz:

Na versão antiga do compilador (MSP430 C/C++ Compiler V3.42A/W32) o código gerado é bastante simples:
  MOV.B   R15, R14    ; R14 recebe o valor
AND.B #0x3e, R14 ; R14 contem valor & 0x3E
MOV.B &0x21, R13 ; 0x21 é o endereço de P1OUT
AND.B #0xc1, R13 ; R13 contem P1OUT & 0xC1
BIS.B R14, R13 ; R13 recebe R13 | R14
MOV.B R13, &0x21 ; atualiza P1OUT
Já a versão nova (IAR MSP430 C/C++ Compiler V4.11B/W32) gera esta pequena monstruosidade:
   MOV.B   R15, R14         ; R14 recebe o valor
CLRC
RRC.B R14 ; roda R14 para a direita
BIT.B #0x1, R14
JC ??Timer_A_TO_4 ; Desvia se (R14 & 0x01) != 0
BIC.B #0x2, &0x21 ; Desliga bit 1 de P1OUT
JMP ??Timer_A_TO_5
Timer_A_TO_4:
BIS.B #0x2, &0x21 ; Liga bita 1 de P1OUT
??Timer_A_TO_5:
ou seja, corresponde a algo como
if (valor & 0x02)
P1OUT |= 2;
else
P1OUT &= 0xFD;
Se alguém conseguir explicar porque este código foi gerado, eu agradeço. Por enquanto eu considero um bug do compilador.

Para contornar este problema a solução foi quebrar a expressão em duas linhas:
P1OUT = (P1OUT & 0xC1);
P1OUT = P1OUT | (valor & 0x3E);
o que gera o bem razoável
    AND.B   #0xc1, &0x21
MOV.B R15, R14
AND.B #0x3e, R14
BIS.B R14, &0x21
Reparar que a quebra em duas linhas causou duas escritas em P1OUT, o que não é problema neste caso. Se fosse problema, bastava montar o novo valor em uma variável auxiliar.

terça-feira, maio 12, 2009

Duke Nukem, Forever?

Com o anúncio da semana passada do fechamento da 3D Realms (também conhecida como Apogee Software) e o quase certo abandono do desenvolvimento do jogo Duke Nukem Forever, me parece uma boa hora para relembrar a série de jogos Duke Nukem. E de quebra comentar um pouco sobre a evolução dos gráficos no PC nas décadas de 80 e 90.

CGA: Um Mau Começo

Quando o IBM PC foi lançado, em 1981, a opção para apresentação de gráficos consistia na CGA (Color Graphics Adapter). A CGA era bastante limitada, mesmo para a época. A resolução para gráficos coloridos era de 320 x 200 pontos, com 2 bits para cada ponto. Ou seja, somente permitia quatro cores simultâneas. Além disso, a escolha de cores era muito limitada:
  • A cor 0 podia ser escolhida livremente, dentro de um conjunto de 16 cores.
  • Existiam basicamente duas opções para as demais três cores: vermelho/verde/marrom ou magenta/cian/branco.
Somado à baixa capacidade do processador (8088 @ 4.7MHz) e à falta de qualquer recurso adicional de hardware, os jogos da época eram bem simples e com poucos atrativos visuais.

EGA, Side Scrolling, Shareware e Duke Nukem 1

Em 1984 a coisa começou a melhorar com o lançamento da EGA (Enhanced Graphics Adapter). A EGA oferecia mais cores e uma certa capacidade de processamento. Era inicialmente uma placa cara, mas depois de algum tempo surgiram clones mais acessíveis.

Com isto começou a surgir uma quantidade maior de jogos, principalmente do tipo Plataforma (onde o jogador pula sobre obstáculos e para ir subindo ou descendo) com Side Scrolling (onde a imagem na tela "rola" para o lado quando o jogador atinge uma das laterais.

No lado do marketing, tornaram-se popular os programas shareware, em que parte ou todo o programa é disponibilizado gratuitamente com a exigência de pagamento para liberar o resto do programa ou usá-lo indefinidamente. Nesta época pré-internet, estes programas eram distribuídos via Bulletin Boards, discos afixados a revistas e pessoa-a-pessoa.

Dentre os vários programas deste tipo, um deles foi o Duke Nukem. Neste ponto ele não se distinguia dos demais jogos do gênero.

VGA, Duke Nukem II e Doom

Em 1987 a IBM lançou a VGA (Video Graphics Array) que expandia ainda mais os aperfeiçoamentos da EGA.

A continuação do Duke Nukem, Duke Nukem II, utiliza alguns recursos da VGA, mas ainda foi mais um jogo de plataforma na multidão.

Em dezembro de 1993, porém, a ID Software (antiga parceira da Apogee) lançou o jogo Doom, utilizando o poder da VGA para gerar gráficos 3D que "envolviam" o jogador. Estava popularizado um novo tipo de jogo, o first-person shooter (FPS).

Duke Nukem 3D

No começo de 1996, a 3DRealms usou o personagem Duke Nukem em um jogo FPS com características relamente marcantes. Em primeiro lugar, o personagem tinha uma forte personalidade, com humor irreverente. Os cenários abusavam de temática sexual. Do ponto de vista técnico, Duke Nukem 3D tinha várias vantagens sobre o Doom como um ambiente mais dinâmico (paredes marcadas pelos tiros do jogador ou derrubadas por explosivos, terremotos, etc). Algumas armas (como pipe bombs e laser trip mines) eram particularmente úteis para os jogos multiplayer via rede.

Um outro aspecto interessante é que o editor de nível era fornecido diretamente no CD (porém sem suporte oficial). Embora fosse um pouco instável era uma fonte adicional de diversão (meus filhos, que eram crianças na época se divertiam mais usando o editor como um espécie de CAD que com o jogo em si; talvez tenha sido aí que a minha filha decidiu ser uma arquiteta). Eu lembro de ter começado a fazer um nível representanto o prédio onde eu trabalhava, mas nunca acabei.

Duke Nukem 3D era tão atraente que conseguiu manter o interesse mesmo depois que a ID lançou o Quake, em meados de 96, com gráficos muito melhores e um 3D mais completo.

Duke Nukem Forever

Para ultrapassar o Quake, a 3D Realms partiu para o Duke Nukem Forever. Anunciado em 97, foi sendo sucessivamente adiado e se tornou um exemplo clásico de vaporware.

Duke Nukem: Manhattan Project

Para comemorar os 10 anos do primeiro Duke Nukem foi lançado o Duke Nukem: Manhattan Project, um jogo do tipo plataforma mas feito com um engine 3D.

Links

As versões shareware de Duke Nukem, Duke Nukem II e Duke Nukem 3D podem (por enquanto) ser baixadas do site oficial da 3D Realms:

http://www.3drealms.com/duke1/
http://www.3drealms.com/duke2/
http://www.3drealms.com/duke3d/

O Good Old Games oferece versões completas (e deprotegidas) do Duke Nukem 3D e Duke Nukem: Manhattan Project por US$5.99 cada:

http://www.gog.com/en/gamecard/duke_nukem_3d_atomic_edition
http://www.gog.com/en/gamecard/duke_nukem_manhattan_project

sábado, maio 09, 2009

Livro de Abril: Might As Well Be Dead

mencionei anteriormente o detetive Nero Wolfe, criado por Rex Stout. As histórias são daquelas em que a interação entre os personagens é mais importante que descobrir o assassino.

Não lembro de quando li o primeiro livro, mas deve fazer mais de 7 anos. Stout escreveu uma quantidade bastante grande de livros, que nem sempre estão disponíveis nas livrarias. Aos poucos estou tentando completar a coleção; comprei recentemente este exemplar na Amazon e apreveitei a minha viagem para lê-lo. Esta edição é um pouco maior (e mais cara) que um pocket book, mas tem a vantagem de ter a letra um pouco maior (algo importante para quem já passou dos 40).

Não é das melhores estórias de Nero Wolfe, mas todos os elementos clássicos estão nela e o mistério me cativou mais que a média. Nero Wolfe é contratado por um ricaço que brigou com o filho muitos anos atrás e agora descobriu que estava errado e quer re-encontrá-lo. Parece ser um caso tolo, do tipo que Nero Wolfe normalmente recusa. Até que o jovem sumido é encontrado na cadeia, prestes a ser condenado por assassinado. E os corpos se acumulam, à medida em as tentativas de obter pistas fracassam.

Um ponto relevante nas histórias de Nero Wolfe é que elementos como perseverança, sorte e (mais raramente) truques são muitas vezes tão decisivos quanto a genialidade (incontestável) do detetive. A forma como este caso em particular é "quebrado" pode parecer simples quando comparado aos raciocínios turtuosos de um Poirot, mas é certamente bem mais realista e crível.


Resumindo, não é um livro que ilustra todo o brilhantismo de Rex Stout ou Nero Wolf, mas é muito agradável de se ler e com um mistério bastante sólido.

sexta-feira, maio 08, 2009

A Pirataria Mundial - Segundo os EUA

Todo mês de abril, a IIPA (International Intellectual Property Alliance) - uma coalizão de associações de produtores de conteúdo e materiais protegidos por direitos autorais - trabalha junto com o governo americano na preparação do Special 301 Report, que examina as leis e práticas relativas a direito autoral nos principais parceiros comerciais dos EUA.

O relatório de 2009 (que você encontra aqui) trouxe algumas surpresas, como a inclusão do Canadá e manutenção de Israel na Priority Watch List (onde estão os piores violadores de direitos autorais). Embora o Canadá tenha níveis baixos de pirataria, a sua legislação é considerada pela IIPA como obsoleta e o Canadá vem resistindo há anos a alterá-la. No caso de Israel, o relatório menciona problemas na proteção à indústria farmacêutica e a IIPA reclama da falta de legislação proibindo a burla de mecanismos de proteção de direitos autorais.

A Watch List (o segundo nível de "malvadeza") traz vários países da Europa, como Espanha, Itália, Finlândia, Grécia e Noruega. É nesta lista que está o Brasil, sobre o qual as referências podem ser consideradas até generosas para quem conhece a nossa realidade; a principal reclamação é novamente a proteção às patentes farmacêuticas.


As recomendações da IIPA estão aqui.

Fontes da notícia:

Dvorak Uncensored
BBC News

quinta-feira, maio 07, 2009

Malware Atacando o Arquivo hosts

Um dos meus colegas teve o micro infectado por um malware esta semana. Embora os detalhes técnicos que tenha obtido são poucos, acho que a vale à pena relatar para a meia dúzia de seguidores do blog.

Que existem muitos malwares à solta todos nós sabemos. Ver uma máquina infectada (pelo menos para mim) não é tão comum. No caso do meu colega o susto fui imenso, pois ele estava iniciando o acesso ao banco quando percebeu que tinha algo estranho.

Ele não conseguiu descobrir como foi infectado nem achou uma descrição exata da peste, o mais aproximado foi http://www.threatexpert.com/report.aspx?md5=a2def6cc9d0cac3cc98f3970d86daed2.

O desgraçado substitui o arquivo hosts, que no Windows XP fica normalmente em C:\WINDOWS\system32\drivers\etc. O arquivo hosts alterado associa IPs falsos para as URLs de vários bancos, como Banco do Brasil, Nossa Caixa e Itaú; estes IPs falsos prevalecem sobre os informados pelo DNS (mais precisamente, quando uma URL é encontrada no hosts não é feita uma consulta DNS). Além disso instala um keylogger, para enviar ao bandido as senhas digitadas.

Felizmente o malware não toma cuidados muito grandes em se esconder e (aparentemente) foi removido à mão sem maiores dificuldades.

Detalhe: tudo isto aconteceu sob as barbas do AVG. Um scan do AVG também não reclamou de nenhum dos arquivos executáveis da praga.

Como dizia Mad-Eye Moody: CONSTANT VIGILANCE!

quarta-feira, maio 06, 2009

Spoke-o-dometer - Parte 7

Continuando a nossa série, vamos ver se conseguimos mostrar alguns caracteres com o circuito. Neste ponto vou tentar mostrar apenas números.

O Gerador de Caracteres

Lembrando, o nosso circuito possui 7 LEDs que correspondem a uma coluna no nosso gerador de caracteres. Optei pelo formato 5x7 (5 colunas x 7 linhas) para a matriz de caracteres, que era bastante tradicional nos primeiros terminais de vídeos e assemelhados.

A figura abaixo mostra os desenhos que fiz para os dígitos:

No meu circuito, os LEDs correspondem (de cima para baixo) a P2.7, P2.6, P1.5, P1.4, P1.3, P1.2 e P1.1. Isto facilita guardar cada coluna em um byte, seguindo a mesma ordem de bits:
static const byte gc[10][5] =
{
0x7C, 0x82, 0x82, 0x82, 0x7C, // 0
0x02, 0x42, 0xFE, 0x02, 0x02, // 1
0x46, 0x8A, 0x92, 0xA2, 0x42, // 2
0x44, 0x82, 0x92, 0x92, 0x6C, // 3
0xF0, 0x10, 0x10, 0x10, 0xFE, // 4
0xF2, 0x92, 0x92, 0x92, 0x8C, // 5
0x6C, 0x92, 0x92, 0x92, 0x0C, // 6
0x80, 0x86, 0x98, 0xA0, 0xC0, // 7
0x6C, 0x92, 0x92, 0x92, 0x6C, // 8
0x60, 0x92, 0x92, 0x92, 0x6C // 9
};
Timing

Neste teste, resolvi aumentar o clock via DCO para 8MHz e usar uma interrupção periódica a cada 0,5 ms (o meu tick). A rotina de interrupção conta os ticks entre as detecções do imã (ou seja, mede o tempo de uma volta). Esta contagem é dividida em 360 frames (360 para ficar fácil pensar em graus). Cada coluna de caracter é apresentada por um frame; após cada caracter os LEDs ficam apagados por 3 frames, para dar uma separação entre os caracteres.

Os LEDs ficam também apagados nos 45 frames após o imã (para colocar a imagem numa posição fora do quadro) e ao final da mensagem.

Uma última complicação é que na posição em que eu montei os caracteres precisam ser escritos de "trás para frente" (da última coluna do último caracter para a primeira coluna do primeiro caracter). Por simplificação a "mensagem" é fixa e deverá já estar com os caracteres em ordem invertida (mais exatamente, a mensagem é "9876543210" o que aparece no programa como "0123456789".

O Código

O código nesta etapa ficou assim:
/*
Spoke-o-dometer
Teste3 - Teste de Display

Daniel Quadros - abril, 2009
*/

#include <msp430.h>

// Valor para contar 500us c/ clock de 12KHz
#define TEMPO_500uS 6 // 0,5ms * 12KHz

// Limites para detectar passagem pelo imã
#define VREPOUSO 88 // 01011000
#define VPOS_1 120 // 01111000
#define VPOS_2 100 // 01111000
#define VNEG_1 56 // 00111000
#define VNEG_2 76 // 00111000

#define FALSE 0
#define TRUE 1

typedef unsigned char byte;

// Gerador de Caracter (versão numérica)
// Cada caracter corresponde a 5 bytes
// Cada byte corresponde a uma coluna
static const byte gc[10][5] =
{
0x7C, 0x82, 0x82, 0x82, 0x7C, // 0
0x02, 0x42, 0xFE, 0x02, 0x02, // 1
0x46, 0x8A, 0x92, 0xA2, 0x42, // 2
0x44, 0x82, 0x92, 0x92, 0x6C, // 3
0xF0, 0x10, 0x10, 0x10, 0xFE, // 4
0xF2, 0x92, 0x92, 0x92, 0x8C, // 5
0x6C, 0x92, 0x92, 0x92, 0x0C, // 6
0x80, 0x86, 0x98, 0xA0, 0xC0, // 7
0x6C, 0x92, 0x92, 0x92, 0x6C, // 8
0x60, 0x92, 0x92, 0x92, 0x6C // 9
};

static byte bDetectou = FALSE; // TRUE qdo detecta o imã

static unsigned long tickVolta;
static unsigned long tickFrame = 0;
static unsigned long contFrame;
static byte col;
char *pMsg;

#define NFRAMES 360
#define POS 45
#define SPACE 3



// Programa Principal
void main (void)
{
unsigned int cont = 0;

// Desliga Watchdog
WDTCTL = WDTPW + WDTSSEL + WDTHOLD;

// Altera a configuração de clock para ativar o VLOCLK
BCSCTL3 |= LFXT1S1;

// Programa entradas e saídas
P1SEL = 0xC0; // P1.0 a P1.5 -> LEDs
// P1.6 e P1.7 são A3+ e A3-
P1DIR = 0x3F;
P1OUT = 0; // Todos as saídas em zero

P2SEL = 0; // Todos os pinos como I/O
P2DIR = 0xFF; // Todos os pinos como saída
P2OUT = 0; // Todos as saídas em zero

// Programa o ADC
// MSP430F2013 -> SD16
SD16CTL = SD16VMIDON + SD16REFON + SD16DIV_3 + SD16SSEL_1; // 1.2V ref, SMCLK / 8
SD16INCTL0 = SD16INCH_3; // PGA = 1x, Diff inputs A3- & A3+
SD16CCTL0 = SD16SNGL + SD16UNI + SD16IE; // Single conversion, Unipolar, 256 SR, Int enable
SD16CTL &= ~SD16VMIDON; // VMID off: used to settle ref cap
SD16AE = SD16AE6 + SD16AE7; // P1.6 & P1.7: A3+/- SD16_A inputs

// Dá um tempinho para estabilizar a alimentação
while (cont < 0xFF)
cont++;
cont = 0;

// Alimentação já deve estar estável, vamos ligar o DCO
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;

// Programar a interrupção de tempo real p/ cada 0,5ms
TACCR0 = TEMPO_500uS;
TACTL = TASSEL_1 + MC_1 + TAIE; // ACLK, up mode, interrupt

// O nosso programa principal vai ficar dormindo,
// todo o tratamento será feito na interrupção
_BIS_SR(LPM3_bits + GIE); // Dorme tratando interrupção

// Nuca vai chegar aqui
while (1)
;
}

// Tratamento da interrupção do Timer A
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A_TO(void)
{
byte valor;

switch (TAIV)
{
case 10: // overflow
tickVolta++;
if (tickFrame != 0)
{
if (contFrame == 0)
{
if (col > 0)
{
col--;
valor = gc [*pMsg - '0'][col];
P1OUT = (P1OUT & 0xC1) | (valor & 0x3E);
P2OUT = (P2OUT & 0x3F) | (valor & 0xC0);
contFrame = tickFrame;
}
else
{
P1OUT = P1OUT & 0xC1;
P2OUT = P2OUT & 0x3F;
col = 5;
pMsg++;
if (*pMsg == 0)
tickFrame = 0;
else
contFrame = tickFrame * SPACE;
}
}
else
contFrame--;
}
SD16CTL |= SD16REFON; // Liga a referência do SD16
SD16CCTL0 |= SD16SC; // Inicia uma conversão
_BIC_SR_IRQ (SCG1+SCG0); // Manter osciladores ligados
break;

case 2: // CCR1, não utilizado
break;
}
}

// Tratamento da interrupção do SD16
#pragma vector = SD16_VECTOR
__interrupt void SD16ISR(void)
{
unsigned int result;

SD16CTL &= ~SD16REFON; // Desliga referência do SD16_A
result = SD16MEM0 >> 8; // Pega resultado (limpa IFG)

if (!bDetectou && ((result > VPOS_1) || (result < VNEG_1)))
{
bDetectou = TRUE;
tickFrame = tickVolta / NFRAMES;
pMsg = "0123456789";
contFrame = tickFrame*(NFRAMES - POS - 10*(5+SPACE));
tickVolta = 0;
col = 5;
P1OUT |= 1;
}
else
{
if (bDetectou && (result < VPOS_2) && (result > VNEG_2))
{
bDetectou = FALSE;
P1OUT &= 0xFE;
}
}

_BIS_SR_IRQ (SCG1+SCG0); // voltar para LPM3
}


O Resultado

Ainda está longe do que eu espero chegar, mas o vídeo abaixo é uma bela "prova de conceito".

video

terça-feira, maio 05, 2009

Observações Rápidas de Viagem

A "pobreza" de posts da semana passada foi por ter ido participar de uma conferência "no exterior".


Seguem algumas observações rápidas sobre a viagem e a conferência.

A Informática nas Companhias Aéreas

As companhias aéreas sempre foram ávidas consumidoras de informática. Entretanto, a minha experiência pessoal não foi muito boa: tanto o site de reservas (para ver os vôos da minha reserva) como o quiosque de auto-atendimento (para imprimir o cartão de embarque) negaram fogo. Aliás, cartão de embarque tem mesmo um ar de antiguidade, com sua semelhança aos cartões perfurados.

Dicas de Viagem

Isto certamente está longe da temática do blog e a minha experiência é baixa, mas não custa lembrar o óbvio:
  • Existe uma variação muito grande no preço das passagens conforme o dia da semana e o horário. Dá para economizar um bom dinheiro se você conseguir adaptar a sua programação de viagem às passagens mais baratas.
  • Chegue cedo no aeroporto. No mínimo é uma preocupação a menos durante a viagem.
  • Vá preparado para longas esperas (corolário do ponto anterior). No meu caso, isto significa levar pelo menos um pocket book.
  • Simplifique as suas bagagens, principalmente nas viagens curtas. De preferência uma maleta pequena (ou mochila) para ir junto com você no avião e uma mala média para despachar. Tente achar o tamanho certo de mala, onde caiba o que você vai levar mais o que vai trazer sem ter que sentar na tampa mas não seja grande a ponto de atrapalhar a movimentação.
A Conferência

Para quem tentou ler as letras miúdas na foto acima, a conferência foi um encontro de "parceiros" da Motorola EMS (Enterprise Mobility Solutions) nas Américas (América do Norte e América latina). Esta é a divisão que encampou a Symbol Technologies, empresa líder na área de coletores de dados e leitores de código de barras e com participação marcante na área de WLAN.

A minha empresa participou como uma ISV (Independent Software Vendor). A conferência teve algo da ordem de 500 participantes, entre distribuidores, revendas e ISVs, dos quais duas dúzias de brasileiros (sem contar os funcionário da Motorola EMS no Brasil).

Nas manhãs teve apresentações da própria Motorola e de palestrantes externos, em um grande salão. Nas tardes os participaentes se dividiram em várias sessões menores.

No último dia de manhã teve uma sessão especial só para o pessoal da América Latina.


A Crise Financeira

A crise continua sendo um assunto em alta. Os palestrantes externos foram um economista e um futurólogo, ambos dandos previsões e sugestões sobre a crise. Várias das sessões menores estavam relacionadas à crise. Apesar disto, o clima era de grande otimismo.

A Palestra Motivacional

Esta foi a quarta vez que fui num encontro que tinha uma palestra motivacional e continuo me impressionando com este tipo de esquema. São pessoas que fizeram algo de excepcional, escreveram um livro sobre a experiência e montaram uma palestra muito bem "azeitada" sobre o assunto. Aqui no Brasil este tipo de pessoa cai no esquecimento (muitas vezes na miséria).

A palestra foi de Chris Gardner, cuja história muitos devem ter visto num filme.

Espetacular.

Tecnologia

Este tipo de evento (congresso de parceiros) não é muito voltado para tecnologia. Entretanto, não faltaram algumas apresentações mais técnicas sobre produtos e uma pequena "feirinha" na primeira noite.

Para quem já conhece este mercado, nada de novo. Os coletores continuam sendo PDAs ou Smartphones robustos (e bem mais caros que os PDAs e Smartphones para consumidores comuns) rodando Windows CE / Windows Mobile. GPRS, GPS, WiFi e Bluetooth estão presentes nos lançamentos mais modernos.

Os equipamentos de infraestrutura WiFi da Motorola EMS utilizam (na maioria) a arquitetura de wireless switch, com access ports extremamente simples controlados via rede por um switch sofisticado. São sistemas voltados para redes corporativas, com recursos bem mais sofisticados que os roteadores e pontos de acesso normalmente usados em casa e nas pequenas empresas. A Motorola adquiriu recentemente uma empresa especializada na detecção de tentativas de intrusão em redes sem-fio e está integrando esta tecnologia nos seus equipamentos.

RFID continua sendo uma aplicação para o futuro. Me pareceu que finalmente o mercado acalmou um pouco das promessas mirabolantes feitas no passado.