Este blog esta em reforma no momento.

Projetando a instalação Windows

Eu estava estou acompanhando alguns artigos no Ubuntu Games sobre criação de pacotes .deb para instalação e acabei me inspirando/animando para essa etapa.

Para Windows existe uma outra filosofia já difundida, eu deveria estar pensando em Win8 e um modelo de instalação tipo Android e Linux mas com certeza o modelo de instalador clássico deve se manter por mais alguns anos.

E como parte do objetivo é brincar de grande Softare House resolvi seguir as leis de Esparta e desenhar meu próprio instalador que ficou com 146 KB !

Idealizando um usuário final, o instalador devera ser um software simples que baixe os arquivos principais da Internet e ponha eles para rodar.
Obviamente não conto com a credibilidade de uma Blizzard ou DC que podem gerar um instalador de 10MB tranqüilos, assim resolvi criar o aplicativo com o menor tamanho possível.

Para tentar resolver isso comecei pela questão das imagens e procurei uma biblioteca de tamanho reduzido. E encontrei a NanoJpeg um único arquivo adicional com 690 linhas!
Claro que no entanto ela perde um pouco de flexibilidade, por exemplo ela tem dificuldade de carregar imagens tipo "progressiva", a imagem tem que estar obrigatoriamente em 72dpi, ao preparar as imagens tenho q tomar o cuidado de "achatar a imagem" quando trabalho com as mascaras em "Tom de Cinza" e ela falha em alguns formatos por exemplo as barras tem 6 pixels de altura porque com 4 dava algum erro e até o botão de lançar teve que ser feito em 66x64 pixels porque com 64x64 não estava abrindo! Resolvendo esses pepinos por tentativa e erro foi o menor dos empecilhos.

Descartei o Visual Studio Express pois apenas em lembrar que precisava baixar as VC Runtime no cliente já saia do orçamento (mas não tentei compilar nele com o código finalizado ainda).
A saída foi o MinGW sem incorporar  as bibliotecas iostream (450KB só pra dar um #include <iostream>).
O chato é que estou muito acostumado a usar cout pra debugar e agora tinha que usar printf.

Após isso o passo seguinte foi procurar uma biblioteca para baixar o arquivo. A CURL naturalmente gerou um executável obsceno, afinal ela dá suporte a tudo que é protocolo usado na Internet desde HTTP até SSH! Tem como compilar ela usando o mínimo de dependências mas começou a dar muita do de cabeça, principalmente no rwindows.

Após uma Googlada mais nervosa achei uma solução dentro do próprio Windows o WinHTTP, uma DLL inclusa no sistema com configurações mínimas mas que "dava pro gasto".

No entanto a biblioteca da MinGW não tinha um winhttp.h nos includes.

A primeira "cagada" foi pensar em montar uma LIB no Visual Studio que pudesse ser incluída no CodeBlocks apenas com as chamadas de função básicas.
Dores de cabeça depois até eu ver que em muitos casos os conflitos em se fazer isso eram enormes.
A segunda "cagada" foi montar uma DLL e chamar ela pelo CodeBlocks...

Fiz as duas até me tocar que uma alternativa secreta que consistia em copiar os cabeçalhos das funções em forma de ponteiros. E usar uma chamada básica da WinAPI para carregar a WinHTTP.DLL e apontar aquelas funções XP
Passado a raiva por não ter pensado nisso procurei as referências e copiei as chamadas.

No final acrescentei 1,5KB ao executável final!!!

Até aqui o código C (mesmo estando num CPP a coisa é baixaria pura) estava bem zoneado (não que eu esperasse menos desse tipo de projeto) tinha tanta função que a leitura estava pior doque a leitura desse parágrafo.
Ai eu acrescentei funções para "blending de imagem" ("mesclagem" pros phtotoshopescos e GIMPescos) ai fudeu tudo.

Desenhar o texto informativo foi uma descoberta sinistra, o sistema tem uma "viadagem" para trabalhar com Fontes que me surpreendeu pois estou acostumado a usar bibliotecas como GTK, Swing e WxWidgets para isso.

O Design
Por botão no negócio também foi meio complicado, afinal fazer uma interface customizada e usar um botão padrão seria bem feio, criei uma estrutura com os dados do retângulo e faço o calculo manualmente para ver se o mouse esta em cima dele ou não durante o "over" e o "click".

Também optei por uma alternativa pouco acadêmica: usar UM BOTÃO na interface. No lugar onde você geralmente fecha a janela ele chama um menu com o primeiro item "Fechar" como as pessoas estão acostumadas e os itens adicionais de controle.

Alguns detalhes mais divertidos estão por conta das saídas para manter o aplicativo em um único arquivo. No caso da Ajuda que é um arquivo HTML, resolvi usar a opção de incluir o arquivo .html direto no arquivo de resource, assim ele vai embutido no .exe. Na hora de exibir basta ler o resource, salvar em disco e chamar o navegador. Considerando que o usuário pode estar usando o Micro$oft Interner Explorer achei melhor não incluir imagens no documento (o IE não suporta base64 na HTML).

Download
Você pode escolher uma alternativa abaixo:
baixador.exe (147KB)
baixarod.zip (110KB) - melhor contra firewall
nota: removi os downloads temporariamente, breve disponibilizarei novos ^_~
Ao executar ele carrega um arquivo no meu DropBox chamado "simplelist" que indica dois arquivos de teste a serem baixados. Um deles é a primeira versão Wild Witch ainda com técnologia arcaica e experimental de 2003!

Dê sua opinião / FeedBack
Deixei este formulário no Google Docs para que quem teste possa reportar problemas e idéias de melhoria.
Acesse o este link ou use o frame abaixo. Tnks



Capas
Imagens rascunho utilizadas nos slides/banners (feitos todos "nas coxa" sem pensar muito)

Comentários