Os que me conhecem, sabem que eu adoro jogar. Aliás, gosto tanto de jogar que quando era pequeno, juntei dinheiro durante uns meses para poder comprar um game boy. E, desde então, não há uma consola que tenha sido vendida em Portugal que eu não tenha comprado*.

Desde que comprei a xbox que não tenho querido outra coisa. Entre a original e a 360, já não sei as horas que perdi à volta disto… Ultimamente, como ando a trabalhar em Inglaterra, até tenho uma aqui em Londres e outra em Lisboa. Ou melhor, tinha.. é que, no sábado passado, vindo de uma churrascada em cascais, vejo que a 360 portuguesa estava assim:

rrod

Yep, o ‘Red Ring of Death’. A minha linda xbox foi-se… e, para piorar, não sei onde estão os recibos para poder pedir a garantia! “Bem, menos mal” pensei eu, ainda tenho uma.. Ou melhor, tinha! Há 30 min, ao tentar ligar a xbox para jogar FIFA contra o Stefan, vejo isto:

rrod

Yep! Numa semana as minhas 2 xbox’s ficam f****as!!! Bah!!!

Este fim de semana vou andar a procurar os recibos… e depois é mais uma batalha que, só quem já ligou para o suporte da xbox em Portugal, sabe o que é.

Bem, em último caso sempre tenho outra possibilidade:D

*Claro, sem ser a PS3. Essa ainda não… :D

Isto é incrível! O Mathieu Henri colocou online um jogo cuja acção se passa na totalidade no favicon do site!

dof

Testem o jogo aqui e depois de estarem maravilhados com a técnica, vejam no site dele detalhes técnicos sobre este e outros projectos igualmente geniais.

Apache:

SysCallApachesmall

IIS:

SysCallIISsmall

Tirado daqui.

Estava a ler um pouco sobre a história do HTTP, com o mosaic etc e deparei-me com o seguinte email:

I’d like to propose a new, optional HTML tag:

IMG

Required argument is SRC=”url”.

This names a bitmap or pixmap file for the browser to attempt to pull over the network and interpret as an image, to be embedded in the text at the point of the tag’s occurrence.

Todos sabemos como é que esta história acabou… hoje em dia, um site sem a tag de imagens seria… texto! É que, e estou convencido disto, se as pessoas não tivessem as imagens, a necessidade de adicionar outros objectos (como flash) provavelmente não tinha aparecido. E a internet não seria o que é…

E tu, que email’s mandaste hoje?

Desde que descobri a mini-câmera que o gmail tem que sempre que vou ver o meu mail que me sinto observado…

image

Estão a ver ali? No canto superior esquerdo da página? Nem usando o firebug consigo ver o que aquilo é…

Mas sinto-me observado.

Hoje de manha recebi o seguinte email:

De acordo com a legislação internacional que regulamenta o correio electrónico, secção 301, parágrafo (a)(2)(c) decreto S 1618, título terceiro aprovado pelo 105 Congresso Base das Normativas Internacionais sobre Spam diz o seguinte:
O e-mail não poderá ser considerado SPAM quando incluir uma forma do receptor ser removido da lista. Ao abrigo do Decreto-Lei 67/98 de 26 de Outubro, de regulação do tratamento automatizado de dados de carácter pessoal, o utilizador poderá cancelar os mesmos, conforme disposto nos artigos 10º e 11º.
Se pretender remover pessoalmente o seu e-mail da nossa base de dados, basta ir ao nosso site em http://www.pubdirecto.com/remover.aspx colocar o e-mail que pretende remover e seleccionar a opção “Anular Subscrição”.

Incrível..! Um email só com um aviso a dizer “Olá, só para o avisar que em breve vamos começar a encher a sua caixa de lixo. Obrigado.”

Incrível! Claro, a primeira coisa que fiz foi ir ao site e retirar o meu email da tal lista. Mas depois pensei melhor e, vendo o site com o seu aspecto tão profissional:

spam 

Decidi tentar tirar o email de toda a gente de uma só vez:

ex_spam

E parece que funcionou!

No final, gostava de lhes ligar e perguntar como é que eles conseguiram o meu email. Bem, não se pode ter tudo!

Hoje a ler a revista MSDN online reparei num artigo que fala sobre implementar I/O assíncrono usando delegados para os callbacks. Imediatamente lembrei-me do projecto que fiz na Inosat, em que para conseguir rede, GPS ou GRPS no dispositivo móvel, usei um sistema parecido com este.

A maior diferença é que, em vez de declarar dois métodos para callback - um em caso de sucesso e outro em caso de falha - usei apenas um, retornando sempre um valor do tipo Result<T>. Por exemplo, se virem no artigo, o autor para o método:

   1: public static string ReadAllText(string path);

define a seguinte assinatura:

   1: public static void ReadAllTextAsync(string path, Action<string> success, Action<Exception> failure);

em que o primeiro método é chamado se o método correr como esperado, o segundo é invocado se houver algum problema pelo caminho. No meu caso, a definição seria algo como:

   1: public static void ReadAllTextAsync(string path, Result<string> success);

em que a classe Result é:

   1: public class Result<T>
   2: {
   3:     private readonly T _value;
   4:     private readonly bool _valid;
   5:     private readonly string _error;
   6:  
   7:     private Result(T value)
   8:     {
   9:         _value = value;
  10:         _valid = true;
  11:     }
  12:  
  13:     private Result(string error) : this()
  14:     {
  15:         _error = error;
  16:     }
  17:  
  18:     private Result()
  19:     {
  20:         _valid = false;
  21:     }
  22:  
  23:     public static Result<T> Failed()
  24:     {
  25:         return new Result<T>();
  26:     }
  27:  
  28:     public static Result<T> Failed(string error)
  29:     {
  30:         return new Result<T>(error);
  31:     }
  32:  
  33:     public static Result<T> Success(T value)
  34:     {
  35:         return new Result<T>(value);
  36:     }
  37:  
  38:     public T Value
  39:     {
  40:         get { return _value; }
  41:     }
  42:  
  43:     public bool Valid
  44:     {
  45:         get { return _valid; }
  46:     }
  47:  
  48:     public string Error
  49:     {
  50:         get { return _error; }
  51:     }
  52: }

Isto permite que o Result seja usado para notificar se o método teve sucesso ou não e, caso não tenha, que se possa passar o erro que se encontrou.

A diferença que encontro nas duas abordagens é que, no meu caso, quem trata do resultado tem de verificar se a operação teve sucesso chamando o result.Valid. No caso da implementação que está na revista, cada método sabe se o resultado teve sucesso ou não. Para os puristas que defendem a abolição do uso de If’s (já trabalhei com alguns ;)), isto é puro ouro!

Quando me decidi a preparar um ‘build server’ para ter integração contínua no projecto, comecei a procurar na wikipedia pelos possíveis build servers existentes. Apesar de já ter trabalhado com o ‘Cruise Control’ na medialog, dado o pouco tempo (horas!) que tinha para preparar tudo, decidi-me pelo TeamCity da genial empresa JetBrains, também responsáveis pelo resharper.

buildserver

No final, se tivesse de configurar os scripts nAnt para ter o servidor a compilar, testar e criar as releases dos vários componentes, teria perdido uns bons dias. Com o TeamCity, e inicialmente usando os ficheiros .sol do Visual Studio para criar os builds, foi tudo feito numa tarde*…

Altamente recomendado.

*Claro que assim que quis adicionar umas funcionalidades ‘especiais de corrida’, tive de fazer um build script de raiz. Mas mesmo assim…

O primeiro problema que tenho de enfrentar para conseguir usar um sistema de plugins é conseguir identificar os plugins que temos disponíveis e os inicializar. Para isso vou criar o PluginManager.

De alguma forma tenho de definir como é que os plugins serão descobertos pela aplicação: Lidos automaticamente de uma directoria pré-definida, previamente registados usando uma UI na aplicação, ficheiros de configuração, etc. Como não quero ter de decidir isso para já, vou implementar a forma mais fácil que me consiga lembrar e, tendo o cuidado de não ter o uso desta implementação especifica ‘hard-coded’ em lugar algum, vou permitir que mais tarde se possa mudar o plugin manager (quem sabe usando.. um plugin!)

Read the rest of this entry »

Para o projecto em que estou envolvido desde Janeiro, desde cedo fiz questão que fossem usados muitos processos relacionados com o desenvolvimento para, no final, facilitar o processo de manutenção.

No top 3 destes processos estão, sem qualquer sombra de dúvida:

  • Uso de source control (SVN)
  • Integração contínua
  • Log4net

Desde que usei o log4net na Inosat que acho que é uma ferramenta indispensável para a grande maioria* dos programadores. Desde que a aplicação foi instalada nos servidores que, invariavelmente, todos os problemas podem ser identificados usando os logs para verificar o que se passou.

Read the rest of this entry »