Uncategorized

Mercurial: Dicas

0

Experiência

Olá pessoal, como expliquei no post anterior meu time na ASKSoftware está usando mercurial com o serviço do bitbucket.org, fechamos mais uma semana sem quebrar o build e agora todos já estão familiarizados com os comandos. Incrivelmente essa semana não fizemos nenhum merge manual! isso mesmo,a ferramenta conseguiu resolver todos os problemas. Em nenhum momento o serviço prestado pelo bitbucket ficou indisponível, sou só elogios. Estamos aprendendo bastante e de maneira pragmática sobre o DVCS, ainda não domino o modelo de funcionamento do ponto de vista arquitetural mas pretendo aprimorar isso em breve.Durante a semana aprendi alguns comandos e peguei dicas com usuários mais avançados, então vou compartilhar aqui uma pequena lista.

Ferramentas básicas
TortoiseHg: Instala o mercurial e suas dependências além de fornecer uma ferramenta visual(tortoise) já integrada com uma ferramenta de merge. Mesmo que você use a linha de comando eu recomendo manter o tortoisehg.

Powershell: Se tornou uma das minhas principais ferramentas de trabalho. Além de ter alias pra alguns comandos bash o console é maior e tem todo o poder e extensibilidade do powershell.

VisualHg: Pra quem gosta de integração com Visual Studio pode usar este plug-in. Ele depende do tortoisehg.Na semana passada algumas pessoas da minha equipe estavam usando, essa semana eu vi que todos só estavam usando o console.

Serviço de host

BitBucket.org: Pra falar a verdade nem conheço outro serviço. a estabilidade é boa e o preço é muito bom.

Comandos

Digite a menor quantidade de letras possível para executar um comando: O mercurial tem o padrão de aceitar a menor quantidade de letras para reconhecer e executar um comando, então você pode fazer o seguinte:

Comando completo Atalho
hg pull hg pul
hg push hg pus
hg status hg st
hg commit hg ci
hg addremove hg addr
hg merge hg me

 

múltiplos heads: Quando você estiver atualizar sua versão e tiver multiplos heads de um mesmo branch será necessário realizar o merge com cada head. Pelo que aprendi vale a pena atualizar para o último head e fazer o merge com os anteriores

Atualizar para determinado revision: hg up –r NumeroRevisão
Merge com determinadas revisões: hg mer -r NumeroRevisão

Ignorar alterações: Sempre que desejar ignorar alterações ainda não “commitadas” você pode usar o comando hg revert –a. Esse comando remove a modificação de todos os arquivos.

Quer saber se tem modificação no servidor: Você não precisa rodar o comando hg pull pra saber se tem modificação no repositório, você pode usar o hg incoming.

É isso pessoal, espero em breve apresentar mais dicas e boas experiências com o hg.

EcoDevelopers Rio de Janeiro foi um sucesso!

0

EcoLogo

Olá pessoal, no ultimo sabado tivemos mais um evento promovido pela comunidade da tecnologia .NET no INFNET o foco do evento foi T.I verde relacionado à tecnologias Microsoft. O EcoDevelopers foi organizado por membros de várias comunidades, entre elas o DotNetArchitects.

 

O evento contou uma agenda bem legal contando desde soluções de Infra-estrutura, computação na nuvem e linguagens e banco de dados. As palestras que mais gostei foi sobre Report Services e Business Inteligence com o @zavaschi. A verdade é que aprendi mais sobre Report Services do que em todos as palestras anteriores do EcoDevelopers.

 

A boa notícia é que o evento ainda vai rolar em outras cidades, então se estiver tempo e quiser pode acompanhar aqui a agenda. Estou me planejando para ir no @ECODevPira e ainda passar no @DNAD que será em SP capital.

 

Além de palestras tivemos os HHs antes e depois do evento. Fou muito legal conversar com especialistas em diversas tecnologias Microsoft de maneira informal e criar mais uma amizade no meio profissional.

foto2

A comunidade do RJ está evoluindo mais ainda precisamos de mais agitação na comunidade .NET e ainda organizar eventos mesclando diversas tecnologias e falar sobre interoperabilidade.

 

foto1

É isso pessoal, parabéns a todos os palestrantes e organizadores do #EcoDevelopers! sucesso pessoal!

Compartilhando dlls entre várias aplicações usando o GAC

0

 

Reusar código é uma boa idéia, então provavelmente seria uma boa idéia reaproveitar códigos em uma dll que forneça serviços por exemplo.Normalmente nós desenvolvedores reusamos uma dll construida com funções básicas. Desde .net 1.1 é possível compartilhar dlls entre aplicações usando o global cache assembly. Este espaço existe em qualquer maquina com o framework instalado, para começar a usar é necessário que o assembly a ser registrado possua um “Nome forte” que entre outras coisas é responsável por identificar de maneira única o assembly.

 

Criando um nome forte para o assembly

SigningAssembly

 

Após a configuração veja que foi gerado um arquivo com extensão .snk

Adicionar assembly na aba referêncy do Visual Studio

Após esta configuração temos um assembly com o nome forte, agora falta registrar o mesmo no GAC.Antes de registrar vamos mover o assembly para a pasta:

%Program Files%\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies

Com o assembly nesta pasta o visual studio reconhece nossa dll como uma dll do .NET, assim fica mais facil adicionar referências.

 

Registrando o assembly

Para registrar o assembly vamos usar o utilitário gacutil. o comando é gacutil /i nomedoassembly.dll

 

Agora já é possível criar aplicativos que possuem como referência um assembly registrado no GAC. Para adicionar a referência basta procurar na aba .NET do visual studio.

 

E quando eu alterar o assembly adicionado no GAC?

Quando um assembly do GAC for alterado será necessário registrar novamente o mesmo e reiniciar o visual studio para que ele atualize a sua referência de desenvolvimento. Como no projeto que surgiu a necessidade de usar o GAC estamos constantemente editando o projeto adicionado nós criamos um script para execução no Build Events do projeto. Se alguem precisar so script pode comentar aqui que eu explico como funciona.

Resposta:equals é diferente de ==

0

Olá Pessoal em resposta aoi post equals é diferente de == a respostá é?!! depende do contexto! No exemplo que postei o segundo caso, usando igual, gera uma exceção durante a comparação pois default(string) é NULL. Nesse caso o resultado é diferente. Eu tive um problema semelhante durante o desenvolvimento e resolvi postar. Então, quem usa object.Equals() tem que ficar esperto.

T4: Acessando o banco de dados

0

Templates T4 são largamente usados para acessar o banco de dados e gerar código de acordo com os objetos(tabelas e etc). Vamos ver como podemos acessar o SQLServer usando templates tt.Antes de ver o código precisamos baixar ums dlls

1-Importar os assemblies

   1: <#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>

   2: <#@ assembly name="Microsoft.SqlServer.Smo" #>

   3: <#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>

   4: <#@ assembly name="Microsoft.SqlServer.SqlEnum" #>

   5: <#@ import namespace="System.IO" #>

   6: <#@ import namespace="Microsoft.SqlServer.Management.Smo" #>

2-Estabelecer a conexão

   1: <#

   2:     Server server = new Server("NomeDaMaquina\\NomeDaInstancia");

   3:     Database database = new Database(server, "NomeDoDatabase");

   4:     database.Refresh();

   5: #>

3- Gerando uma classe para cada tabela do banco

   1: <#

   2:     foreach (Microsoft.SqlServer.Management.Smo.Table item in database.Tables)

   3:     {

   4: #>

   5:     public class <#=item.Name#>{}

   6:     <# SaveOutput(item.Name+".cs");

   7:     }

   8: #>

4- Usamos um método SaveOutput que está em outro tt que foi incluido no início do arquivo

   1: <#@ include file="SaveOutput.tt" #>

5- Código do SaveOutput.tt

   1: <#@ template language="C#" hostspecific="true" #>

   2: <#@ import namespace="System.IO" #>

   3: <#+

   4:   void SaveOutput(string outputFileName)

   5:   {

   6:       string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);

   7:       string outputFilePath = Path.Combine(templateDirectory, outputFileName);

   8:       File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString());

   9:

  10:       this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);

  11:   }

  12: #>

Download do código fonteTemplates T4 podem ser usados para acessar suas bases de dados e gerar código de acordo com metadados ou até dados. Neste exemplo vamos ver como criar um tt capaz de gerar uma classe para cada tabela na base de dados

   1: <#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>

   2: <#@ assembly name="Microsoft.SqlServer.Smo" #>

   3: <#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>

   4: <#@ assembly name="Microsoft.SqlServer.SqlEnum" #>

   5: <#@ import namespace="System.IO" #>

   6: <#@ import namespace="Microsoft.SqlServer.Management.Smo" #>

 

2-Estabelecer a conexão

   1: <#

   2:     Server server = new Server("NomeDaMaquina\\NomeDaInstancia");

   3:     Database database = new Database(server, "NomeDoDatabase");

   4:     database.Refresh();

   5: #>

 

3- Gerando uma classe para cada tabela do banco

   1: <#

   2:     foreach (Microsoft.SqlServer.Management.Smo.Table item in database.Tables)

   3:     {

   4: #>

   5:     public class <#=item.Name#>{}

   6:     <# SaveOutput(item.Name+".cs");

   7:     }

   8: #>

 

4- Usamos um método SaveOutput que está em outro tt que foi incluido no início do arquivo

   1: <#@ include file="SaveOutput.tt" #>

 

5- Código do SaveOutput.tt

   1: <#@ template language="C#" hostspecific="true" #>

   2: <#@ import namespace="System.IO" #>

   3: <#+

   4:   void SaveOutput(string outputFileName)

   5:   {

   6:       string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);

   7:       string outputFilePath = Path.Combine(templateDirectory, outputFileName);

   8:       File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString());

   9: 

  10:       this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);

  11:   }

  12: #>

 

Download do código fonte

Entity Framework 4: CodeOnly e POCO

0

Fala galera, este post é resultado do meu estudo sobre as features do EFv4. A idéia deste post é mostrar o básico do CodeOnly e uso de POCOs no EF, este post foi baseado no exemplo feito pelo time do ADO.NET. Para rodar o código é necessário instalar o CTP2 que pode ser baixado aqui.

1-Inicialmente vamos criar uma solution vazia no visual studio.

2-Adicionar uma projeto(classLibrary) chamado Classes, neste projeto vamos colocar nossos POCOs

3- No projeto Classes adicionar uma classe chamada pessoa com o código abaixo

   1: public class Person

   2:    {

   3:        public int PersonID { get; set; }

   4:        public String Name { get; set; }

   5:        public int Age { get; set; }

   6:        public String Email { get; set; }

   7:    }

4- Agora vamos criar um novo projeto(classLibrary) chamado Model, neste projeto vamos colocar as configurações do EF

5- Vamos adicionar nestr projeto referências para a dll  Microsoft.Data.Entity.ctp e System.Data.Entity

6- Agora vamos adicionar uma classe chamada PersonConfiguration, esta classe será responsável pelo mapeamento do nosso POCO para o banco de dados.

   1: public class PersonConfiguration : EntityConfiguration<Person>

   2: {

   3:     public PersonConfiguration()

   4:     {

   5:         //Estamos indicando que PersoID é Identity

   6:         Property(p => p.PersonID).IsIdentity();

   7:

   8:         //Estamos indicando que o nome é NOT NULL

   9:         Property(p => p.Name).IsRequired();

  10:     }

  11: }

este arquivo vai existir para cada classe POCO do projeto.

7-Vamos criar uma classe chamada Model, esta classe será o nosso DataContext.

   1: public class SimpleCodeOnlyExampleModel : ObjectContext

   2:     {

   3:         public SimpleCodeOnlyExampleModel(EntityConnection entityConnection)

   4:             : base(entityConnection)

   5:         {

   6:             DefaultContainerName = "SimpleCodeOnlyExampleModel";

   7:         }

   8:

   9:         //IObject é uma interface que que possui os métodos necessários para o CRUD

  10:         public IObjectSet<Person> People

  11:         {

  12:             get { return base.CreateObjectSet<Person>(); }

  13:         }

  14:     }

8- Agora vamos criar uma factory para encapsular a criação do DataContext e tudo pronto

   1: public class DataContext

   2: {

   3:

   4:     public static SimpleCodeOnlyExampleModel FactoryDataContext()

   5:     {

   6:         String connection = @"Data Source=.\SQLEXPRESS;Initial Catalog=SimpleCodeOnlyExampleModel;Integrated Security=SSPI;";

   7:         var builder = new ContextBuilder<SimpleCodeOnlyExampleModel>();

   8:

   9:         //Adicionamos todas as configurações

  10:         builder.Configurations.Add(new PersonConfiguration());

  11:         return builder.Create(new SqlConnection(connection));

  12:     }

  13:

  14:     /// <summary>

  15:     /// Este método cria o database de acordo com o mapeamento realizado nas classes

  16:     /// de configuração do POCO

  17:     /// </summary>

  18:     public static void CreateDataBase()

  19:     {

  20:         var ctx = FactoryDataContext();

  21:         if (!ctx.DatabaseExists())

  22:             ctx.CreateDatabase();

  23:     }

  24: }

Tudo pronto! agora vamos ao nosso exemplo. Podemos criar um projeto chamado ConsoleApp(Console Application) para rodar nosso exemplo.

   1: public static void Main()

   2: {

   3:     //este método cria um database

   4:     DataContext.CreateDataBase();

   5:

   6:     //Cadastradando uma pessoa

   7:     Person p = new Person();

   8:     p.Name = "Higor";

   9:     p.Age = 20;

  10:     p.Email = "higor.crr@gmail.com";

  11:     var ctx = DataContext.FactoryDataContext();

  12:

  13:     ctx.People.AddObject(p);

  14:     ctx.SaveChanges();

  15:

  16:     //lendo todas as pessoas

  17:     var people = ctx.People.ToList();

  18:

  19:

  20: }

Após rodar o código podemos observar que um database foi criado no SQLServerExpress e que temos dados e tudo.

Estou achando o trabalho do pessoal muito bom, e vocês? vou abordar questões mais complexas nos próximos posts. Vou adiantar que o proximo assunto será lazyLoading e tipos de dados complexos.

fonte:http://higorcesar.com.br/Download/SimpleCodeOnlySample.rar

Would you like to study at IST-RIO?

0

Hello folks, Today I’ve you good news. If you want to join us and study at IST-Rio you can fill the application form here.

IST-Rio is the technology college of FAETEC. I have been studying at IST-Rio since 2007, I really like this place! There you can breathe science computer, you can join a research project or doing some special classes such as multi-modeling language If you want there are others colleges such as ISERJ.

Resources

http://201.20.19.254/Faetec_2009.2/

http://www.faetec.rj.gov.br/

http://www.faetec.rj.gov.br/ist-rio/app/index.php

http://www.rafaelbiriba.com/2009/06/18/ist-rio-inscricoes-abertas-vestibular-2009-2%C2%BA-semestre.html

Hello world!

1

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!

Problems with Entity Reference in LINQTOSQL

0

Hi fellows, Today I’ll talk about a boring problem that was occurring. The problem is about entity reference properties in entities generated By LINQTOSQL, So look this table for relationship for instance:

When you have a property which is an entity it is called EntityReference(EntityRef), you have to pay attention when you are setting this kind of properties because you can do it in two different s ways, the first way is set the ID property , for example:

employee.DepartmentID = department.DepartmentID;

The other way is setting the entity, for example:

employee.Department = new Department();

So, I have never noticed the strong difference between these codes. I have noticed this difference with some erros when I was submitting changes such as an insert or update.

Insert

when I’m inserting or attaching a new object in a context I can’t set the reference object in the property ‘cause this object can exists in the current context, and how the object that will be attached this properties will too so the DataContext will Attach an entity that already exists. In this case is better set the PropID because there is no chance to attach a existent object.Look this code:

set

{

if ((this._DepartmentID != value))

{

if (this._Department.HasLoadedOrAssignedValue)

{

throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();

}

this.OnDepartmentIDChanging(value);

this.SendPropertyChanging();

this._DepartmentID = value;

this.SendPropertyChanged(“DepartmentID”);

this.OnDepartmentIDChanged();

}

}

Update

Different from insert, when you are updating an object you are submitting changes in one attached object , so how this object is attached this properties are attached to. So in this case you can’t change the a property that defines the entity of an reference object so you can’t change the ID you have to change the entity reference and the set method of a entity reference set the id, look this code:

set

{

Department previousValue = this._Department.Entity;

if (((previousValue != value)

|| (this._Department.HasLoadedOrAssignedValue == false)))

{

this.SendPropertyChanging();

if ((previousValue != null))

{

this._Department.Entity = null;

previousValue.Employees.Remove(this);

}

this._Department.Entity = value;

if ((value != null))

{

value.Employees.Add(this);

this._DepartmentID = value.DepartmentID;

}

else

{

this._DepartmentID = default(int);

}

this.SendPropertyChanged(“Department”);

}

}

I solved my problem using these concepts, So when I am working with an attached entity I set the EntityRef object otherwise set just the ID. I wish it could help you. C ya

Learning about unit test

0

Hi people, today my team began to use automated unit tests. we are using some tools such as selenium, xpathchecker and NUnit. I’ve already said in other post that we’re using selenium to test the web user interface. We are using the selenium IDE, its provides an action recorder that saves clicks and behavior so is very simple generate User interface tests. I’ve looked for information about how to write good unit tests, unfortunately i didn’t find it. I found some things about good practices but I think that just good practices don’t make me write good tests. i will look for more information and any news I tell you.

Go to Top