Category: Software / Projetos

Estes são alguns dos softwares, sites e projetos de mídia que eu criei ou ajudei a desenvolver, sempre sob licenças livres (GPL, MIT, Creative Commons e outras, conforme o caso):


sorteio2600

November 7, 2011

O sorteio2600 é um programa que eu fiz para o Dev In Vale, por sugestão do Willian Fernandes, um dos organizadores do evento. Já que eu já ia demonstrar o Hello World em um Atari de verdade (graças ao Harmony), e a minha palestra era a última, a idéia era aproveitar o setup e fazer o sorteio dos brindes no próprio Atari.

Pensei que seria uma tarefa fácil, mesmo numa plataforma tão limitada, mas levei umas vinte horas ou mais quebrando a cabeça para que o programa saísse! Este post comenta o processo de desenvolvimento e no final mostra um vídeo do software rodando no Atari. É recomendável ver os slides ou assistir à palestra para entender melhor, mas talvez dê pra acompanhar sem isso.

Dígitos na tela ⇒ Python ao resgate

O ponto de partida foi o Hello World da palestra (que escreve uma frase na tela usando o playfield, isto é, os 20 “pixels largos” que ocupam a parte esquerda da tela do Atari, repetidos no lado direito). Usando o score mode, é possível esconder um dos lados (colocando nele a mesma cor do fundo), e usando 6 pixels por dígito seria possível representar os três dígitos necessários para escrever um número entre 000 e 999.

O problema com essa idéia é que dígitos não se alinham com os registradores do playfield (PF0, PF1 e PF2). Veja na ilustração como eles precisam ser posicionados:

Dígitos nos registradores do playfield do Atari

Seria necessário fazer vários shifts para combinar os dígitos nos registradores, e, além disso, temos o fato de que o PF0 e o PF2 são lidos “ao contrário” (com o bit menos significativo à esquerda). Era muita manipulação pra fazer on-the-fly, então resolvi que, ao invés de uma única tabela de bitmaps dos dígitos, eu teria duas tabelas para o dígito das centenas (uma para o PF0 e outra para o PF1), duas para o das dezenas (uma para o PF1 e outra para o PF2) e uma para a unidade (que fica inteira no PF2).

As tabelas já teriam as inversões e shifts pré-executados, tornando a operação de escrever o PF1 e o PF2 tão “simples” quanto ler um valor, combiná-lo com outro (via operação OR ou soma) e armazenar. O PF0 teria só uma leitura e armazenamento, e isso tudo poderia ser feito na scanline enquanto o canhão está do lado esquerdo da tela (que não seria usado de qualquer forma, já que eu queria os dígitos no lado direito).

Calcular essas tabelas de bits manualmente seria um porre, mas eu não precisaria fazer isso, já que tenho um computador: fiz um script Python que lê os bimaps dos caracteres “0″ a “9″ e gera o .asm com as tabelas descritas acima (recorrendo novamente à fonte do ZX Spectrum, que já tinha transcrita em hexadecimal no tilewriter).

Score Mode

Teria sido um plano perfeito, não fosse por um detalhe: o score mode foi feito para desenhar placares, não para dividir perfeitamente a tela. No emulador tudo funcionava bem, mas no Atari de verdade o TIA muda a cor um pouco antes do esperado, fazendo com que um pedaço do playfield esquerdo apareça onde não deveria.

Se eu soubesse disso antes, teria usado menos bits, mas com o programa já escrevendo os caracteres na tela, apelei: estiquei o missile 0 (que já tinha a mesma cor que o fundo da tela) e posicionei de forma a cobrir a parte da tela onde aparece o lixo. Não é a solução mais limpinha do mundo, mas funcionou bem.

Etapas do sorteio

Com tudo isso eu já tinha um programa que escrevia dígitos arbitrariamente na tela. A partir daí, se eu incrementasse o número a cada scanline não utilizada, eu teria eles mudando na tela em alta velocidade, dando um efeito de sorteio. Incrementando a cada frame (ou a cada n frames) eu podia reduzir a velocidade, o que me levou a dividr o programa em quatro “modos”:

  • Modo select: Mostra os dígitos correspondentes ao limite máximo do sorteio. Pressionar GAME SELECT em qualquer outro modo muda para este, e pressionar novamente GAME SELECT incrementa o limite máximo (de 100 em 100).
  • Modo rodando: Acionado pelo GAME RESET, este modo incrementa o número a cada scanline, conforme descrito acima. Aqui surgiu um dos bugs mais difíceis de encontrar: eventualmente eu usava duas scanlines (por conta do “vai um”) sem contabilizar, gerando uma tela com scanlines a mais. Isso fazia o vídeo tremer, por perder a sincronia.
  • Modo parando: Passsa a valer se o jogo estiver no modo rodando e o usuário apertar o botão do joystick. Ele incrementa o número a cada n frames, começando em 2 e aumentando aos poucos. Com isso, os números vão avançando cada vez mais devagar por uns poucos segundos, simulando o efeito de uma roleta parando (confesso: a minha inspiração foi a memória do Roletrando nos anos 80!)
  • Modo parado: Quando o atraso de frames do modo parando chega a um limite, é hora de parar e declarar um número vencedor. Para isso o programa muda para este modo, permanecendo nele até um novo GAME RESET.

Números (pseudo-)aleatórios

Mesmo implementando todos esses modos, ainda havia um problema: a pseudo-aleatoriedade seria garantida pelo fato de um tempo indeterminado se passar entre o GAME RESET e o botão do joystick ser pressionado, e neste tempo incrementarmos o número sorteado a cada scanline fora do desenho. Isso tem um problema: se temos k scanlines livres na tela, o sorteio avança de k em k números, e dependendo dos divisores comuns entre este número e o limite superior do sorteio, o mesmo ficaria limitado a um subconjunto de números.

Como o limite superior varia, o melhor jeito de evitar o problema era inicializar o contador com um número pseudo-aleatório “de verdade”. Para isso, a solução foi introduzir um contador de um byte na RAM, incrementado a cada frame enquanto o console estiver ligado, e usá-lo para inicializar a dezena e unidade do número sorteado. Um truque bacana foi fazer este incremento usando o modo decimal, ou modo BCD do 6502. Com isso, cada nibble do contador contém um dígito de 0 a 9, e pode ser usado diretamente para inicializar a dezena ou a unidade.

Som

Com isso, faltava adicionar um efeito sonoro que complementasse o sentimento de “roleta”. Não falei sobre som na palestra, mas a teoria é simples: o TIA tem dois circuitos de som independentes, e pra cada um você pode escolher o volume, a frequência e o tipo de som, escrevendo nos registradores apropriados.

É preciso usar alguns dos minguados ciclos para gerenciar isso, e a produção de músicas é dificultada pelo fato de as frequências não baterem com uma oitava musical “tradicional”. Mas para esse programa não foi um problema: fiz um tom curto e grave ser acionado a cada frame em que ocorre uma mudança de dígitos. O resultado é um ronco de motor meio Endurozento no modo rodando e um tuc-tuc-tuc no modo parando, o que serviu bem ao propósito.

Cores e o resultado final

O toque final foi acrescentar cores: deixei uma diferenciada para o modo select, e no modo parado eu reutilizei o contador de frames para mudar as cores constantemente (se não fosse o BCD, creio que ficaria parecido com o cálice do Adventure). Isso deixou o programa pronto para usar, e o pessoal do evento curtiu o sorteio feito de forma tão inusitada. Veja ele em ação:

Normalmente eu programo com um pouco mais de planejamento, mas no Atari as limitações do hardware fazem com que qualquer coisa além de uma idéia inicial viável tenha que ser decidida conforme os recursos vão permitindo. Foi assim que David Crane criou o Pitfall! – ele tinha um esquema pra fazer um homenzinho correndo, e queria bolar um jogo usando isso:

Eu sentei com uma folha de papel em branco e desenhei um homenzinho no meio. E disse, “Ok, eu tenho um homenzinho que corre, vamos colocá-lo em um caminho [mais duas linhas desenhadas no papel]. Onde fica esse caminho? Vamos colocá-lo em uma selva [desenho umas árvores]. Por que ele está correndo [desenho tesouros a coletar, inimigos a evitar, etc.]?” E o Pitfall! nasceu. Todo esse processo levou uns dez minutos. Cerca de 1000 horas de programação depois, o jogo estava pronto.

David Crane, em entrevista de 2003

My Retweeted Tweets

July 17, 2011

My Retweeted TweetsEu nunca me animei a colocar o widget do Twitter no blog porque meus tweets variam bastante, e nem todos são interessantes para um público mais amplo. Isso mudou quando ouvi, nos dois últimos minutos do Nerdcast 264, o Rafinha Bastos confessar que:

“Eu (…) deixo no meu twitter só as (…) tweetadas¹ que foram bem retweetadas”

O comentário pode parecer inócuo, mas ajuda a explicar como ele foi considerado tão influente pelo The New York Times – essa “limpeza” garante uma excelente proporção de retweets por tweet na timeline. E o filtro popular deixa quase tudo mais bacana – como qualquer leitor do Digg sabe. Mesmo sem a multidão de seguidores do Rafinha, é possível olhar a própria página de tweets que foram retweetados e conferir a diferença com relação ao “dia-a-dia”.

Infelizmente o widget do Twitter não permite colocar apenas os tweets retweetados. A API de busca também não ajuda, porque só vai até uns poucos dias no passado. O jeito foi colocar a mão na massa e criar o meu próprio widget. Usando o Google AppEngine, a API do Twitter (via Twitter4J) e um final de tarde, saiu o My Retweeted Tweets.

Basta autorizar o aplicativo e ele gera o código que você pode usar para deixar os tweets retweetados em evidência, como eu fiz na coluna lateral do blog (e na ilustração). O código-fonte, como de costume, é livre (Apache License) e está disponível para quem quiser. O aplicativo foi feito para uso próprio, então ainda pode ser bastante melhorado, mas está lá.

¹ Sim, tweetar e seus derivados forçam a amizade, como me lembrou a Bani. Mas é o que a tradução oficial do Twitter diz, então paciência…

miniTruco Android

July 10, 2011

Clique para baixar o miniTruco AndroidA versão Android do miniTruco está pronta e disponível para download no Android Market. O software é gratuito, e, mais importante: o código-fonte é livre (GPLv3).

miniTruco Android (para leitores de QR Code)O jogo original para Java ME foi criado em 2005, e ainda hoje ultrapassa os 6000 downloads/mês. Publiquei uma versão Android bem instável no final de 2010, e nas últimas semanas dei uma polida nela. Isso só foi possível graças ao feedback através do Market, então continuem sugerindo, criticando e reportando por lá!

A única coisa do miniTruco original que ficou para o futuro foi o multiplayer. Ainda não sei qual tecnologia usar (deve ser Wi-Fi, Bluetooth só me deu dor-de-cabeça), nem o modelo comercial – será que vinga uma colaboração pela versão paga? Por ora vou dar atenção para outros projetos, mas uma hora eu retomo essa parte.

Créditos

As imagens (logotipo, ícone, baralho, etc.) são de autoria da Bani. A contagem de tentos do truco mineiro (versão 1.1) foi implementada pelo Guilherme Caram. O jogo não seria possível sem os códigos de estratégia do Leonardo Sellani e do Sandro Gasparoto (que também criou o gTruco), além do código do Willian Gigliotti, que não veio para essa versão, mas foi a estratégia original que viabilizou todas as outras.

 

SMS-Denúncia

March 8, 2011

SMS-Denúncia

Se já é difícil usar o transporte público em condições normais, a situação piora quando tem gente fazendo coisa errada: vândalos, ladrões, vendedores ilegais – isso pra não falar nos malditos chatos com som alto. Por conta disso, a CPTM e o Metrô de São Paulo criaram o SMS-Denúncia: você manda um SMS identificando a ocorrência, o meliante e o local, e os funcionários tomam providências.

O problema é que até você mandar o SMS com todas as informações necessárias o infrator já foi embora. A Bani testemunhou isso acontecendo comigo e programou o SMS-Denúncia para Android – você responde a algumas perguntas com poucos toques na tela do aparelho, e o aplicativo compõe e envia o SMS.

Resolvi dar outro passo e programei o SMS-Denúncia para Java ME, isto é, para celulares que aceitam aplicativos Java (possivelmente a maioria dos aparelhos em atividade nos trens). Você pode instalar pelo navegador do celular – basta abrir o endereço http://chester.me/smsdenuncia, ou baixar no computador e transferir para o aparelho, usando este link para o arquivo .jar.

Os dois aplicativos são software livre (licença MIT), e o código-fonte está no github. Use com responsabilidade e ajude a fazer o Metrô e a CPTM melhores para todos os usuários!

tilewriter – desenhando ladrilhos em JavaScript

June 20, 2010

Eu fiquei vidrado no layout de "ladrinhos" do logotipo do site do RHoK, que lembra os micros de 8 bits sem deixar de ser moderno, e pensei "taí, vou roubar me inspirar criar um trabalho artístico derivativo para o próximo update visual do meu blog".

O chato é que não apenas sou um zero à esquerda em GIMP/PhotoShop, mas também queria algo que pesasse menos no carregamento. Solução: programar.

O canvas do HTML5 viria a calhar, mas o suporte dos browsers ainda está longe do ideal. Resolvi, então, criar uma biblioteca minimalista para fazer desenhos nesse estilo usando elementos de HTML. More…

Urban Fact (Fato Urbano) / RHoK #1 SP

June 7, 2010

O Random Hacks of Kindness (RHoK) reuniu programadores em vários locais do mundo simultaneamente ao longo do último fim-de-semana, com o objetivo de desenvolver ferramentas que possam ajudar a lidar com os desafios gerados pelo risco de desastres naturais.

O esforço foi patrocinado e liderado por gente do Google, Yahoo!, Microsoft, NASA e do Banco Mundial, e eu não só tive a oportunidade de participar da primeira edição de São Paulo, que aconteceu aqui na Fundação Getúlio Vargas (FGV), mas também tive a alegria de ter o projeto do meu grupo, o Urban Fact, premiado com o segundo lugar.
More…

cruzalinhas

June 4, 2010

O site da SPTrans oferece várias informações sobre as linhas de ônibus, trem e metrô que operam na cidade de São Paulo. A navegação, entretanto, deixa um pouco a desejar – razão que leva as pessoas a alternativas como o Tô a Pé e o eficiente sistema de rotas do Google Maps.

Este último resolve bem a minha vida, mas às vezes tudo o que eu quero é saber quais ônibus passam por um determinado local. Ou ainda: quais, dentre eles, passam por um segundo local, e quais passam entre este e um terceiro, i.e., quais minhas opções para ir do ponto A ao ponto B, e dele ao ponto C, e por aí em diante.

Misturando essa demanda com um desejo de colocar as informações de itinerário do transporte público de São Paulo nas mãos da população, desenvolvi o cruzalinhas. A aplicação ainda precisa de muitas melhorias (eu diria que é “beta”, mas o que não é?) mas já permite responder às perguntas acima.

Como de costume, o código-fonte é livre (licença MIT), e esse post vai falar um pouco sobre o funcionamento do mesmo.

cruzalinhas

More…

SlideMeme

March 24, 2010

Bani and ChesterBR @ Yahoo! Open Hack Day Brasil 2010O SlideMeme foi hack que eu e a Bani apresentamos no Yahoo! Open Hack Day Brasil 2010. O objetivo dele é oferecer uma forma visualmente agradável e conveniente para postar apresentações do SlideShare no Yahoo! Meme, e claro que ficamos muito contentes por ele ter sido premiado como melhor hack na categoria Meme!
More…

MemeThis

October 5, 2009

O último ano viu o surgimento de uma quantidade enorme de sites inspirados no Twitter. Alguns tentam traduzir e/ou adaptar para culturas locais, outros tentam expandir o conceito (incluindo fotos, voz, etc.) – isso sem falar em sites já estabelecidos que abraçaram a idéia. Uns foram comprados por gente grande – e vários fecharam, mesmo com alguém bancando.

Era de se esperar que o Yahoo! entrasse nessa arena de alguma forma, mas o Yahoo! Meme superou as minhas expectativas, trabalhando muito bem três aspectos desse tipo de site: o encaminhamento de posts alheios (o “retweet” ou RT do Twitter); a multimídia (turbinada por uma interface que facilita o compartilhamento de fotos, vídeos e músicas sem as ginásticas que o passarinho exige) e a extensibilidade, que permite que terceiros conectem seus sites e aplicativos na plataforma.

A idéia é ótima (ainda mais como alternativa ao famigerado email com PowerPoint anexado e copiado para meio mundo), mas eu e a Bani nos incomodávamos com um lance: a burocracia. Você tinha que copiar o endereço do conteúdo, abrir o Meme, se autenticar, selecionar a mídia, colar o conteúdo e escrever algo sobre ele (do zero). Na nossa cabeça, a coisa só ia rolar se tivesse um botão no navegador que “olhasse” para o conteúdo e cuidasse desse processo todo.

Esse incômodo se juntou com a coceira de brincar com o ecossistema de tecnologias de compartilhamento de dados que o Yahoo! disponbiliza (tais como YQL e oAuth) e fez a gente criar o MemeThis: um site que em poucos segundos gera o tão sonhado botão (bookmarklet, tecnicamente falando) personalizado para a sua conta no Meme.

O código-fonte é escrito em Java, e é livre. A parte dos bastidores (que faz toda a mágica acontecer) roda no Google App Engine – como bem observou um amigo nosso, usamos uma linguagem da Sun para ampliar um serviço do Yahoo! usando um outro serviço do Google. Web 2.0 é isso! :-P

Apesar de ainda ser uma versão beta, já tem bastante gente usando. E agora não é preciso mais mendigar convites: o Yahoo! Meme está aberto para todos, é só ir !

simpleyql – usando as APIs do Yahoo! em Java

September 26, 2009

O simpleyql é uma biblioteca que facilita bastante o desenvolvimento de aplicações em Java que manipulem dados de usuários do Yahoo! Meme (ou de quaisquer sites do Yahoo! que estejam expostos via YQL e oAuth).

Na teoria, é possível usar uma biblioteca de oAuth pré-existente para isso (o próprio simpleyql se baseia em classes disponíveis no oauth.net), mas quando eu e a Bani começamos o MemeThis (falo dele em outro post) vimos que as particularidades do Y! tornariam o código demasiadamente complexo.

Além disso, essas classes exigem um grau de entendimento de oAuth maior do que o puramente conceitual. E o fato de o Yahoo! disponibilizar bibliotecas para outras linguagens – mas não para Java – foi a gota d’água que motivou a criação da biblioteca.

Com ela, basta uma quantidade mínima de código para iniciar o processo de autorização do usuário – um passo necessário quando ele acessa sua aplicação pela primeira vez. Dali em diante basta manter a chave de acesso atualizada no banco de dados ou equivalente, e você poderá usá-la em uma chamada simples sempre que quiser interagir com o Y! em nome da pessoa.

Parece simples? Ótimo, essa era a idéia: encapsular os detalhes do vai-e-vem de tokens e permitir ao desenvolvedor focar apenas na aplicação. A biblioteca é compatível com o Google App Engine (o MemeThis roda nele), então não tem mais desculpa: se a sua praia é Java, a hora de desenvolver pro Yahoo! Meme é agora.

Tweets And Replies

July 19, 2009

A confusing situation happens on Twitter whenever people you follow talk to people you don’t. Twitter “fixed” it by hiding such conversations from your timeline – but that gives you *less* information when you wanted a bit more.

With that in mind, I created this feed (using the awesome Y! Pipes) that gets all the tweets related to an user (i.e., everything that the user wrote and all the replies he/she got): http://pipes.yahoo.com/chesterbr/tweetsandreplies.

After entering the ID and running the pipe you can easily add the resulting feed it to the Firefox Bookmark (or your RSS reader) and glimpse the Twitter life of anyone you care about, whenever you want.

EDGE Switch

August 8, 2008

O EDGE Switch é um programa que desenvolvi para o iPhone com o objetivo de bloquear/liberar a conexão de dados da operadora (EDGE). Isso é necessário porque o sistema operacional da Apple assume que o seu plano de dados é generoso e usa esta conexão sem perguntar quando não encontra uma rede sem fio.

UPDATE: Este programa foi criado no início dos tempos do iPhone, quando mal existia SDK oficial. Ele não foi testado com o OS 2.x/3.x, e com certeza existem alternativas melhores (como o SBSettings) para fazer isso hoje. Mas o código-fonte permanece online para fins de curiosidade e para ilustrar o mínimo do mínimo que a parte não-visual de uma aplicação iPhone tem que ter.
More…

miniTruco Client-Server API

January 12, 2008

miniTruco is an implementation of the Brazilian Truco card game (also known as Truco Paulista or Truco Mineiro) for Java-enabled cellphones.

One of its features is its multiplayer ability over the Internet. That is done by having a server software that hosts the games, and this server has a (somewhat) well-defined API that allows clients to connect to it.

This post describes how to interact with that server, so people can write their own clients in any platform they wish. Although most Truco players are Portuguese speakers, it was written in English to reach a wider audience (and in light of the recent addition of an English-language option to the J2ME miniTruco).

Both the server and the J2ME client are free (GPL) software, and albeit other clients are not obligated to be published under such a license, they are encouraged to do so.

More…

timefix (ou: Acertando o Horário de Verão em Java II)

February 24, 2007

Ano passado escrevi um texto sobre o problema do Java com o horário de verão, explicando as causas, apontando soluções comuns e sugerindo uma nova – cuja principal vantagem é dispensar alterações no código-fonte da aplicação afetada.

Sua maior desvantagem é que o arquivo com o código de correção tem que ser recompilado a cada mudança de regra do horário de verão (i.e., uma vez por ano, pelo menos) e re-copiado em cada servidor – o que fica complicado quando se cuida de dezenas ou centenas deles.

Em vista disso (e com a ajuda da classe ZoneInfo, de autoria de Stuart D. Gathman), criei o timefix – uma biblioteca que lê automaticamente o arquivo /etc/localtime do servidor, ajusta o timezone default e chama a aplicação final. Desta forma, basta reiniciá-la quando o arquivo for atualizado parq que as novas datas de início e fim do horário de verão entrem em vigor.

More…

Golpe – O Super Trunfo dos Políticos Brasileiros

September 8, 2006

Com uma eleição tão parada como esta (a menos de pérolas como o Super Moura e o Deputado das Raves), só nos restou pegar carona no insanamente bem sacado Super Trunfo de Santos Católicos e lançar o Golpe – um jogo na mesma pegada, só que baseado no caricato panteão dos políticos brasileiros.

O melhor de tudo: é grátis (através da licença Creative Commons). Você baixa o PDF e pode imprimir em casa, mandar na gráfica, enfim, fazer o que bem entender (menos comercializar e reutilizar sem citar a fonte original). Além disso, as mídias, a planilha de dados e o programinha que gera o PDF também estão disponíveis para quem quiser atualizar as cartas ou até criar seu próprio baralho nesse estilo. Divirtam-se.

(Welcome, BoingBoing readers – this site is mostly written in Portuguese, but you can either try the Google translation link above, or ask me anything. Enjoy.)

A Busca de Epaminondas Jr.

June 20, 2006

tela do jogo 'A Busca de Epaminondas Jr.'Este jogo, criado no início dos anos 90, foi uma das primeiras coisas que disponibilizei na web, não sem um certo constrangimento: minha definição de “humor” mudou um pouco ao longo dos últimos quinze anos.

Embora o jogo não use (nem de longe) os recursos dos PCs modernos, os e-mails que recebo mostram que ainda hoje há quem se divirta um pouco com ele. Este fenômeno curioso me levou a falar um pouco mais a respeito – incluindo algumas curiosidades e dicas para ajudar quem ficou travado em algum quebra-cabeças. E, claro, disponibilizar o jogo para download!

More…

miniTruco: Jogo para celulares Java ME grátis e multiplayer (Bluetooth/GPRS/3G).

January 11, 2006

O miniTruco é um jogo de cartas gratuito para telefones celulares e outros dispositivos móveis que suportem Java ME, que pode ser jogado individualmente, ou em grupos de até 4 pessoas (via Bluetooth ou Internet/GPRS).

Não tenho mais trabalhado neste jogo, pois o foco atual é na versão Android, mas ele sempre estará disponível para download, e o código-fonte é livre (GPL v3.0), podendo ser baixado e modificado por quem desejar.

More…

Truco para Windows/Linux

March 7, 2002

Há alguns anos eu comecei a desenvolver um jogo de Truco para Windows. O projeto caminhou bastante, mas nunca tive tempo de acabar.

Como falta pouca coisa, resolvi disponbilizar o código-fonte para que algum programador Delphi ou Kylix que se interesse complete o jogo. Alguém se habilita?