Arquivo

Arquivo de outubro, 2009

[Tradução] Qual é a diferença entre os operadores “as” e “cast”?

29 de outubro de 2009

Muitas pessoas lhe dirão que a diferença entre “(Alpha) bravo” e “bravo as Alpha” é que o primeiro lança uma exceção se a conversão falhar, enquanto que o segundo retorna null. De qualquer forma isso é correto, e isso é a diferença mais óbvia, mas não é a única diferença. Há armadilhas para se tomar cuidado aqui.

Primeiro, desde que o resultado do operador “as” pode ser null, o tipo do resultado precisa ser um dos que aceitam um valor nulo: um tipo referência ou tipo valor nullable. Você não pode fazer “as int”, isso não faz sentido. Se o argumento não é um int, então qual valor de retorno deveria ser? O tipo da expressão “as” é sempre um tipo nomeado, então ele precisa ser um tipo que pode receber null.

Segundo, o operador cast, como eu discuti antes, é uma besta estranha. Ele significa duas coisas contraditórias: “verifique para ver se o objeto realmente é desse tipo, lance uma exceção se não for” e “esse objeto não é do tipo informado; encontre um valor equivalente que pertença ao tipo informado”. O segundo significado do operador cast não é compartilhado pelo operador “as”. Se você diz

short s = (short)123;
int? i = s as int?;

então você está sem sorte. O operador “as” não fará conversões “representação-substituição” de short para int nullable como o operador cast faria. Similarmente, se você tem uma classe Alpha e uma outra classe não relacionada Bravo, com uma conversão de Bravo para Alpha, então “(Alpha) bravo” será convertido, mas “bravo as Alpha” não. O operador “as” apenas considera conversões de referência, boxing e unboxing.

E finalmente, é claro que o uso dos dois operadores são superficialmente similares, mas semanticamente completamente diferentes. O cast comunica para o leitor “Eu estou certo que esta conversão é legal e eu concordo em receber uma exceção se eu estiver errado”. O operador “as” comunica “Eu não sei se esta conversão é legal ou não; nós vamos tentar e ver o que acontece”.

Esse texto é uma tradução do post original que Eric Lippert, engenheiro de software da Microsoft, publicou no seu blog Fabulous Adventures In Coding. A versão original você pode ler aqui.

Observação: Essa é minha primeira experiência em tradução de artigos técnicos. Seu comentário expressando sua opinião a respeito é muito bem vinda.

.NET , , , , , ,

6ª Corrida Shopping Aricanduva - 9 km

29 de outubro de 2009

No domingo de 25 de outubro de 2009 corri os 9 km da 6ª Corrida Shopping Aricanduva.

A corrida foi disputada na avenida Aricanduva, com trechos nas vias internas do shopping, em um percurso praticamente plano.

Tempo total: 00:43:56

Tempo médio por km: 04:52

Tempo em cada km:

  1. 04:34
  2. 04:45
  3. 04:44
  4. 04:54
  5. 04:58
  6. 04:49
  7. 04:59
  8. 05:28
  9. 04:43

Foto de WebRun

Foto de WebRun

Esportes , , , ,

Serialização de objetos em JSON com .NET

23 de outubro de 2009

Serializar e deserializar instâncias de objetos no formato JSON com .NET acaba sendo muito simples.

Esse é o Jason, não JSON.

Vamos utilizar como exemplo a classe abaixo:

public class SomeFakeClass
{
    public int ID { get; set; }

    public string Text { get; set; }

    public decimal Value { get; set; }
}

E criamos uma instância dela:

SomeFakeClass fake = new SomeFakeClass
{
    ID = 123,
    Text = "I am a sample text.",
    Value = 150.85M
};

Então queremos serializar a variável fake em JSON para obter o seguinte resultado:
{"ID":123,"Text":"I am a sample text.","Value":150.85}

A classe DataContractJsonSerializer torna essa tarefa muito fácil. Basta escrever os dados serializados para um Stream usando o método WriteObject e depois recuperar uma string a partir desse Stream:

MemoryStream stream = new MemoryStream();

DataContractJsonSerializer serializer;
serializer = new DataContractJsonSerializer(typeof(SomeFakeClass));
serializer.WriteObject(stream, fake);

string json = return Encoding.Default.GetString(stream.ToArray());

Para fazer o inverso, transformar dados em JSON para um objeto, usamos o método ReadObject passando o Stream que possui os dados serializados:

string json = "{"ID":123,"Text":"I am a sample text.","Value":150.85}";

MemoryStream stream = new MemoryStream(json);

DataContractJsonSerializer serializer;
serializer = new DataContractJsonSerializer(typeof(SomeFakeClass));

SomeFakeClass fake = (SomeFakeClass)serializer.ReadObject(stream);

Um detalhe importante é que a partir do .NET Framework 3.5 Service Pack 1 não há mais a necessidade de decorar a classe que queremos serializar com os atributos DataContract e DataMember, como o exemplo abaixo:

[DataContract]
public class SomeFakeClass
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Text { get; set; }

    [DataMember]
    public decimal Value { get; set; }
}

Isso somente se faz necessário se quisermos ter uma controle maior do que será serializado, como por exemplo, serializar uma propriedade com um nome diferente. Na classe abaixo, a propriedade Text é configurada para ser serializada com o nome Message:

[DataContract]
public class SomeFakeClass
{
    [DataMember]
    public int ID { get; set; }

    [DataMember(Name = "Message")]
    public string Text { get; set; }

    [DataMember]
    public decimal Value { get; set; }
}

Os dados serializados em JSON podem ser algo como:
{"ID":123,"Message":"I am a sample text.","Value":150.85}

Para usar a classe DataContractJsonSerializer, que está no namespace System.Runtime.Serialization.Json, é necessário adicionar referências para dois assemblies no seu projeto:

  • System.Runtime.Serialization
  • System.ServiceModel.Web

Agora que já sabemos como serializar e deserializar em JSON, podemos criar um utilitário que faz esse trabalho. O exemplo abaixo utiliza Extensions Methods combinados com Generics:

public static class JsonSerializerExtensions
{
    public static string ToJson<T>(this T obj)
    {
        MemoryStream stream;

        using (stream = new MemoryStream())
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            serializer.WriteObject(stream, obj);
        }

        return Encoding.Default.GetString(stream.ToArray());
    }

    public static T FromJson<T>(this string json)
    {
        T obj;

        using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json)))
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            obj = (T)serializer.ReadObject(stream);
        }

        return obj;
    }
}

E um exemplo de sua utilização:

SomeFakeClass fake = new SomeFakeClass
{
    ID = 123,
    Text = "I am a sample text.",
    Value = 150.85M
};

string fakeJson = fake.ToJson();

SomeFakeClass otherFake = fakeJson.FromJson<SomeFakeClass>();

.
O código-fonte desse utilitário você pode baixar aqui.

.NET, Livros , , ,

Corrida Corpore WTC pela Paz - 8 km

20 de outubro de 2009

No domingo de 11 de outubro de 2009 corri os 8 km da Corrida Corpore WTC pela Paz.

A corrida foi disputada inteiramente na Marginal Pinheiros Expressa e foi organizada pela Corpore.

Tempo total: 00:38:25

Tempo médio por km: 04:48

Tempo em cada km:

  1. 04:39
  2. 04:43
  3. 04:49
  4. 04:43
  5. 04:57
  6. 05:04
  7. 04:48
  8. 04:39

Foto de Ativo.com

Foto de Treino Online

Esportes , , , , ,

Rails Summit 2009: o que rolou no segundo dia

18 de outubro de 2009

Quarta, 14 de outubro, aconteceu o segundo e último dia do Rails Summit Latin America 2009, o maior evento das comunidades Ruby e Ruby on Rails da América Latina.

Todos os palestrantes do Rails Summit Latin America 2009 por Daniel Cukier

Vamos às palestras.

Richard Kilmer: MacRuby + HotCocoa

Richard Kilmer mostrou como o MacRuby e o HotCocoa podem simplificar o desenvolvimento para aplicações que rodam no Mac OS X. Ele disse que alguns objetivos da Apple são fazer o Mac OS X a melhor plataforma para desenvolvimento em Ruby e tornar Ruby a principal linguagem de programação para o framework Cocoa.

Ele explicou que com a utilização de RubyCocoa há o processo do Ruby rodando de um lado que conversa com o runtime do Objective-C, sendo assim há dois garbage collectors. Além disso, a sintaxe do RubyCocoa, adaptada do Objective-C é um tanto “odd”, quando se diz respeito a selectors do Objective-C.

Já com MacRuby, a sintaxe usando hashs nos parâmetros dos selectors ficam mais claras. Em geral, a sintaxe fica muito mais simplificada que a sintaxe que Objective-C. O MacRuby unifica o modelo de objetos de Ruby e Objective-C, tudo que é objeto no Ruby é objeto no Objective-C.

Com a versão 0.5 do MacRuby haverá uma nova máquina virtual chamada LLVM (Low Level Virtual Machine), que compila código Objective-C. Todas as características dinâmicas do Ruby iram rodar com melhor performance.

Richard por fim exemplificou como o HotCocoa simplifica o uso de recursos de Objective-C utilizando MacRuby. Foi mostrado um exemplo de código com e sem HotCocoa e a quantidade de código que se reduziu o programa foi incrível. Você consegue criar janelas, botões e outros controles com ele usando poucas linhas de código.

O vídeo da apresentação você pode assistir aqui e os slides da apresentação você pode visualizar aqui.

Carlos Villela: Ruby na ThoughtWorks

Carlos Villela fez sua apresentação baseada no artigo Ruby at ThoughtWorks publicado por Martin Fowler. Ele disse que a ThoughtWorks é pioneira em desenvolvimento ágil e que possui em torno de 42 projetos em Ruby espalhados pelo mundo. Na Inglaterra, a adoção de Ruby demorou um pouco em relação a outros países. A grande maioria dos projetos em Ruby aconteceram nos EUA.

Em uma pesquisa interna, foi perguntado se Ruby foi uma boa escolha? A maioria respondeu que sim e que Ruby era mais produtivo realmente, sendo que 13 dos 42 projetos acharam que a produtividade dobrou. Mas 5 disseram que não foi uma boa escolha, onde 4  dos 5 disseram que havia uma curva de aprendizado que não cabia no projeto.

Quanto a performance nenhum projeto teve problema.

Também foi pergunta na pesquisa se Ruby é difícil de entender? Existe muita coisa nova em relação a outras linguagens comerciais e há, além da curva de aprendizado, a curva de manutenção. Quando mais você usa meta-programação você acha que é óbvio e bom, mas excesso de meta-programação não é um bom sinal.

Ele disse que muitas vezes a plataforma Ruby não é viável por conta do ambiente da empresa, e enfatizou que Ruby não é uma solução para tudo.

No final da palestra ele apresentou algumas dicas:

  • Controllers magros, modelos cheios, mas não ter toda a lógica do sistema, somente o que for lógica de negócio.
  • Testes com ActiveRecord falando com banco de dados de verdade, sem usar stubs.
  • Exposição de SQL no AcitveRecord: muitas vezes é inevitável.
  • Requisições de longa duração: uso de filas quando possível e um módulo separado do Apache que não roda no Rails (gambi?).
  • Controle de Gems: tomar cuidado para uma atualização de gem não quebrar o que está funcionando.
  • Atualizações: pode quebrar seu código, não demore muito para atualizar suas gems.
  • Desenvolvimento no Windows: não rola, rodar em produção é viagem, desenvolver no Windows dá, mas não vale a pena.
  • Não se empolgue tanto com plug-ins: confira se o plug-in tem um mínimo de qualidade, não saia instalando tudo quanto é plug-in no seu projeto, planeje bem isso para não criar um monte de dependências.

O vídeo da apresentação você pode assistir aqui.

Nando Vieira: O que mudou no Ruby 1.9

Nando Vieira por Levy Carneiro

Nando Vieira mostrou as diferenças da nova versão do Ruby e deu dicas para uma futura migração do seu código atual.

Os slides da apresentação você pode visualizar aqui.

Pratik Naik: Lessons Learnt in 2009

Pratik Naik por Levy Carneiro

Eu não assisti a palestra do Pratik Naik. De acordo com Herbert Fischer, problemas como posicionamento de microfone e slides com fontes pequenas atrapalharam um pouco.

De qualquer forma, o vídeo da apresentação você pode assistir aqui.

Marcos Tapajós: CouchDB no Rails

Marcos Tapajós iniciou apresentando alguns recursos e características do CouchDB:

  • Orientado a documentos: no CouchDB um documento nada mais é do que um JSON.
  • Há uma maior flexibilidade, pois não há esquema definido.
  • Se quiser colocar mais um campo, vai lá no JSON e acrescenta, não precisa alterar o banco de dados.
  • A comunicaçào com o banco é feito por REST.
  • Todos os documentos armazenados no banco são versionados. Todas as operações que você faz no banco, é criada uma nova versão.
  • Há um rotina de manutenção para eliminar as versões de documentos anteriores, com um gerenciador de conflitos.
  • É legal você quebrar os documentos de uma forma que você evite a possibilidade de conflitos. Acaba sendo uma sutileza, não porque o documento vai ficar grande.
  • As consultas no CouchDB são feitas através de views, utilizando o conceito de map reduce.
  • É possível fazer replicação bidirecional no CouchDB. Essa replicação fica consistente por conta do versionamento de documentos.
  • A replicação traz uma grande vantagem de você ter uma aplicação offline, que pode ser sincronizada com outra base que funciona como Master. Funciona mais ou menos como no Git, onde você tem um repositório local e vai sincronizando com o repositório remoto.
  • É possível gravar arquivos binários (doc, pdf, jpg, etc) como “attachments”.  Nas consultas você não trafega os anexos, a não ser que você especifique isso quando quiser trazer o arquivo.

Depois ele falou que o casamento entre o CouchDB e o Ruby é muito bom. Você pode pegar o objeto como ele é na sua aplicação e jogar isso dentro do banco de dados. Com isso, elimina o mapeamento objeto-relacional.

APIs CouchDB de Rails que mapeiam como ActiveRecord não são legais. Você tem que quebrar o paradigma de um banco de dados relacional.

Por fim, ele recomendou o utilização da gem CouchRest para interagir com o CouchDB no Rails.

Os slides da apresentação você pode visualizar aqui.

Bruno Miranda e Jeison Seifer: Rails não Escala

Usando o estudo de caso do Cyloop, uma aplicação Rails por baixo do canal de áudio da MSN do Canadá até a Argentina, incluindo MSN Brasil, Bruno Miranda e Jeison Seifer mostraram como ajustar uma arquitetura para escalabilidade com técnicas incluindo filas, engines alternativos de storage, Rails Metal e Web Services.

O vídeo da apresentação você pode assistir aqui.

Vinícius Telles: Do serviço ao produto

Vinicius Telles contou a interessante trajetória de sua carreira. Não vou me alongar aqui, pois você pode (e deve) assistir a palestra inteira. Somente quero frizar algumas frases interessantes que foram ditas:

  • O líder sempre é o culpado, mas quem leva os méritos é a equipe.
  • Saiba escutar e reconheça seu erro.
  • Existe uma diferença entre os EUA e o Brasil: lá fora eles tem uma auto-estima enorme.
  • Se você não fizer algo que não lhe satisfaz, não faça mais isso. Você nunca conseguirá voltar no tempo.
  • Primeira coisa para abrir uma empresa: pense em ter uma reserva. Às vezes a reserva é seu próprio atual emprego.
  • Software tem muito a ver com relacionamentos entre pessoas, no caso seus clientes, do que mais do que tecnologia.
  • Converse com o cliente: pessoalmente ou por telefone. As pessoas não tem confiança que tem alguém do outro lado.
  • Isoladamente o software, a reserva e o relacionamento com o cliente não importa, o que importa é o conjunto que essas coisas geram.
  • Paciência é muito importante para o empreendorismo.
  • A melhor maneira de se destacar nesse mundo é compartilhar suas experiências. Ajudar as pessoas acaba sendo uma iniciativa de marketing.

Arthur Zapparoli: Git - Controle de Versões do Jeito Certo

A palestra do Arthur Zapparoli eu não assisti, mas os slides da apresentação você pode visualizar aqui.

Obie Fernandez: Mastering the Art of Application Development

Para fechar o Rails Summit 2009, Obie Fernandez fez sua apresentação dizendo que desenvolvimento de aplicações é arte. O importante é a prática, em tudo que você faz, para se tornar um mestre.

O desenvolvedor deve, ou deveria passar, por estágios semelhantes ao Shu Ha Ri:

Numa primeira fase, você está em Shu, o “seguir”, você ouve o que o instrutor/professor/sênior está lhe passando a informação e você simplesmente “recebe” e repete o que ele manda. Você ainda não é capaz de discutir ou raciocinar sobre isso agora porque você basicamente não tem conhecimento ou vivência o suficiente pra isso.

Em uma segunda fase você passa pra Ha e começa a experimentar caminhos diferentes, começa finalmente a raciocinar sobre o que está fazendo e fugir um pouco dos caminhos que o mestre ensinou.

Na última fase, o Ri ou transcendência, o estudante vira praticante e busca agora originalidade na prática, ele a aperfeiçoou de uma forma que ela não é mais igual a do seu mestre mas sim a melhor para ele mesmo.

Descrição de Shu Ha Ri retirada do comentário de Maurício Linhares de Aragão Junior no post http://akitaonrails.com/2009/09/26/off-topic-procurar-raciocionar-faz-bem

Obie sugeriu que para se tornar bom em alguma coisa, uma pessoa deve ter 10.000 horas de prática, enfatizando não só as 10.000 horas, mas também a prática correta, do jeito certo.

Ele questionou: Quantas horas você realmente codifica (pratica)? Em que você gasta o seu tempo?

E para finalizar: “Keep practicing for excelence. What you waiting for?”

O vídeo da apresentação você pode assistir aqui.

Eventos, Ruby , , , ,

Rails Summit 2009: o que rolou no primeiro dia

13 de outubro de 2009

Hoje aconteceu o primeiro dia do Rails Summit Latin America 2009, o maior evento das comunidades Ruby e Ruby on Rails da América Latina.

Antes de iniciar a abertura do evento, eu e o Luciano Coelho aproveitamos para jogar algumas partidas de baseball e tênis num dos Wii que estavam disponíveis para a galera jogar. Mas vamos às palestras do dia.

Chad Fowler: Ruby on Rails Insurgency

Na primeira palestra do dia, Chad Fowler mostrou um pouco de como o Rails está alcançando desenvolvedores corporativos e sendo utilizados por empresas startups.

Chad Fowler é autor do livro The Passionate Programmer: Creating a Remarkable Career in Software Development, o qual você pode obter aqui.

O vídeo da apresentação você pode assistir aqui.

Gregg Pollack: Scaling Rails in 60 seconds

Gregg Pollack deu dicas de utilização de plugins do ActiveRecord e Rails, como o Bullet e o Rack-bug, e libraries, como o Mad Mimi, que ajudam a otimizar aplicações Ruby on Rails.

O vídeo da apresentação você pode assistir aqui e uma lista completa dos plugins você tem nesse link.

Carlos Brando: Como o Rails funciona por dentro

Em sua palestra, Carlos Brando acabou falando mais a respeito do framework Sociably, que está desenvolvendo na empresa SocialSmart.

Logo na introdução do apresentação ele perguntou à platéia quem programava em Rails. A grande maioria levantou a mão. Mas aí, ele disse: “Ninguém aqui programa em Rails, vocês programam em Ruby. Ruby on Rails não é linguagem de programação, é um framework Web desenvolvido em Ruby.”

Além disso, ele fez uma analogia com o Rails sendo igual macarrão instantâneo, pois rapidamente fica pronto. Mas não dá para fazer feijoada com miojo, então Rails não serve para tudo.

Os slides da apresentação você pode visualizar aqui.

Glenn Vanderburg: Tarantula - Rails Fuzz Testing

Glenn Vanderburg apresentou o Tarantula, um plugin Rails para realizar testes fuzz de maneira fácil e repetitível para aplicações Rails.

O vídeo da apresentação você pode assistir aqui.

José Valim: Geradores de código com Thor e Rails 3.0

José Valim explicou como o Thor uniu os geradores de código, tarefas e templates do Rails, substituindo o Rake, Sake e Rubigen.

Os slides da apresentação você pode visualizar aqui.

David Chelimsky: RSpec and Cucumber: Beyond the Basics

David Chelimsky, acabou falando praticamente somente de RSpec. Ele destacou que utilizando BDD com RSpec, você mantém o foco no comportamento, cria uma documentação executável, os testes são fáceis de ler e acabam sendo uma otimização de TDD.

Uma frase interessante da palestra foi “Balancing DRY and clarity is an art”.

David Chelimsky é autor do livro The RSpec Book: Behaviour Driven Development with RSpec, Cucumber, and Friends, o qual você pode obter aqui.

Fabio Kung: DSLs Internas e Ruby

Fabio Kung
por Levy Carneiro

Essa apresentação do Fabio Kung infelizmente eu não assisti, mas quem viu disse que gostou muito.

O vídeo da apresentação você pode assistir aqui, os slides da apresentação você pode visualizar aqui e o código-fonte você pode baixar aqui.

Fabio Akita: Agile, além do Caos

Nem me arrisco a falar muito dessa palestra do Fabio Akita. Ela foi muito boa, mas foi uma grande viagem. Coisas do tipo “Caos não é aleatório, caos não é caótico.” e “Auto-organização emerge de sistemas caóticos naturalmente.” ditaram o rumo da apresentação.

O que achei interessante é que no final das contas, as idéias foram lançadas, mas não houve conclusões. Cada um pensa a respeito do viu e ouviu e se quiser, ou puder, tire suas conclusões. Meu, viagem, assista.

O vídeo da apresentação você pode assistir aqui.

Matt Aimonetti: The Future of Ruby & Rails

Matt Aimonetti mostrou o que vem por aí na versão 3.0 do Rails com a junção do Merb. Também falou a respeito das novidades do Ruby, JRuby, IronRuby e MacRuby.

O vídeo da apresentação você pode assistir aqui.

Desconferência

A desconferência é um espaço para os participantes do evento fazerem suas próprias apresentações e palestras em um curto espaço de tempo.

O destaque foi para o Aldo Filho, um garoto de 11 anos, que fez uma apresentação da sua trajetória em dois meses para aprender a programar (desde o Oxente Rails) e depois, ao vivo, criou o tal do blog em 15 minutos.

E imaginar que tem nêgo barbado que não consegue fazer uma apresentação, o garoto teve a coragem de subir no palco e programar na frente de mais de 100 expectadores.

O vídeo da apresentação você pode assistir aqui.

Eventos, Ruby , , , ,