mas vem cá, por que Rails?

19 08 2008

Não sei como é com vocês, mas eu só aprendo alguma coisa de verdade fazendo. E como eu quero muito aprender Rails de verdade, decidi fazer um sistema que eu já tô devendo ao +web faz um tempo. É um gerenciador de eventos, coisa simples. E graças ao estágio do Cefet, apareceram mais dois projetos pra eu fazer até o fim do ano: um sistema interno pra Techvirtual, onde estou estagiando, e alguma contribuição pro Redmine, que eu ainda não sei o que vai ser. Vai ser um fim de ano bem legal. =D

Pretendo falar um pouco desses projetos aqui no blog, registrando aqui minha evolução na plataforma. E a primeira coisa que eu quero explicar é porque eu escolhi Rails.

Bom, a resposta é simples. Primeiro, porque Ruby é a linguagem mais linda que eu conheço (programo em Delphi, entendo de linguagem feia). Python é legal também, mas não tanto. Sério. O tempo que eu ganho com Ruby é impressionante, e eu me divirto muito. Segundo, porque Rails é o framework mais lindo que eu conheço (programo em ASP.Net, entendo de framework feio). O tempo que eu ganho com Rails é impressionante, e eu me divirto muito.

Além do fator ‘me-divertir-enquanto-trabalho’, também escolhi Rails porque me permite criar, dentro das limitações do framework, aplicações complexas em pouquíssimo tempo, e vendo as coisas funcionarem desde o começo. Rails e a comunidade também enfatizam muito a questão da qualidade do código, seja através de DRY, (muitos) testes, ou qualquer outra coisa.

Como se já não fossem motivos suficientes, ainda tem a comunidade ao redor do Rails, muito prestativa e receptiva com os iniciantes. É difícil encontrar caras que se dedicam à comunidade como o Akita, o Carlos Brando e tantos outros, além de iniciativas como o grupo Aprendendo Rails. Nunca me aconteceu de não encontrar algo que eu queria e nem ter alguém pra perguntar.

Resumindo: eu me divirto enquanto trabalho com qualidade fazendo parte de uma comunidade muito bacana. O que mais eu podia querer? ;D





jquery: perfeita, mas nem tanto…

18 04 2008

Comecei a usar JQuery aqui no trampo, e estou me surpreendendo. É tudo tão simples, que dá vontade de fazer tudo na tela ficar piscando e sumindo e aparecendo – mas eu me controlo, só uso onde necessário.

A única raiva que JQuery me deu até agora (além de não ter aparecido pro programador anterior desse projeto) foi ter me deixado meia hora tentando descobrir porque aquele $(“#id”) tão inocente não funcionava.

Era o acento. O seletor JQuery não aceita caracteres acentuados.
Fica a dica: acento com seletor JQuery não rola.





repita comigo: um prepared statement por conexão

15 04 2008

Trabalhando com php+mysqli, perdi um tempão procurando saber porque a minha prepared statement não funcionava.

Coisinha besta: um prepared statement está ligado a uma conexão. Se você fecha a conexão, mata ele. Também tive problemas tentando usar dois statements numa só conexão.

Portanto, fica a dica: um prepared statement pra cada conexão.

Hope that helps! ;D





dica rápida: web service pra consulta de endereço

20 02 2008

Algo que eu procuro sempre aqui no trabalho é facilitar a vida do usuário. Coisinhas pequenas, como completar o endereço a partir do cep, podem poupar um bom tempo de quem faz isso dezenas de vezes no dia.

Ao código:

Achei um monte de webservices oferecendo esse serviço. Escolhi esse, em php: web service consulta de endereço. Se você nunca usou webservice no visual studio, leia esse artigo antes de continuar.

Adicione a referência ao wsdl no seu projeto, e a cláusula using na sua unit.

Código simples que recupera os dados:

CEPService _servico = new CEPService();string[] resultado = _servico.obterLogradouro(cep).Split(',');//Quando o cep não é encontrado, a resposta do servidor vem no formato

// "CEP cep NAO ENCONTRADO" ou "Cep cep não encontrado"

if (resultado[0].StartsWith("cep", StringComparison.OrdinalIgnoreCase)   throw new CepNotFoundException("Cep não foi encontrado!");

//Quando o cep é encontrado, a resposta vem no formato

// "LOGRADOURO, BAIRRO, CIDADE, ESTADO"

Console.WriteLine("Logradouro: " + resultado[0].Trim());

Console.WriteLine("Bairro: " + resultado[1].Trim());

Console.WriteLine("Cidade: " + resultado[2].Trim());

Console.WriteLine("Estado: " + resultado[3].Trim());

Código modificado pra retornar um objeto endereço e fazer um cache bem básico:
(O construtor de Endereco tem a assinatura:
public Endereco(string cep, string logradouro, string numresidencial, string bairro, string cidade, string estado))

public class EnderecoHelper {private static CEPService _servico = new CEPService();

//Armazena os endereços de cep que não foram encontrados no banco,//pra não pesquisar duas vezes

private static IList _invalidos = new List();//Número máximo de ceps inválidos que vai ser guardada

private const int MAXINVALIDOS = 15;//Último cep pesquisado. Útil caso o mesmo cep seja

//pesquisado várias vezes seguidasprivate static Endereco _ultimoEndereco = new Endereco;

private static string _cep;
public static Endereco getEndereco(string cep) {

if (cep.Equals(_ultimoEndereco.cep)){

return _ultimoEndereco;}

if (_invalidos.Contains(cep))

{

return null;}

string[] resultado = _servico.obterLogradouro(cep).Split(',');

if (!resultado[0].StartsWith("cep", StringComparison.OrdinalIgnoreCase)) {

_ultimoEndereco = new Endereco(cep, resultado[0].Trim(), "", resultado[1].Trim(), resultado[2].Trim(), resultado[3].Trim());return _ultimoEndereco;

}else

{_invalidos.Add(cep);

if (_invalidos.Count > MAXCOUNT){

_invalidos.Clear();}

return null;}

}}

Ainda tem um monte de coisas que eu quero fazer pra melhorar isso aí. Alguns itens: Aumentar o tamanho do cache de resultados pesquisados (substituir o _ultimoEndereco por uma lista), implementar a lista de ceps inválidos como uma queue, chamar o webservie assíncronamente.
Assim que eu tiver mais tempo livre aqui no trampo eu faço isso, já que não é tão prioritária.

Espero ter ajudado alguém!





dica rápida: problema com proxy no nhibernate

13 02 2008

Tive um problema com o NHibernate e suas classes proxy que me levou um bom pedaço da tarde.

Ocorre que eu tenho uma classe “Pessoa” e suas filhas “Fisica” e Juridica”. O que eu queria era listar todas as pessoas, e quando uma fosse escolhida eu tinha que fazer uma ação baseada no seu tipo. Normal.

O problema é que minha consulta retornava objetos “CProxyTypePessoa_NHibernate_ProxyINHibernateProxy_System_Runtime_SerializationISerializable2.

Essa classe herda de “Pessoa”, mas se eu tento fazer o cast pra “Fisica” ou “Juridica” – ban! Exceção.

Depois de fuçar um bucado, achei a solução pra Java:


if (obj instanceof HibernateProxy) {
obj = ((HibernateProxy)obj).getHibernateLazyInitializer().getImplementation();
}

Em .net, ficou quase igual:

if (obj is INHibernateProxy)
{
obj = (Pessoa)NHibernateProxyHelper.GetLazyInitializer(obj as INHibernateProxy).GetImplementation();
}

Bem trivial, mas eu perdi um bom tempo pra achar isso.

ps. Usei a extensão Reflector, pro Visual Studio. Um class browser bem bacana.