AppHarbor : parte I
0Olá pessoal, essa semana conheci o AppHarbor, o AppHarbor é um PAAS que permite executar todas as etapas necessárias para a publicação de uma aplicação .NET, se você já escutou falar do heroku então você vai perceber rapidamente que o AppHarbor é a solução com suporte ao framework .NET. Pra iniciar é necessário criar uma conta, temos a opção do plano grátis, após criar a conta vamos configurar uma aplicação asp.net mvc de exemplo versionada no bitbucket. 1-Nova applicação HelloWorld no AppHarbor
2-Criar o repositório HelloWorld no bitbucket ![]()
3-Gerar a url de build Agora vamos copiar a url do repositório gerada pelo bitbucket, no meu caso a url é
agora o próximo passo e acessar a aplicação no AppHarbor e clicar no link BuildURL.
4- Adicionar o serviço do AppHarbor no Bitbucket
Para isso devemos acessar o menu admin do bitbucket e clicar no item services do menu lateral esquerdo. Para obter os dados necessários basta usar a url gerada durante o BuildURL, minha url de exemplo é:
no campo token devemos colocar o valor da querystring authorization, no meu caso o valor é: uRlrJD14REWvvL0SoQULTK2hBhU1OZ1Gj%2f2qwoKsnUc%3d, o nome do projeto também pode ser obtido através dessa url, no noddo exemplo o valor é: helloworld-125, agora basta salvar as alterações.
O padrão da url gerada durante o build é:
https://appharbor.com/application/{project}/builds?authorization={token}
Agora vamos acessar o menu Access Management e dar acesso de leitura para o usuário apphb.
Pronto! já podemos testar a integração do AppHarbor, basta realizar um push para o repositório do bitbucket.
6- Push na aplicação asp.net mvc ![]()
6-Build!Build!Build!
7-Acessando a aplicação publicadaPara acessar a aplicação publicada basta navegar até o menu hostnames e lá está a url da aplicação, a minha url é
http://helloworld-125.apphb.com/
Por hoje é só pessoal, no próximo post veremos como rodar testes unitários durante o build. Abraços!
Entity Framework: The property ‘xx’ on type ‘xx’ cannot be set because the collection is already set to an EntityCollection
0Olá pessoal, depois de muito tempo sem falar sobre EntityFramework vou falar sobre o bug do titulo.
Problema
Vamos usar o Entity Framework 4.3.1 com o seguinte modelo
public class Blog
{
public int BlogID { get; set; }
public string Titulo { get; set; }
public string Url { get; set; }
public virtual ICollection Posts { get; set; }
}
public class Post
{
public virtual int BlogID { get; set; }
public virtual int PostID { get; set; }
public virtual string Titulo { get; set; }
public virtual string Conteudo { get; set; }
public virtual ICollection Comentarios { get; set; }
public Post()
{
Comentarios = new HashSet();
}
}
public class Comentario
{
public int PostID { get; set; }
public int ComentarioID { get; set; }
public string NomeAutor { get; set; }
public string Texto { get; set; }
}
O erro acontece quando temos o seguinte cenário: Temos uma entidade mapeada para usar change tracking proxy e existe a necessidade de utilizar a coleção contida nessa entidade durante o processo de criaçao de um novo post.
1: var contexto = new ContextoAcessoDados();
2: var blog = contexto.Blogs.FirstOrDefault();
3:
4: var novoPost = new Post { Titulo = "post novo já comentado", Conteudo = "conteudo do post novo" };
5: novoPost.Comentarios.Add(new Comentario { NomeAutor = "Joao", Texto = "como adicionar em dados em coleções usando o ef" });
6: blog.Posts.Add(novoPost);
7:
8: contexto.SaveChanges();
Ao executar I método saveChanges temos a seguinte mensagen:
The property ‘Comentarios’ on type ‘Post_51FA4C11FB3F248409B06D408BFBDEC68A302B257733726D76E931873D4398BC’ cannot be set because the collection is already set to an EntityCollection.
Solução
Acredite se quiser, mas a solução é desabilitar o change tracking proxy, isso mesmo você deve remover o modificador virtual das propriedades básicas e deixar apenas a coleção de comentários como virtual,a entidade alterada fica assim:
1: public class Post
2: {
3: public int BlogID { get; set; }
4: public int PostID { get; set; }
5: public string Titulo { get; set; }
6: public string Conteudo { get; set; }
7: public virtual ICollection Comentarios { get; set; }
8:
9: public Post()
10: {
11: Comentarios = new HashSet();
12: }
13: }
Pronto! agora o código funciona sem problemas. A solução foi tirada de uma thread no msdn
Espero que ajude pessoal, segue o código de exemplo para downloadOlá pessoal, depois de muito tempo sem falar sobre EntityFramework vou falar sobre o bug do titulo.
Problema
Vamos usar o Entity Framework 4.3.1 com o seguinte modelo
public class Blog
{
public int BlogID { get; set; }
public string Titulo { get; set; }
public string Url { get; set; }
public virtual ICollection Posts { get; set; }
}
public class Post
{
public virtual int BlogID { get; set; }
public virtual int PostID { get; set; }
public virtual string Titulo { get; set; }
public virtual string Conteudo { get; set; }
public virtual ICollection Comentarios { get; set; }
public Post()
{
Comentarios = new HashSet();
}
}
public class Comentario
{
public int PostID { get; set; }
public int ComentarioID { get; set; }
public string NomeAutor { get; set; }
public string Texto { get; set; }
}
O erro acontece quando temos o seguinte cenário: Temos uma entidade mapeada para usar change tracking proxy e existe a necessidade de utilizar a coleção contida nessa entidade durante o processo de criaçao de um novo post.
1: var contexto = new ContextoAcessoDados();
2: var blog = contexto.Blogs.FirstOrDefault();
3:
4: var novoPost = new Post { Titulo = "post novo já comentado", Conteudo = "conteudo do post novo" };
5: novoPost.Comentarios.Add(new Comentario { NomeAutor = "Joao", Texto = "como adicionar em dados em coleções usando o ef" });
6: blog.Posts.Add(novoPost);
7:
8: contexto.SaveChanges();
Ao executar I método saveChanges temos a seguinte mensagen:
The property ‘Comentarios’ on type ‘Post_51FA4C11FB3F248409B06D408BFBDEC68A302B257733726D76E931873D4398BC’ cannot be set because the collection is already set to an EntityCollection.
Solução
Acredite se quiser, mas a solução é desabilitar o change tracing proxy, isso mesmo você deve remover o modificador virtual das propriedades básicas e deixar apenas a coleção de comentários como virtual,a entidade alterada fica assim:
1: public class Post
2: {
3: public int BlogID { get; set; }
4: public int PostID { get; set; }
5: public string Titulo { get; set; }
6: public string Conteudo { get; set; }
7: public virtual ICollection Comentarios { get; set; }
8:
9: public Post()
10: {
11: Comentarios = new HashSet();
12: }
13: }
Pronto! agora o código funciona sem problemas. A solução foi tirada de uma thread no msdn
Espero que ajude pessoal, segue o código de exemplo para download
Mercurial: O merge deu errado e agora ?
0
Olá pessoal, olhando as estatísticas de acesso do meu blog vi que nas últimas semanas um número considerável de pessoas chegou aqui procurando por um comando hg unmerge. A questão é que não existe um comando básico do hg que desfaça um merge! Calma, nem tudo está perdido! Podemos resolver o problema, precisamos apenas analisar os cenários
O merge deu errado, mas não aconteceu um commit
Sempre que acontece um merge no mercurial é necessário o comando hg commit para persistir as alterações. Caso você tenha executado um merge e não tenha ainda realizado um commit é possível descartar as alterações através do comando hg revert, as duas maneiras básicas de usá-lo são:
hg revert nomedoarquivo
Usado quando desejamos reverter as alterações realizadas em arquivos específicos
hg revert –a
Usado quando desejamos reverter as alterações realizadas em todos os arquivos
O merge deu errado e um commit foi realizado
Neste caso precisamos reverter um commit, podemos realizar isso de diferentes maneiras, são elas:
hg backout –r numerorevisao
Reverte o efeito de um determinado changeset
hg rollback
Reverte os efeitos da última transação realizada no reposítorio
Espero que não seja necessário, mas temos essas maneiras de resolver merges com problemas, se você souber de mais alguma maneira pode deixar ai nos comentários. Até a próxima!
Links:
http://mercurial.selenic.com/wiki/Revert
http://mercurial.selenic.com/wiki/Backout
http://mercurial.selenic.com/wiki/Rollback
O que achei do Visual Studio 11 beta em 8 itens
0Fala pessoal, após um longo tempo sem posts e versões do visual studio aqui estamos de volta. Hoje será um post com algumas observações sobre a versão beta do visual studio 11
![]()
- Boa estabilidade para um produto beta
- Janela para adicionar referência com desempenho melhor
- A busca de texto está mais veloz
- Interface com mais espaço para código
- Escolha de browser para rodar no modo debug
- IDE mais inteligente para css
![]()
-
Esquema de cor dificulta identificar os tipos de arquivos
-
Muitos ícones na aba solution explorer
Obrigado ASKSoftware!
0Olá pessoal, após um longo tempo sem postar estou de volta com algumas novidades, algumas novidades profissionais que vou compartilhar aqui no blog e outras pessoais, quem me acompanha no facebook já deve ter reparado
. A principal novidade é que após 1 ano e 8 meses eu deixei de trabalhar na asksoftware e voltei a trabalhar com o pessoal da Harpia Ventures, sendo mais específico com o pessoal do place to ask. Quem me acompanha sabe que em 2009 eu trabalhei na harpia ventures com o pessoal do Evenka.
Falando do tempo em que fiquei no asksoftware certamente não vou conseguir descrever tudo que aprendi lá. Desde as pessoas incríveis que tive a chance de conhecer até todas as tecnologias que aprendi. Muito do meu aprendizado pode ser visto aqui no blog, entre as tecnologias que usamos nos diversos projetos estão: ASP.NET MVC (1,2 e 3), Entity Framework 4, TFS. Hg,XML, XSL além de praticar um monte de coisas que acredito como TDD, agilidade e build contínuo.
Eu só tenho a agradecer pela oportunidade e pela confiança que a equipe depositou em mim, espero em breve ter a oportunidade de participar de outros projetos com a galera.
Falando do futuro aqui na Harpia ventures vou continuar com um trabalho semelhante com o exercido da Harpia Ventures, com exceção do tipo de software que estamos construindo que é uma aplicação social pra internet e não um software corporativo intranet. Os primeiros conhecimentos que vou ter que adquirir/praticar aqui são otimização/escalabilidade e segurança, então já sabem que vem post no blog sobre isso ai, vou começar com o livro Ultra-Fast ASP.NET, indicação da galera aqui. Por enquanto é isso pessoal, até,
DevDay #BH Sucesso Total
1Olá pessoal, no ultimo sábado(27-08) tive a honra de participar do #devday. Eu já tinha confirmado minha ida ao evento um mês antes, no entanto surgiu a oportunidade de participar fornecendo uma lightning action. Quero agradecer ao pessoal de BH que foi super. receptivo e bem legal, um prazer rever amigos e conhecer pessoalmente muitos outros.Eu e RodrigoVidal gostamos tanto que até perdemos o voo, o evento foi excelente.
Conteúdo
A agenda já prometia um grande evento, tivemos de tudo! destaco as lightning actions que foram bem dinâmicas e legais. gostei bastante da apresentação sobre NoSql apresentada pelo gibran, gostei bastante também da talk sobre qualidade de codificação apresentada pelo Glauber. Entre as palestras teve tudo que gostaria de ouvir, a primeira que destaco foi a apresentação sobre a importância do front-end e as novidades do rails 3.1, eu gosto de Rails e já esperava uma apresentação bem focada no framework e no mundo Ruby, no entanto fui surpreendido por uma excelente palestra totalmente focada em desenvolvimento de front-end web. O Daniel Lopes mostrou como olhar de maneira profissional o front-end e de quebra deixou vários assuntos pendentes de estudo. Ainda tivemos as palestras sobre falhas de segurança e a palestra chocante do Rodrigo Vidal sobre programação funcional. O Rodrigo vidal explodiu a cabeça do pessoal, falando bem sobre programação funcional. A apresentação envolveu matemática, compiladores,linguagens e tudo mais que programadores gostam de ouvir, sensacional. Ainda tivemos o Giovanni bassi falando sobre CoffeeScript, mostrou bem como está fácil usar a tecnologia com o ambiente de desenvolvimento .NET, nota 10.
Minha Lightining action
Eu falei rapidinho como está sendo o processo de mudança e adoção de melhorias no dia-a-dia da asksoftware, foi uma apresentação rápida e bem pragmática. aqui estão meus slides
Happy Hour e comunidade
O happy hour foi sensacional, rolou até tarde no assacabrasa. O pessoal discutiu muito sobre tudo e pouco sobre software, é legal ver a comunidade ainda mais próxima e conversando sobre muitas coisas além de desenvolvimento.. quem foi ao devday e não foi no hh perdeu metade do evento ![]()
Para saber mais
Você pode saber mais sobre o evento buscando a hashtag #devday que por sinal foi TT em Belo Horizonte, você ainda pode acompanhar o blog do Douglas Aguiar
Eu confio no suporte, o suporte confia em Dev?
0Olá pessoal, estava pensando em colocar agile no titulo desse post pois afinal de contas parece que quase tudo que é legal hoje com relação a equipes e comportamento profissional é relacionado á agilidade certo? Eu não concordo com isso, então vamos falar sobre o assunto(confiança) independente sobre o que a equipe acredita ou pratica.
O assunto voltou à tona(já falei muito sobre esse assunto com o sidney filho) e durante um #HH com o pessoal da ASKSoftware conversando com um profissional do suporte, ele me falava como acreditava no software que estamos desenvolvendo e ainda como acreditava que a equipe está fazendo um bom trabalho e que fica feliz em trabalhar na empresa e com a equipe que trabalha. Isso já era o suficiente para me fazer pensar, afinal de contas não tenho a mesma certeza que a equipe de desenvolvimento acredita no software que está sendo criado quanto o profissional do suporte em questão.
A conversa continuou e ele ainda me disse que quando presta suporte que envolve possíveis problemas ele sempre parte do princípio que as outras equipes, implantação e desenvolvimento, fizeram um ótimo trabalho e da melhor maneira possível. Ficar sabendo disso me deixou muito feliz em saber da confiança depositada por esse profissional no que estava sendo feito por todas as outras equipes. Imediatamente após o sentimento de felicidade e satisfação teve início um momento de reflexão, eu faço o meu trabalho da melhor maneira para só assim ser merecedor da confiança de outras pessoas?
Enquanto eu refletia sobre o merecimento da confiança de outros colegas de trabalho, comecei a pensar se todos os membros da minha equipe também fazem por onde, para só fazermos parte de uma equipe merecedora de confiança. Durante a semana em que rolou esse HH o pessoal de desenvolvimento discutiu bastante sobre transparência entre os membros da equipe. Como já falei aqui em posts anteriores estamos adotando práticas ágeis e acredito que já passamos por boa parte da curva de aprendizado, o ponto é que agora acreditamos que devemos evoluir para um ponto onde as pessoas precisam ser transparentes e confiarem que cada pessoa faz o seu melhor.
Essa semana vou falar sobre a conversa que rolou no HH com o “cara” do suporte e propor uma reflexão sobre o assunto. É isso pessoal, espero que o post sirva de reflexão para as pessoas que ainda acreditam que podem fazer a diferença.
Commom Lisp–Project Euler #1
2Olá pessoal, seguindo a série de posts sobre commom lisp e a série de resoluções de problemas do projecteuler.net que os amigos Rodrigo Vidal, Elemar Junior e Juan Lopes estão fazendo aqui está minha contribuição do problema #1 em commom lisp.Vamos ao código:
A solução é bem menos elegante que a solução proposta pelo mestre Elemar em Haskell mesmo assim vamos analisar a solução.
Algoritmo
O algoritmo usado envolveu declarar uma função que recebe os limites, inferior e superior, e calcula os números cujo módulo de 3 ou 5 é igual a 0. Ao final da verificação de itens dentro do intervalo uma função que soma todos os valores resultantes foi aplicada.
Código
linha 2: o comando label foi usado para definir uma função que retorne uma lista com os números entre, inclusive, os limites passados como parâmetro.
O loop for
Olhando bem para o uso do comando loop ele é um pouco diferente do restante do código lisp não é? afinal de contas um monte de palavras soltas não é normal em commom lisp. O comando loop é uma macro que permite diversas combinações de uso, olhe mais aqui.
linha 3: uma função múltiplo-de-3-ou-5 é definida, na função foi usado o comando (mod x y ) para verificar o módulo de um determinado número x por y.
linha 4: É onde o problema é realmente resolvido. Lendo o código da esquerda para direita temos o seguinte: uma função redutora que faz uso do redutor de soma “+” é usada para reduzir uma lista gerada pela função mapcar. A função mapcar aplicou a função ‘múltiplo-de-3-ou-5 na lista gerada pela função intervalo.
É isso pessoal, em breve vou compartilhar mais soluções de problemas do ProjectEuler em lisp.
Números perfeitos em commom lisp
1Olá pessoal, continuando a série de posts sobre Lisp hoje vamos ver uma possível resolução do problema números perfeitos. O problema foi escolhido na lista de 1001 algoritmos para implementar antes de morrer.
Resolução do problema
O problema foi resolvido usando TDD, então vamos começar pelos testes e códigos que fazem os testes passarem. O problema foi dividido em dois pequenos problemas, o primeiro deles é encontrar os divisores de um número, vamos ver os testes e solução:
Explicando o código
A primeira função diferente á a função labels, essa função deve ser usada para declarar funções internas a função a qual a função labels é chamada
Como usar:
Contextualização:
a função listar-divisores recebe apenas o número alvo como parâmetro, dentro da função uma função chamada listar-divisores com dois parâmetros(numero divisores) é definida. O objetivo da função é percorrer todos os números até o número alvo(candidato a´número perfeito) e identificar se o número corrente é divisor do número alvo, caso seja o número será adicionado na lista. a função é executada enquanto o número for maior que 0
Condicional usando if
Commom lisp oferece diversos mecanismos condicionais, entre eles o if, o comando é bem simples, segue um exemplo que pode ser executado no REPL
Usando listas
Lisp fornece funções para trabalhar com lisp, algumas funções utilizadas foram:
São tão simples, que não é necessário comentar certo? Com esse código conseguimos fazer os testes passarem, então vamos definir mais testes e implementar mais uma função que deve finalizar o problema
O teste define que a função numero-perfeito deve retornar ‘(t) ou nil caso o numero seja perfeito ou não.
Contextualização:
A implementação ficou simples, a grande jogada é usar a função reduce, o resultado da função definida anteriormente é uma lista de divisores, para fazer isso é necessário somar todos os itens da lista e comparar com o numero-alvo, caso seja igual o número é perfeito.
Reduce
o símbolo ‘+ é a função agregadora que será aplicada na lista dos divisores
Pronto! Agora, todos os testes estão passando.
Conclusão
É isso pessoal, espero que tenham gostado. Estou escolhendo problemas simples para abordar a sintaxe de commom lisp. É sempre bom lembrar que provavelmente na linguagem em que você desenvolve na maior parte do tempo também é possível pensar de uma maneira um pouco mais funcional.
Quer aprender mais sobre commom lisp e/ou programação funcional?
http://lisp-br.org/
http://rodrigovidal.net/
Download do código de exemplo
https://bitbucket.org/higorcesar/exemploslisp
Sugestão para próximos posts
Ainda existem diversos assuntos para serem abordados, gostaria da sugestão de vocês para o próximo post sobre lisp/ programação funcional, os assuntos em pauta são:
- Map/Reduce
- Escalabilidade de software desenvolvido com base na programação funcional
- Orientação a objetos em commom lisp CLOS
Percepção da geração de valor
0Olá pessoal, o assunto do post será a percepção pelas partes envolvidas em projetos de software sobre a geração de valor. O post será baseado na experiência que estou tendo durante a adoção de agile na equipe em que trabalho, logo muita baboseira ou concepções não corretas de acordo com as literaturas podem surgir.
Desenvolvedor Herói
O IgorMusardo fez a tradução e falou um pouco sobre o assunto aqui, no post ele a tentativa de alguns desenvolvedores de salvar o projeto/Sprint/release com atos heroicos, quer exemplos?
- Nos últimos dias de um Sprint mal sucedido o desenvolvedor começa a trabalhar 3 horas a mais por dia na tentativa de salvar o Sprint.
- Após um dia inteiro corrigindo bugs e revendo implementações em javascript o desenvolvedor não vai embora enquanto não corrigir o ultimo bug no I.E 6
- Após uma review desastrosa o desenvolvedor decide virar a noite resolvendo bugs
Ahh isso que você está falando é dedicação/perseverança/paixão! Fique calmo, também não sou o desenvolvedor experiente em lidar com a vontade de ver as coisas funcionando e ver o Sprint falhando de maneira absurda. Desde que iniciei com desenvolvimento até os dias atuais encarei as tarefas de tal maneira, afinal de contas missão dada é missão cumprida. No início da carreira não existia hora extra suficiente, trabalhava o quanto fosse preciso por mais que as vezes estivesse tão cansado que até era “destrutivo”.
Horas extras não sustentáveis a longo prazo
Todos estão cansados de saber, afinal de contas já leram isso no programador pragmático e na metade das bibliografias sobre agilidade. O complicado é na hora que o bicho pega conseguir encaras os fatos com frieza e respeitar os limites
Porque você não vai salvar o projeto?
Quanto maior o projeto menor será o efeito de suas noite sem sono e fins de semana de programação. Quando um projeto precisa de 20 horas/desenvolvedor semanais a mais para ser entregue no prazo é sinal que existe um problema, Se é necessário um herói para fechar todos os Sprint isso certamente é um problema.Você realmente acredita que consegue salvar um projeto de 6 meses com uma dezena de pessoas envolvidas somente com suas 10 horas extras semanais? Você pode até tentar..
E dai que você é um herói? ninguém sabe disso
Pode até ser possível que com dedicação e força de vontade você consiga salvar um Sprint ou até um release. Digamos que você trabalhou durante o final de semana refartando uns códigos e tornou o desenvolvimento do Sprint mais fácil, a questão é: quem se importa? vejamos um exemplo:
O desenvolvedor A refatorou um código tenso na segunda pela noite e acabou trabalhando até as 23 horas, no próximo dia o desenvolvedor está cansado pela manha e se atrasou para o daily scrum. Os desenvolvedor B e C não olham o servidor de código fonte e nem fazem ideia de um commit as 23 horas, sendo assim logo consideram que o desenvolvedor A está “desmotivado’. A percepção de valor gerada pelo desenvolvedor A é zero, nem seus amigos de trabalho reconhecem o valor e quem dirá seu gestor ou ainda o Cliente.
Eu sou herói por vocação, gosto de programar e resolver problemas
Esse ponto é defendido por alguns desenvolvedores, eu até já defendi essa ideia trocando um tuites com o igormusardo e já foi fruto de discussões também com o Juan lopes. São dois pontos diferentes, são eles:
- Vicio em resolver problemas
solução: Frequentar dojos, resolver problemas como treino em programação, participar de competições - Gosto muito de programação
solução: Desenvolver novos projetos, dedicar tempo ao estudo e aprimoramento, abrir seu próprio negócio.
Reflexão:Estou mesmo gerando valor?
Todos os pontos aqui abordados são voltados a reflexão sobre o valor gerado por atos heroicos durante o desenvolvimento. Existem diversos outros pontos que não foram tocados como por exemplo família e dinheiro. É importante que um ritmo sustentável seja mantido, afinal de contas do que adianta só apagar incêndios e não atacar o problema de uma maneira adequada que propicie a todos os envolvidos a percepção adequada de valor.