Arquivo

Arquivo da Categoria ‘Sem categoria’

ABC App – 03 Fazendo um Refactoring na DAL

4, novembro, 2009 egomesbrandao 2 comentários

No post anterior,  iniciamos a contrução da ABC App, construindo uma camada de Domínio e uma camada de DAL. Antes de continuarmos a desenvolver, vamos aplicar um Refactoring?

Eu não gosto de termos em inglês para coisas que podemos falar em português, mas no caso do Refactoring eu abro uma exceção, normalmente o que se fala é Refatoração, mas essa palavra para mim é um termo matemático. O correto, IMHO, seria dizer Re-fabricar, mas fico com o termo em inglês.

E o que podemos fazer?

Vamos seguir usando Baby Steps, daqui por diante pequenos passos, ou seja , faço Refactoring e testo, Refactoring e testo, então não corro o risco de fazer uma grande alteração e me perder no código alterado e o sistema não funcionar. A primeira coisa para alterar é a criação da conexão com o BD, como será recorrente em toda classe DAL, podemos criar um classe base que todas dessa camada herdem e,  assim,  centralizarmos o código. Então,  primeira coisa, crie uma classe BaseDAL, como abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Data.Common;
using System.Resources;
using EntLib = Microsoft.Practices.EnterpriseLibrary.Data;

namespace ABCApp.DAL
{

    public abstract class BaseDAL
    {
        public EntLib.Database db { get; set; }

        public BaseDAL()
        {
            db = EntLib.DatabaseFactory.CreateDatabase("Connection String");
        }
    }
}

Listagem 01

A classe BaseDAL não poderá ser instanciada, só poderá ser herdada. Com isso, ganhamos um único ponto de conexão com o Banco de Dados, que será muito útil quando quisermos controlar um transação, outro ponto é no reuso de código. Para usarmos essa classe vamos herdar ela na classe Customer da DAL. Não se esqueça de apagar a linha indicada, pois agora usaremos o objeto Database da classe BaseDAL. Lembram-se do código abaixo?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Domain = ABCApp.Domain;

using System.Data;
using System.Data.Common;
using System.Resources;
using Microsoft.Practices.EnterpriseLibrary.Data;

namespace ABCApp.DAL
{
    public class Customer : BaseDAL
    {
        public Domain.Customer GetCustomerById(int customerId)
        {
            //Apague a linha abaixo
            //Database db = DatabaseFactory.CreateDatabase("Connection String");

            string sql = "select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer where customerid = @customerid";

            DbCommand cmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(cmd, "customerid", DbType.Int32, customerId);

            IDataReader dr = db.ExecuteReader(cmd);

            Domain.Customer c = new Domain.Customer();

            while (dr.Read())
            {
                c.CompanyName = dr["companyname"].ToString();
                c.CustomerId = Convert.ToInt32(dr["customerid"]);
                c.EmailAddress = dr["emailaddress"].ToString();
                c.FirstName = dr["firstname"].ToString();
                c.LastName = dr["lastname"].ToString();
                c.MiddleName = dr["middlename"].ToString();
                c.ModifiedDate = Convert.ToDateTime(dr["modifieddate"]);
                c.Phone = dr["phone"].ToString();
            }

            if (!dr.IsClosed)
                dr.Close();

            return c;
        }
    }
}

Listagem 02

Se já tivéssemos escrito mais classes DAL, o impacto dessa alteração seria muito maior. Então , seguindo nossso mantra de pequenos passos, vamos executar o código e saber se ele continua funcionando como o esperado.
Sendo o retorno igual ao que você tinha antes de modificar o código, então passamos neste Refactoring!
Vamos continuar implementando outros métodos na nossa classe DAL, o próximo interessante é retornar uma coleção de clientes. Podemos retornar todos os clientes e basicamente o método seria o mesmo do anterior mas sem o parâmetro de customerId e sem a linha de parâmetro no Command, vou criar então o método GetCustomers e que irá me retornar uma lista tipada de objetos, segue:

public IList<Domain.Customer> GetCustomers()
        {
            List<Domain.Customer> lstCustomers ;

            string sql = "select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer";

            DbCommand cmd = db.GetSqlStringCommand(sql);

            IDataReader dr = db.ExecuteReader(cmd);

            lstCustomers = new List<Domain.Customer>();

            while (dr.Read())
            {
                Domain.Customer c = new Domain.Customer();

                c.CompanyName = dr["companyname"].ToString();
                c.CustomerId = Convert.ToInt32(dr["customerid"]);
                c.EmailAddress = dr["emailaddress"].ToString();
                c.FirstName = dr["firstname"].ToString();
                c.LastName = dr["lastname"].ToString();
                c.MiddleName = dr["middlename"].ToString();
                c.ModifiedDate = Convert.ToDateTime(dr["modifieddate"]);
                c.Phone = dr["phone"].ToString();

                lstCustomers.Add(c);
            }

            if (!dr.IsClosed)
                dr.Close();

            return lstCustomers;
        }

Listagem 03

E para testar o código acima vamos escrever as seguintes linhas no nosso método Main no Projeto Console, logo abaixo da última linha já existente do nosso teste anterior:

            IList<Domain.Customer> lstCustomer = dalCustomer.GetCustomers();

            foreach (Domain.Customer customer in lstCustomer)
            {
                System.Console.WriteLine(customer.CustomerId.ToString() + " - " + customer.FirstName.ToString() + " " + customer.LastName.ToString());
            }

            System.Console.ReadKey();

Listagem 04

O código acima chama o método da DAL e retorna uma coleção de Clientes. Se aparecerem  várias centenas de Clientes,  está certo!
O código escrito até agora. Será que é possível aplicar um Refactoring para melhorar algo? Bom, tem algo bem evidente, uma duplicação de código, os dois métodos fazem a leitura do DataReader e populam um objeto Customer, e um deles ele adiciona a uma lista de objetos já que o retorno são vários. Podemos centralizar esse código para que quando for preciso adicionar uma nova Propriedade a classe Customer seja preciso alterar somente em um lugar, então vou criar o método AdaptToList que irá receber um DataReader e retornar uma lista tipada de Customer:

public IList<Domain.Customer> AdaptToList(IDataReader dr)
        {

        }

Listagem 05

O código da listagem 05 está praticamente pronto. Mova o código que se encontra na listagem 03, da linha 11 até 27 para dentro do método AdaptToList, e adicione a última linha, conforme a listagem 06! E repare que na inicialização da coleção Customer a declaração estava em outra linha,  então acrescente o tipo antes.

        public IList<Domain.Customer> AdaptToList(IDataReader dr)
        {
            List<Domain.Customer> lstCustomers = new List<Domain.Customer>();

            while (dr.Read())
            {
                Domain.Customer c = new Domain.Customer();

                c.CompanyName = dr["companyname"].ToString();
                c.CustomerId = Convert.ToInt32(dr["customerid"]);
                c.EmailAddress = dr["emailaddress"].ToString();
                c.FirstName = dr["firstname"].ToString();
                c.LastName = dr["lastname"].ToString();
                c.MiddleName = dr["middlename"].ToString();
                c.ModifiedDate = Convert.ToDateTime(dr["modifieddate"]);
                c.Phone = dr["phone"].ToString();

                lstCustomers.Add(c);
            }

            return lstCustomers;
        }

Listagem 06

Para funcionar só é preciso chamar o método AdaptToList no método GetCustomers,  também alterei para que a lstCustomer fosse baseada em uma IList<T>, conforme a listagem abaixo:

        public IList<Domain.Customer> GetCustomers()
        {
            IList<Domain.Customer> lstCustomers = null; 

            string sql = "select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer";

            DbCommand cmd = db.GetSqlStringCommand(sql);

            IDataReader dr = db.ExecuteReader(cmd);

            lstCustomers = AdaptToList(dr);

            if (!dr.IsClosed)
                dr.Close();

            return lstCustomers;
        }

Listagem 07

Mais um pequeno passo, e mais um teste! Se rodou e continuou funcionando é por que o seu Refactoring foi bem feito! O que falta? Bem, se AdaptToList foi contruído para economizar código devemos usá-lo também no método GetCustomerById, mas nesse último método ele retorna apenas um Customer e não uma lista. Podemos então usar um artifício: pegar somente o primeiro item da lista para retornar, conforme listagem abaixo: 

public Domain.Customer GetCustomerById(int customerId)
        {
            IList<Domain.Customer> lstCustomers = null;

            string sql = "select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer where customerid = @customerid";

            DbCommand cmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(cmd, "customerid", DbType.Int32, customerId);

            IDataReader dr = db.ExecuteReader(cmd);

            lstCustomers = AdaptToList(dr);

            if (!dr.IsClosed)
                dr.Close();

          �
            return ((lstCustomers != null) || (lstCustomers[0] != null)) ? lstCustomers[0] : null;
        }

Listagem 08

Na listagem 08 está o método GetCustomerById como deve ficar, a mudança do List<Domain.Customer> para IList<Domain.Customer>, a chamada do método AdaptToList e o pulo do gato que é o uso do operador ternário para retornar somente o primeiro item da coleção, ou seja um objeto Customer, ou um null, não vamos discutir agora se retornar nulo é uma boa opção ou não!

Vou finalizar o post por aqui, para não ficar muito grande, resumindo o que fizemos aqui: Refactoring!
Melhoramos o nosso código, parece que não é necessário fazer isso agora, mas sempre que possível é interessante a fazer, no caso criamos uma classe para cuidar inicialmente da conexão com o banco de dados e como criamos outro método que populava a classe Customer criamos um método para cuidar especificamente disso.

O código deste post encontra-se no Change Set 35524, dúvidas e sugestões por favor comentem!

Referências:

Wikipedia Refatoração

Wikipedia Refactoring

Wikipedia Code Refactoring

Categories: Sem categoria, abcapp Tags: , ,

Novo feed, assine… daqui a pouco novo post!

26, outubro, 2009 egomesbrandao Sem comentários

Pessoal,

Estou mudando o endereço do feed, se você assinou mude para:

http://feeds.feedburner.com/egomesbrandaoblog

Obrigado por continuar lendo, e daqui a pouco sai novo post: Como acessar dados sem usar Dataset.

Categories: Sem categoria Tags:

Sobre a reunião do DNA, PMI X Scrum, e podcast

29, setembro, 2009 egomesbrandao 6 comentários

Antes de postar o próximo post do ABC App eu quero comentar sobre dois acontecimentos.

Dia 26 de setembro aconteceu mais uma reunião do grupo DNA (.NetArchitects), o tema foi PMI X Scrum. O objetivo era fazer uma mesa redonda em que cada um dos lados tivesse defensores em que apresentassem a sua defesa pelo uso de um ou do outro. Infelizmente,  do lado do PMI nossos convidados não apareceram, o nosso grupo DNA, é praticamente 100% a favor do Scrum, então dois se ofereceram para defender a visão do PMI:  André Dias (http://blogs.msdn.com/andredias/, siga @andrediasbr) e Victor Cavalcanti (http://www.cavalcante.net, siga @vcavalcante), do lado do Scrum ficou o Giovanni Bassi (http://unplugged.giggio.net, siga @giovannibassi).
Fora a frustração evidente do André e do Victor, de ter que defender o PMI o papo foi muito legal. O que tirei da conversa:

  • O PMI é velho! Hoje estamos cada vez mais dinâmicos, aplicações são escritas por pessoas que não são desenvolvedores em suas horas vagas, arrancando pedaços de participação de mercado de empresas, e por conta disso,  precisamos de mais velocidade; então por quê continuar com algo que é lento? Onde precisamos de controle vamos controlar, onde não precisamos de controle não vamos controlar! (do manifesto ágil: Individuals and interactions over processes and tools)
  • Se precisamos cada vez mais de velocidade , é por que precisamos de software pronto o mais rápido possível, tanto para atender uma demanda de mercado, como uma mudança de negócio de uma empresa; então por quê perder tempo com o que não é essencial? Com o que não vai trazer ROI? Vamos entregar! (do manifesto ágil: Working software over comprehensive documentation)
  • Se precisamos de software rápido e funcionando, precisamos de pessoas capacitadas, treinadas, focadas, interessadas para desenvolver. Então por quê não valorizamos esses profissionais? Por quê esprememos deles coisas inúteis como cumprimento de horário, vestuário, entre outras coisas? Vamos deixar as pessoas trabalharem confortavelmente, vamos investir nos bons profissionais, vamos recompensar quem traz ganhos para a empresa! (do manifesto ágil: Individuals and interactions over processes and tools)
  • Para isso tudo acontecer precisamos ser dinâmicos, não nos fechar, não entrarmos em uma bolha, tratar funcionários e clientes como parceiros; Por quê então tornamos eles nossos inimigos? Vamos construir pontes, ao invés de derrubá-las! (do manifesto ágil: Responding to change over following a plan)

Scrum é isso, nada mais que isso, o que falta aí é documento Product Backlog e as cerimônias de planejamento, reunião diária, e de finalização do Sprint. Precisamos mais do que isso para entregar um software? Não precisamos escrever extensos documentos que nunca serão lidos, não precisamos ficar montando cronogramas de coisas que não podemos prever, não precisamos ter alguém para mandar, só precisamos deixar que foi contratado para fazer o trabalho… trabalhar!

Quem quiser saber o que rolou na reunião veja pelo link do livemeeting, o André Dias também fez um post muito legal, tem até uma colagem de uma conversa com o @RenatoFerracini que rolou no twitter.

O outro assunto é sobre o mais novo episódio do podcast do .NetArchitects , que falamos sobre a profissão de Arquiteto, o assunto foi muito legal e vamos voltar a falar sobre ele com certeza! Assine o feed, ouça e comente!

Ainda essa semana sai o próximo post…

Categories: Sem categoria Tags:

Tema para VS.Net

12, agosto, 2009 egomesbrandao Sem comentários

Desde os tempos em que eu usava o  AutoCAD o meu fundo de tela é preto, o branco cansa muito a vista e para quem fica diante do computador várias horas ao dia é necessário tomar algumas providências para diminuir esse problema. Usar a tela com o fundo preto ainda por cima consome menos energia! :)

Com o VS.Net existe a possibilidade de também configurar esse ambiente. Logo quando conheci essa funcionalidade mudei o fundo para preto, mas são necessários  mais ajustes pois determinadas cores padrão não ficam muito bem com o fundo preto.

Sem querer um dia achei um tema adaptado no blog do Eduardo Miranda, ele usa o tema John Lam,  traduzido do TextMate para Visual Studio. Ficou bem legal, aqui está o post. Nos comentários tem uma pequena correção que o Israel Aece faz que é bem útil.

Ontem achei novos temas:

http://winterdom.com/2007/11/vs2008colorschemes

http://coelhonarede.110mb.com/2008/01/temas-para-o-visual-studio.html

Estou testando o Midtone Complete, que é uma adaptação do Midtone Scheme ( ambos encontrados no último link) a tela não é totalmente preta, fica um tom de envelhecido bem legal. Foi muito bem montada a relação de cores, quando se escreve uma String e fecha a última aspa ela fica verde, bem cuidadoso.

Para quem quiser criar um tema pode fazer as alterações em menu Tools > Options, e no treeview Environment > Fonts and Colors:

Tela do VS.Net para mudar cores e fontes

Tela do VS.Net para mudar cores e fontes

E para quem quiser adicionar um tema, adicionar e modificar em cima de um tema, ou guardar essas e outras configurações que fez no VS.Net, vá no menu Tools > Import and Export Settings, lá você também pode resetar para as configurações de atalhos, fonts, cores originais!

Compartilhe o seu tema, atalhos, e configurações legais que você fez no seu VS.Net!

Categories: Sem categoria Tags:

Qual a próxima onda?

31, julho, 2009 egomesbrandao 1 comentário

Já que é sexta-feira quero convidar a todos para fazer um exercício de futorologia e opinarem… o que vem em seguida? Qual a próxima onda?
Estamos entrando em uma onda chamada Cloud Computing, mas eu acho que ela não é o fim, é um meio.
Para mim,  a internet nunca foi um fim, e sim um meio de comunicação. Sempre vi como ela foi criada uma rede global, portanto sempre pensei que seria o meu suporte para conexão de sistemas, troca de informações, integração e não como o sistema em si, as chamadas web aplicações. Que ao meu ver são muito específicas, nem tudo dá para ser web.
Hoje o Giovanni Bassi twitou com o link de um vídeo em que a MS mostra a visão de futuro dela. É uma série de vídeos muito legais, tem um mais específico na área médica, outro da área de manufatura, eles estão aqui.
Logo mais teremos o Win7 chegando com suporte a telas por toque, a próxima versão do .Net framework vai trazer facilidades nesse aspecto, temos Silverlight rodando fora do navegador, MS Surface, …
Dito isto,  acho que a próxima revolução não será o Cloud Computing, que vai “apenas” (não é pouca coisa concordo) abstrair o computador pessoal em vários dispositivos e integrar muita coisa, mas acho que a próxima onde será a das interfaces! Integrá-las mais harmoniosamente ao nosso dia-a-dia, ter mais usabilidade, mais poder e mais facilidades.
O que você acha?

Categories: Sem categoria Tags: ,

Campanha: Atalho para atualizar design no ASP.Net

28, julho, 2009 egomesbrandao 2 comentários

Atualização (06/Ago/09): Conforme dica do Caio Proiete lá nos comentários o atalho é CTRL+SHIFT+Y, valeu Caio!

Comecei a programar em ASP.Net e logo uma coisa me deixou desconfortável.

Eu gosto de programar em código, mas vez por outra é legal dar uma “olhadela” em como esta ficando o seu design, existe um atalho para isso: SHIFT+F7, e você fica alternando entre design e source. Legal…

Mas legal mesmo é você programar com a janela dividida entre código, só tem um problema. Como fazer um Refresh no Design quando você altera o código sem usar o mouse? Sou programador, escrevo código, não gosto de ficar arrastando o mouse.

Simplesmente não dá! Você tem que clicar na linha amarela, como essa aí embaixo:

Split de tela entre código e design

Split de tela entre código e design

Então resolvi comunicar a MS que ela deveria mudar isso e segui a recomendação do André Dias e postei uma sugestão no MS Connect, site da Microsoft para sugestões, críticas, …

Se você também acha pertinente a sugestão, vote, e twitte sobre ele!

Aqui vai o link https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=476075&wa=wsignin1.0

Categories: Sem categoria Tags:

Adobe Reader posto, Adobe Reader morto!

Se você acompanha esse blog sabe que sou desenvolvedor da plataforma .Net, e portanto sou mais pelo lado do software proprietério, pois ganho dinheiro com isso… Gosto dos produtos da MS, e defendo eles sempre que a discussão vai pro lado filosófico e sai das questões técnicas.

Portanto, era natural que para ler PDF eu usasse o software “original”, o Adobe Reader…
Mas uma coisa sempre me intrigou nesse software, apesar de saber que ele não é apenas uma leitor, você pode desenvolver formulários com ele. É complicadinho, usa Java Script, mas funciona e,  dizem que os norte-americanos declaram o imposto de renda assim; além de ele ter uma segurança elevada no PDF usando certificados digitais, etc… E portanto,  isso faz dele um software “robusto”. Ele é robusto DEMAIS!

É extremamente grande, extremamente pesado, e extremamente chato pois de mês em mês, ou menos, baixa uma atualização de mais de 40Mb!!! Eu disse uma atualização de mais de quarenta megabytes!! Ou seja, baixa toda vez que ele faz um update um novo Adobe Reader! Uma vez,  até eu mandei um e-mail para a Adobe perguntando o porquê de o software ser tão pesado, logicamente não tive resposta.

Bom… O tempo passou e tudo isso me fez perder a paciência, ainda mais no peso quando eu quero abrir mais de um arquivo ao mesmo tempo. E decidir matar o Adobe Reader… pelo menos na minha máquina.

Eu já havia visto algumas soluções de leitores de arquivo PDF, mas nenhuma me agradou, até que ano passado vi que o Foxit melhorou muito! A interface ficou confortável, é verdade que não é parecida com a da última versão do Adobe Reader, mas não se pode ter tudo. Mas o que mais me chama a atenção é a leveza, poxa, é pequeno e muito leve, já usava nas duas últimas empresas e agora instalei aqui em casa, e estou feliz… e leve!! :)

Nesse caso o software livre se mostrou muito superior ao fechado, e nesse caso em específico eu faço propaganda, mate o seu Adobe Reader também!

http://www.foxitsoftware.com/

Categories: Sem categoria Tags: ,

Google Developer Day 2009

Participei da edição 2009 do Google Developer Day, ou #gdd no Twitter.

Foi um evento de um dia só, o que é uma pena, pois 3 trilhas ocorrem em paralelo e você tem que decidir e sempre acaba perdendo alguma coisa legal. No entanto, o Google tem a política de disponibilizar as filmagens no YouTube, daí dá pra ver o que perdemos.

No início da manhã tivemos um Keynote e a apresentação do Google Wave, com Stephanie Hannon e Torsten Nelson, do Google Brasil, que foi muito boa, mas foi mais do mesmo, já que tinha visto o lançamento em vídeo. Quando essa ferramenta estrear acho que vamos ter uma nova revolução na comunicação, no mesmo estilo que o GMail fez. (Adendo: ontem 30/Jun/09, recebi um convite para testar o Wave, depois escrevo sobre ele)

À tarde escolhi a trilha de mapas, 3 palestras seguidas com Pamela Fox, já que estou trabalhando no uso dessas API’s nada mais natural, e foram muito boas, mas eu ainda sou iniciante nelas, então, não de pra se empolgar muito. O que dá para perceber é que o Google investe muito nessas API’s de mapas. Agora a parte alta foi ouvir a segunda palestra no português arranhado e carregado da Pamela, não tem preço! (Até por quê o evento é gratuito… hehehe)

As duas últimas palestras que eu vi foram do Patrick Chanezon, uma sobre Web Social, falando da integração do Open Social do Google com sites, blogs, etc… E a outra sobre HTML 5, que foi um aprofundamento do Keynote que ele fez na parte da manhã. O Chrome e o Firefox já implementam muita coisa do HTML5 e eu quero saber por que a MS fica para trás nesse tipo de coisa.

Outro ponto, será que o HTML5 derruba Flash, Flex, Silverlight e JavaFX? Alguns levantaram essa bola, o Google deve estar louco para isso já que eles investem pesado em Javascript e não tem um componente RIA como os citados acima. Outros dizem que não, por quê esses plug-ins atingem outras funcionalidades, vamos ver, de camarote.

Balanço: Muita informação, fiz pouco network, ganhei umas bolinhas do Google, adesivo do GMail, almoço e coffee na faixa, e no fim foi um dia divertido, forcei bastante o inglês, já que me dá nervoso ficar ouvindo a tradução simultânea.

Fotos do evento estão aqui. Espero participar ano que vem.

Categories: Sem categoria Tags: , ,

.Net Architects Day 2009

Pessoal,

O .Net Architects Day 2009 aconteceu, dia 27 de Junho de 2009, na UNIP do Tatuapé! E o feedback que temos recebido é que foi um sucesso!
Foi muito gratificante participar da organização, de ajudar o evento acontecer, de ver os participantes gostando do que foi planejado.

Infelizmente, tínhamos só das 09 às 18:30 de palestras! Mas acho que vários ficariam mais tempo. Durante o coffee, participantes trocaram idéias com os palestrantes, e eu pude, juntamente com o Daniel Fonseca, colher alguns depoimentos que logo serão compilados em um clip e disponibilizados.

O Fabio Margarito fez um post e disponibilizou algumas fotos aqui, a Fernanda Sallai, que era participante, postou com feedback e fotos dos brindes que distribuimos aqui. Conforme o pessoal for postando eu atualizo aqui.

No Twitter o pessoal usou a tag #dnad2009, veja os comentários.

Valeu!

E agora acho que vou conseguir me dedicar mais aqui para o blog.

Categories: Sem categoria Tags:

Olá mundo… ou melhor: Hello, World! de novo…

Olá, pessoal!

Estou completamente na Web agora, com domínio próprio, blog com engine em .Net, etc…

A necessidade do domínio surgiu por conta de novos projetos pessoais que eu estou desenvolvendo, o famoso projeto de garagem, mas que está ganhando forma e este ano vai sair da cabeça para o papel, ou melhor, para o mundo virtiual.

Também vou usar o domínio para hospedar esse blog que eu vinha desenvolvendo no egomesbrandao.blogspot.com, espero que eu aumente a frequência de postagem. Assim continuo também com o projeto que eu vinha desenvolvendo no CodePlex, e que seguia os posts do blog anterior, esse aqui: ABC2008 Tem um outro também, mas divulgo depois.

Quanto ao meu projeto de garagem, espero em breve fazer um anúncio dele por aqui.

[]’s

Categories: Sem categoria Tags: