Bookmark and Share

quarta-feira, 24 de junho de 2009

Criando um Singleton em Flex

Sei que a dica é singela, mas criar um Singleton no Flex não é tão simples assim.

Para os marinheiros de primeira viagem, Singleton é um padrão de projeto que permite criar classes que dêem origem a apenas um objeto. Isso é bastante útil para definir classes de controle, ou classes que conterão dados que serão compartilhados por toda a aplicação.

O princípio básico de criação do Singleton é não permitir que o usuário da classe instancie a classe diretamente. Desta forma, o usuário terá que chamar algum método que retorne a instância dessa class. A maneira mais comum de fazer isso é definir o construtor da classe como privado e criar um método estático que retorne a única instância da classe. O problema é que em Action Script não é possível criar construtores privados. O que fazer?

Existe uma outra maneira de inviabilizar a instaciação de uma classe: Basta que utilizemos um parâmetro no construtor, de um tipo inacessível por qualquer outra classe, que não a própria. Hein? Pois é, vamos criar um parâmetro de um tipo, por exemplo, SingletonEnforcer. Esse tipo é uma classe definida sem pacote e sem visibilidade. Isso significa que somente a classe que estamos criando será capaz de criar um objeto do tipo SingletonEnforcer. Pronto. Já temos nosso artifício que impede que um usuário instancie a classe diretamente. Vejam o código e percebam a definição da classe SingletonEnforcer no final do arquivo:

package org.example
{
 public class MeuSingleton
 {
  
  private static var _instance:MeuSingleton;
  
  public var dados:Object;
  
  public function MeuSingleton(enforcer:SingletonEnforcer) {
   if (enforcer==null){
    throw new Error("Não é possível instanciar a classe MeuSingleton diretamente");
   }
  }
  
  public function get instance():MeuSingleton{
   if (_instance == null){
    _instance = new MeuSingleton(new SingletonEnforcer);
   }
   return _instance;
  }

 }
}

class SingletonEnforcer{ }
Para acessar a instância do objeto, faça:
   import org.example.MeuSingleton;
   MeuSingleton.instance.dados = "Olá pessoal!";

Atenção:Use o padrão Singleton com parsimônia. O uso indiscriminado de Singletons torna o código altamente acoplado e é considerado uma prática ruim de programação. O Singleton deve ser usado com cautela. Eu atualmente prefiro usar um container IoC que me permite fazer Injeção de Dependências. É o caso do Swiz, mas isso eu deixo para um outro post.

Sincronização dos Contatos do Celular com o Google Contacts

Há muito tempo sincronizo minha agenda do celular com o Google Calendar. Inicialmente usava uma ferramenta chamada Goosync. Essa ferramenta é ótima e funciona em vários modelos de celular. O problema dela é que as features mais legais são pagas. Não que não valha, mas já pagamos por tanta coisa, que não acho que isso mereça meus dolares. :) Bem, um dos recursos que o Goosync não tinha na versão gratuita era a sincronização de contatos.

Em fevereiro deste ano o Google liberou um serviço que permite sincronizar toda a sua agenda com o Google Calendar, acessando direto os servidores do Google. Eu possuo um HTC com Windows Mobile, portanto, pude usar direto o ActiveSync, ferramenta que já vem com o Windows Mobile. Funcionou que foi uma beleza. Desde então tenho sincronizado meus compromissos de forma bastante eficiente. Posso adicionar um compromisso no celular ou na aplicação web que dali há alguns minutos está tudo sincronizado (tudo configurável).

Eu demorei um pouco, mas esta semana tomei coragem e resolvi sincronizar os meus contatos também. Fiz backup e fui na fé. Voilá! Tudo sincronizado. Se crio um contato no Celular, consigo acessá-lo no gmail. Se crio um contato no Gmail, ele está disponível no celular. Opa! Atenção! É aí que mora o perigo. O Google Contacts permite organizar os contatos por grupo, mas apesar disso, ele coloca todo mundo que foi adicionado "oficialmente" à sua agenda, no grupo "My Contacts". Isso torna a sua agenda monstruosa. Antes de sincronizar, portanto, eu organizei os contatos do Gmail tirando do "My Contacts" todos os contatos que eu não uso no meu dia-a-dia. Para deixar a coisa organizada, criei outros grupos.

O Google liberou recentemente uma aplicação que gerencia os contatos de forma independente do Gmail. É o Google Contacts. Não sei porquê, mas achei melhor usar essa ferramenta.

Se você quer aprender a como configurar seu celular para sincronizar com o google calendar ou contacts, visite o site m.google.com, selecione o tipo do seu celular e, em seguida, clique em Sync. Boa sorte!

Code Higlighter

Outro dia fiquei pensando o que estão usando para fazer highlight de código em blogs. Achei um muito legal http://alexgorbatchev.com. Basta você importar os arquivos javascript fornecidos no site do projeto e adicionar alguns parâmetros ao atributo class de uma tag <pre>
<pre class="brush: php;">
Vejam um exemplo:
<?php
$e2 = new Employee();
$e2->setName('Ricardo');
$e2->setEmail('ricardo@example.org');
$e2->setDeptNo(10);
try {
   $pm->beginTransaction();
   $pm->persist($e2);             
   $pm->commit();
} catch (Mosquito_Exception_Base $e) {
   $pm->rollback();
   echo $e->__toString();
}
?>
Uma dica: como uso Blogger tive que desabilitar a conversão de quebra de linhas para <br/> (settings > formatting > Convert line breaks > no)

sábado, 23 de maio de 2009

Hospedagem ilimitada por U$ 9.95 por ano

Acabei de criar uma conta no Dreamhost por U$ 9.95 referente a 1 ano de hospedagem com tudo ilimitado: espaço ilimitado, trafego ilimitado, número de domínios ilimitados etc. E ainda registrei o domínio www.werneckpaiva.com sem pagar mais nenhum tostão.

O custo normal da hospedagem é de U$ 99 por ano. Esta redução de 92% no valor, trata-se de uma promoção referente ao feriado do Memorial Day (25/05). Se você perdeu a promoção, fique atento, porque se fizeram essa, certamente farão outras.

O outro serviço de hospedagem que eu já usava é o Bluehost. Eu gosto bastante do Bluehost, mas agora vou avaliar o Dreamhost. Assim que tiver uma palavra final, publico aqui o comparativo. De cara já posso dizer que o Dreamhost tem 1 ponto a favor, porque tem suporte a svn e o Bluehost não tem.

Estou procurando agora um servidor onde eu possa hospedar aplicações Java. Um servidor rodando Tomcat já me resolve. O preço será o fator decisivo na escolha. :) Quem tiver alguma sugestão, por favor, me comunique.

sexta-feira, 8 de maio de 2009

Me sentindo o Magaiver

Hoje tive que revelar uma foto para o dia das mães. Era essa imagem aí de cima, que foi feita pelo Gabriel, meu filho de 3 anos, no Photoshop. Não é sacanagem, eu ensinei ele a usar os recursos básicos do Photoshop e ele descobriu um pincel muito maneiro que dá um efeito super colorido à imagem. Pois bem, quando cheguei na loja, percebi que tinha esquecido de copiar o arquivo para um pendrive. Começa a minha saga:
  1. Peguei meu celular e, usando 3G, conectei no meu servidor linux doméstico, via SSH;
  2. O arquivo estava na máquina da minha esposa, então, montei um compartilhamento do windows usando cifs e copei o arquivo para um diretório local ao servidor; Esse diretório é público por meio de um site que mantenho na minha casa (www.katiaericardo.com.br);
  3. Depois de publicado, abri o site usando o Opera e baixei o arquivo para o cartão de memória do meu celular.
  4. Mais um problema: o cartão é microSD e a loja de revelação não tinha um adaptador. Enviei um email para a loja com a foto anexada. Tudo do celular.
Pronto, consegui revelar a foto. :) Complicações e facilidades da vida moderna.

domingo, 3 de maio de 2009

Playing for change

Playing For Change | Song Around The World "Stand By Me" from Concord Music Group on Vimeo.

"Cada vez mais, acredito que a arte seja, talvez, a única forma de unir os homens, integrar pessoas e minimizar barreiras de culturas e crenças." (Katia Werneck - minha esposa)

sábado, 2 de maio de 2009

Minha biblioteca na PUC

Fui estudar para a prova de segunda de Probabilidade. Resolvi ir na puc, porque sabia que aqui teria uma biblioteca. Cheguei aqui e dei de cara na porta. A Biblioteca está fechada porque resolveram emendar o feriado do dia do trabalho, que foi ontem.

Uploaded by www.cellspin.net

quinta-feira, 23 de abril de 2009

Fazendo upload em lote para o Flickr (flickr batch upload)

Passei a semana inteira vivenciando a expectativa de subir todas as minhas fotos para o flickr. Ao todo são mais de 43 mil fotos organizadas em pastas em meu servidor e replicadas em 2 backups, um em um desktop aqui em casa e outro na Internet.

Bem, há cerca de 5 anos criei uma aplicação web em PHP para publicar essas fotos. Essa aplicação funcionou muito bem durante todo esse tempo, mas estou sem tempo para criar novas features e, portanto, achei que o flickr poderia ser uma boa alternativa agora. Contratei o serviço por U$ 25 e dei início aos trabalhos.

De cara, não achei nenhuma ferramenta que pudesse subir todas as fotos em lote e de forma organizada. Por organizada entende-se: criando albuns (sets) de acordo com as pastas e adicionando tags para cada foto. Resolvi, então, criar meu próprio script.

Pensei primeiro em usar um shell script com curl. Aí achei que poderia dar trabalho capturar as respostas, então resolvi criar um script que pudesse rodar na console do Linux, mas com PHP. Dito e feito. Procurei alguma API já pronta para PHP, mas não achei nenhuma boa e enxuta o bastante para usar, então resolvi fazer o acesso REST direto usando curl, para o upload, e uma requisição remota simples para o acesso via GET. Deu certo. Comecei subindo um diretório, depois implementei uma recursão para adicionar uma árvore inteira de diretórios.

Cinco dias depois, cá estou com 43 mil fotos publicadas no flickr. Tudo funcionou tão bem assim? Quase tudo. O flickr não possui nenhuma API para manipulação das collections. Uma collection permite ter subcollections ou sets. Assim, dá para organizar os albuns como se fossem pastas. Infelizmente a organização em collections tem que ser feita "manualmente" utilizando-se a ferramenta de organização do flickr.

O divertido do processo de upload é que que não usei nada da minha banda para subir 60GB de fotos. Como mantenho uma cópia das fotos em um servidor web, rodei o script de lá mesmo, e fiquei monitorando para ver o que dava. Tirando algumas poucas falhas, tudo funcionou às mil maravilhas. A banda deles é muito melhor que a minha, então o processo foi muito mais rápido.

Compartilho com vocês o script que criei. Leiam o arquivo de configuração que tem uma breve descrição dos passos para permitir que o script acesse suas fotos no flickr. Se tiverem dúvidas, comentem esse post que eu esclareço.

Estou rodando o script usando Linux, mas nada impede de usar windows, caso você tenha o PHP instalado.

Contribuições são bem vindas.
Download