Postagens

Mostrando postagens de 2011

Resumo: tipos de configuração do TFS 2010

O TFS possui os processos de instalação e configuração bem segregados. No primeiro processo, é possível escolher o que será instalado na máquina. No segundo, podemos escolher quais componentes habilitar, quais instâncias do SQL utilizar, etc. Hoje vamos falar de configuração, e abaixo estão os tipos disponíveis para configuração do TFS. Basic – Permite configurar o TFS para usar o controle de versões, work-items e a parte de testes e lab management. No entanto, não permite a integração com Sharepoint e Reporting Services (cenário, por exemplo, quando instalamos o TFS num sistema operacional cliente, como o Windows 7). Standard – É a configuração que deve ser escolhida ao se instalar o TFS em uma única máquina, mas funciona apenas com Windows Sharepoint Services 3.0. Não permite a escolha de um SQL Server remoto. Advanced – Agora sim, permite usar SQL Server, Sharepoint e Reporting Services remotos. É nela que temos a maior flexibilidade de configura

"The requested resource is in use" e o anti-vírus

Recentemente desenvolvemos uma aplicação que efetua o processamento de alguns arquivos enviados pela Receita Federal. Os arquivos eram lidos linha à linha e a cada conjunto de dados efetuava-se uma validação/processamento, e o resultado era colocado em banco de dados. Estes arquivos são de tamanho variável, chegando até 2 GB. Um problema que foi relatado em ambiente de produção (cluster) é que no processamento de arquivos grandes, de vez em quando aparecia o erro "The requested resource is in use", no meio do processamento do arquivo. Procurando na internet sobre este problema, encontrei uma thread em um fórum de SQL Server onde a pessoa tinha o mesmo problema ( http://www.sqlservercentral.com/Forums/Topic625264-265-1.aspx ), só que com os arquivos MDF do próprio SQL Server. Uma das sugestões dadas era verificar se o anti-vírus não estava mexendo com esses arquivos. Dito e feito, esse era o problema para nós também. Após colocar os arquivos que eram processados na lista de

Dica rápida: debug desabilitado no Visual Studio

Hoje estava trabalhando em um projeto e precisei debuggar uma solução. Só que o debug estava desabilitado, tanto o botão de "triângulo deitado verde" quanto o F5. Achei estranho, mas acabei percebendo o porquê: o projeto que estava ajustado como StartUp Project era do tipo Modeling Project. Foi só mudar isso para um projeto que gera um executável, como um Console Application ou Web, que o debug voltou a ficar disponível. Projetos de banco de dados também fazem o debug ficar indisponível. Óbvio, mas não tão claro... []'s

Pex + TDD

Imagem
Olá, pessoal! Na última edição da .NET Magazine (nº 90), saiu meu artigo falando sobre a ferramenta Pex e seu uso dentro do TDD. O Pex ( http://research.microsoft.com/en-us/projects/pex/ ) é uma ferramenta de geração de código de testes automatizada, ou seja, ela gera as unit tests para você a partir do código-fonte já desenvolvido. Em um primeiro momento não vemos como isso pode se relacionar com TDD, já que a idéia desta técnica é escrever testes antes do código do programa que estamos desenvolvendo. Realmente ferramentas como o Pex não têm utilidade neste cenário quando utilizado o conceito de testes baseado em exemplos. Testes baseados em exemplos são aqueles nos quais nós temos uma entrada de dados e um resultado conhecido, e testamos o nosso código para garantir que o processamento produza a saída esperada. Para fazer sentido o uso de ferramentas de geração de testes automatizada, precisamos de um conceito de testes de unidade diferente. Precisamos pensar nossos testes co

Como fazer undo-checkout em arquivos de um outro usuário

Hoje tivemos que remover os arquivos que estavam em checkout para uma das pessoas que trabalham com a gente. Só que o detalhe é que a máquina que essa pessoa usou para fazer o checkout, e consequentemente as informações que ficam no workspace , não estavam mais disponíveis (a máquina foi trocada, e a antiga sabe-se lá onde está). Então, como desfazer os checkouts existentes? A maneira que encontramos foi, utilizando um usuário administrador dentro do team project, fazer a remoção do checkout através de linha de comando (tf.exe). Primeiramente, buscamos o nome do workspace que estava associado ao usuario, através do comando abaixo. Retornaram duas ocorrências, que são a máquina antiga e a máquina nova. Essa informação será importante depois. C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE>tf workspaces /owner:acroberto Collection: tfs.intra.cliente.com.br\TPC Workspace     Owner     Computer      Comment ------------- --------- ------------- ----------

Pérola: como dificultar o tratamento de erro de aplicações

Vamos dar uma olhada no método abaixo, que foi pego de uma situação real (mudei os nomes de variáveis para evitar que reclamem que o coloquei aqui). Nesta aplicação, há uma necessidade de sincronizar dados de usuários, buscando dados do sistema A e atualizando no sistema B. public static void AtualizarUsuarios() { try { using (BatchFacade batchFacade = new BatchFacade()) { List<Usuario> usuariosSistemaA = batchFacade.ListarUsuariosSistemaA().GetRegistros<List<Usuario>>(); List<Usuario> usuariosSistemaB = batchFacade.ListarUsuariosSistemaB().GetRegistros<List<Usuario>>(); foreach (Usuario usuarioA in usuariosSistemaB) { Usuario usuarioB = usuariosSistemaA.Find(delegate(Usuario u) { return u.SIAP.Equals(usuarioA.Codigo.ToString()); }); if (usuarioB != null && UsuarioModificado(usuarioA, ref

Limitações ao se trabalhar com o TFS 2010

Imagem
Ao se trabalhar com o TFS, existem algumas limitações que devem ser levadas em consideração na hora de criar team projects ou work items. É importante conhecer isso para não ter problemas na hora de decidir como estruturar seus projetos (Nenhuma limitação listada é impeditiva para se trabalhar com o TFS, é só se preparar e evitar as situações que elas possam ocorrer ou serem necessárias). Obs. Esta lista foi retirada do livro Professional Team Foundation Server 2010 (Wrox Programmer to Programmer) . []’s Renomear um Team Project Após a criação de um team project (repositório de código-fonte, atividades do projeto, etc.) não é possível renomeá-lo. Uma vez escolhido o nome, será este para sempre, então tome cuidado ao escolher. Caso contrário, se realmente você quiser “renomear”, terá que criar um novo team project e migrar todo o conteúdo do anterior… Mover work items entre Team Projects e Team Project Collections Não é possível mover work items entre team projects diferentes, visto q

Uso de static em OOP: escolhendo a arma correta

Imagem
Já vi sistemas desenvolvidos em linguagens orientadas a objetos em que todos os métodos das classes eram estáticos. Uma vez perguntei para uma pessoa o motivo dela estar programando dessa maneira. Ela não soube me responder. Bom, por que não devemos colocar static em todos os métodos? Para mim, a melhor resposta é comparar o uso de métodos static com o uso de baionetas. Antes do uso da pólvora, as guerras eram travadas geralmente em combate corpo-à-corpo, com o uso de objetos cortantes como espadas ou machados. No final do século XVIII, na França, começaram a ser produzidas as primeiras baionetas. Baioneta é uma arma branca de curto alcance que pode ser presa na ponta de um fuzil. Dessa maneira, em situações especiais como combate próximo (trincheiras) ou simplesmente falta de munição, os soldados possam utilizar suas armas de fogo como lanças. Mas é claro que atualmente, na maioria das situações, é preferível utilizar fuzis com o objetivo que eles foram criados: disparar pro

Pérola: como remover caracteres de uma string

Encontrei este código no qual o desenvolvedor queria remover os pontos, traços e barras de um CNPJ formatado (de "12.345.678/0001-00" para "12345678000100"): string estab = string.Empty; char[] delimitadores = new char[] { '.', '/', '-' }; string[] partes = lblCNPJEstabelecimento.Text.Split(delimitadores, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < partes.Length; i++) estab = estab + partes[i]; }  Bizarro... Para remover uma única ocorrência, o método Replace é indicado: http://msdn.microsoft.com/en-us/library/fk49wtc1.aspx Outra alternativa é utilizar regular expressions: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace%28v=VS.100%29.aspx O link abaixo possui um extension method para remover vários caracteres: http://www.csharptricks.com/blog/2006/10/remove-characters-from-string-cnet.html Mantenham o código simples e limpo... []'s

Nota rápida: Concatenando valores com caractere de separação em C#

Abaixo está um exemplo rápido de como concatenar um array de strings em uma única string, separando esses valores por um caractere. [TestMethod] public void TestarConcatenacao01() { var arr = new[] { "s1", "s2" }; var s = string.Join(";", arr); Assert.AreEqual("s1;s2", s); } [TestMethod] public void TestarConcatenacao02() { var arr = new string[] { }; var s = string.Join(";", arr); Assert.AreEqual(string.Empty, s); } [TestMethod] public void TestarConcatenacao03() { var arr = new[] { "s1" }; var s = string.Join(";", arr); Assert.AreEqual("s1", s); }  string.Join substituí com uma linha um código que acabei de ver, onde eram feitos um foreach e vários condicionais para conseguir o mesmo objetivo (umas 5 linhas, no mínimo). []'s

Regras para siglas

Eu tinha o costume de colocar um 's no final de siglas, como CPF ou CNPJ, para indicar plural (ex.: "As ONG's têm feito um trabalho excelente na região Nordeste."). ERRADO!!! A regra gramatical para plural de siglas, quando a concordância permitir, é simplesmente acrescentar a letra "s", sem o apóstrofo. Ou seja, a frase acima fica "As ONGs têm feito um trabalho excelente na região Nordeste.". É importante para quem trabalha com exatas não descuidar do conhecimento de lingua portuguesa, pois já dizia Chacrinha: " Quem não se comunica , se trumbica ". Comunicação é tudo, e é sempre bom fazer as coisas da maneira correta. Este link tem mais informações sobre o uso correto de siglas na língua portuguesa: http://www.soportugues.com.br/secoes/abrev/abrev9.php . []'s

Membros ThreadStatic e ASP.NET thread switching: cuidados ao usar

Imagem
Tudo começou com uma dúvida referente como a classe TransactionScope mantém referência à um objeto de transação durante todo o seu escopo de atuação, mesmo quando são feitas chamadas à outros métodos sem a passagem explícita desse objeto de transação como um parâmetro desse método, por exemplo. Olhando o código-fonte do TransactionScope através de ferramentas de disassembler, como o Redgate .NET Reflector ou Telerik JustDecompile (como eu amo esses aplicativos!), percebi que o contexto de transação é armazenado em um membro decorado com o atributo ThreadStatic , ou seja, é praticamente uma "variável global" esclusiva de uma thread, que não pode ser acessada por outra thread. O problema ocorre quando trabalhamos no ASP.NET. Durante o processamento de uma página em ASP.NET, pode (leia-se: "pode", não que ocorrerá sempre!) uma mudança da thread atual (thread switching). Então, uma página que começa a ser processada pela thread 1 pode terminar com a thread 2! Que

Conversões e desconversões

Mais uma pérola que pode ser relacionada com meu outro post Vícios de linguagem de programação : return (Int32.Parse(diff.Days.ToString()) < Int32.Parse(configuracao.Parametro.ToString())); Primeiro detalhe: a variável diff é do tipo TimeSpan, e a sua propriedade Days já é um inteiro. Por que motivo ela é transformada numa string para depois fazer um novo parse para inteiro? Segundo detalhe: a propriedade Parametro da variável configuracao já é uma string. Não há necessidade de chamar o método ToString(). Tem coisa que dá medo...

"".GetType() vs. typeof(string)

No ASP.NET Webforms é possível incluir um javascript para ser renderizado na tela através do método RegisterStartupScript a partir da propriedade ClientScript do objeto Page . Este método então irá, na hora de "cuspir" o HTML, incluir o script de forma com que ele seja executado assim que a página seja carregada no browser. Os dois primeiros parâmetros são um Type e uma string, representando um tipo qualquer e uma chave que são usados para identificar exclusivamente um script, de forma a identificar a duplicidade. Para o primeiro parâmetro, podemos passar o próprio tipo da página onde este script será usado. Mais detalhes em http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx . Bom, no exemplo abaixo, acabou-se usando o tipo como a própria string. Até aí "tudo bem", não vou discutir qual seria o valor correto para passar para este método, mas o que eu fiquei "besta" foi da ocorrência de "".GetType() , de forma a obter uma instância de Type

Vícios de linguagem de programação

Você conhece as expressões “acabamento final”, “elo de ligação”, “subir para cima”, “metades iguais”, “protagonista principal”, entre outras? É o chamado pleonasmo , uma redundância em uma expressão que pode ser uma figura de linguagem (ou seja, o autor quer enfatizar alguma coisa ou ser irônico) ou um vício de linguagem. Mas se temos um pleonasmo em um código-fonte, dificilmente isso foi feito propositalmente. Vamos ver um exemplo “clássico” disso. Vejam o código abaixo. var lista = new List<string>(); // preenche a lista...ou não bool existencia = lista.Count > 0; if (existencia == true) { // faz alguma coisa... } Veja o conteúdo do condicional: existencia == true . Mas o tipo da variável existencia já não é um bool? E no final das contas, um resultado do tipo bool não é o que define a expressão que fica no condicional if ? Sendo assim, o código poderia ser reescrito simplesmente como: var lista = new List<string>(); // preenche a lista...ou não bool existencia = lis

Considerações sobre frameworks corporativos

Imagem
Um dos objetivos mais desejados pelos gerentes no desafio de desenvolver sistemas é a reutilização de componentes com a finalidade de economizar trabalho e tempo (ou seja, dinheiro). Com essa idéia na cabeça e uma boa dose de boa vontade, os desenvolvedores e arquitetos procuram criar ferramentas e componentes que possam ser compartilhados dentro da corporação (frameworks técnicos). Em muitos casos, apesar do esforço, esse objetivo não é alcançado, e acabamos citando o ditado “de boas intenções o inferno está cheio”… Não estou dizendo que a reutilização é um conceito ruim, ao contrário, é claro para a indústria de software prova a necessidade e importancia dela a cada dia. No entanto, gostaria de compartilhar as minhas experiências em relação à esse assunto para ajudar a evitar as armadilhas que aparecem quando decidimos criar um framework corporativo. Trabalhei bastante tempo criando e mantendo esse tipo de software, e acho que tenho algumas boas histórias… Separei três principais

Artigo de Moles - .NET Magazine 87

Imagem
Pessoal, esse mês saiu a .NET Magazine edição 87 contendo um artigo meu sobre o Moles. O Moles é uma ferramenta de apoio de testes feita pela Microsoft que permite a criação de objetos dublês como stubs, além de permitir que qualquer método em .NET (inclusive os do próprio CLR) sejam interceptados e substituídos por um método escrito por você! Isso quer dizer que você pode fazer com que o DateTime.Now retorne sempre uma data fixa. Para que isso é importante? Para poder testar métodos isolando as duas dependências. O artigo explica os conceitos dessa ferramenta e como utilizá-la para que você escreva testes de unidade de forma mais eficiente. O artigo online está em http://www.devmedia.com.br/post-21606-Introducao-ao-framework-de-testes-Microsoft-Moles.html , e a revista está na banca mais próxima da sua casa. []’s e boa leitura

Executar procedure no Oracle que retorne dados como um cursor do tipo OUT

Nota rápida: no Oracle, stored procedures que retornam dados de tabelas (result sets) vem na forma de cursores (diferente do SQL Server que vem direto). Para poder ver o resultado da execução de uma procedure de SELECT no Oracle, usa-se o comando abaixo:     var refCur REFCURSOR;     execute NOME_PACKAGE.NOME_PROCEDURE(283, 3507, :refCur);     print :refCur; Sendo que a nossa procedure de exemplo tem três parâmetros: dois inteiros e um cursor do tipo OUT (abaixo está o detalhamento da sua declaração):     PROCEDURE NOME_PROCEDURE(pID_X IN TB_ABC.ID_X%TYPE,                                           pID_Y IN TB_XYZ.ID_Y%TYPE,                                           pCURSOR_SAIDA OUT CURSOR_SAIDA); []'s

Procedures no Santander

Imagem
Galera do noSQL, uma certeza eu tenho, o banco Santander usa stored procedures no seu bankline... Alguém precisa falar para eles da boa prática de segurança que é não mostrar detalhes de erros para os usuários. Principalmente em sistemas expostos na Internet e que cuidam do dinheiro dos outros...

Testando métodos privados

Me deparei com uma thread interessante sobre unit test no StackOverflow (melhor site para postar dúvidas na minha opinião): A dúvida era como testar unitariamente métodos privados. Destaco duas respostas técnicas: utilizar o atributo InternalsVisibleToAttribute ( http://devlicio.us/blogs/derik_whittaker/archive/2007/04/09/internalsvisibleto-testing-internal-methods-in-net-2-0.aspx) , que faz com que tipos fiquem visíveis para unit tests, mas que acabam deixando "rastros" nos assemblies quando compilados mesmo em modo Release; utilizar AccessPrivateWrapper ( http://www.amazedsaint.com/2010/05/accessprivatewrapper-c-40-dynamic.html ), que encapsula o acesso a métodos privados através do dynamic do C# 4.0. Mas a melhor resposta, na minha opinião, não é nenhuma dessas e sim uma conceitual: métodos privados não deveriam ser alvo de testes unitários. Sugiro dar uma olhada no fórum: http://stackoverflow.com/questions/250692/how-do-you-unit-test-private-methods []'s

Configurando conexão com Oracle através de TNS - básico

Havia trabalhado com Oracle alguns anos atrás, e pra mim esse SGBD tem muita coisa desconhecida... Precisei pegar um projeto onde que usa esse banco de dados. Meu primeiro "desafio" foi entender como fazer para configurar o client do Oracle para poder conectar a aplicação ASP.NET na base de dados. Isso deve ser o básico do básico para quem trabalha com Oracle, mas como pra mim é novidade, decidi deixar isso documentado no blog já que a idéia original dele é ser uma knowledge base pessoal (apesar que eu admito, não sou tão frequente com os posts como eu gostaria de ser). Bom, em primeiro lugar, eu precisei baixar os componentes client do Oracle. Isso eu fiz baixando os componentes do Instant Client e os colocando na pasta C:\oracle\instantclient_10_2\ (o link de onde baixei está logo abaixo). Esse Instant Client é um conjunto de componentes que permite a execução de aplicações que consomem bases Oracle sem a necessidade de fazer a instalação completa do cliente, através de s

O pior é impossível?–parte 4

Imagem
Esse é o maior encadeamento de IF’s que eu já vi em vida…, parece um ASCII art. Detalhe que até agora eu não consegui ententer o que o cara quis fazer…, mas acho que também não vale muito a pena. Este post foi um oferecimento da AntiIfCampaign:

Webcamps em São Paulo

Imagem
Nesta última sexta-feira, tive a oportunidade de participar do Webcamps , um evento itinerante da Microsoft que passou por Sâo Paulo, no Senac de Santo Amaro. Tivemos apresentações de Phil Haack , do time do ASP.NET MVC, e Drew Robbins , evangelista técnico. Neste dia, foram as apresentações técnicas, e hoje sábado, que infelizmente não pude participar, foram sessões práticas. Nas apresentações de sexta, ouvimos os dois convidados conversando sobre fundamentos e tópicos avançados do ASP.NET MVC, Entity Framework e Nuget (falarei mais a respeito logo). Apesar de algumas coisas abordadas nas palestras terem sido o básico dessa tecnologia, é uma oportunidade ímpar ouvir das pessoas que trabalhar diretamente na sua criação. As apresentações de Phil foram muito boas, mas eu achei que o Drew deixou a desejar em algumas partes, pois parecia que ele estava perdido em determinados momentos… Além deles, Murilo Maciel Curti apresentou features do IE9 + HTML 5 bem interessantes. Um dos link

jQuery Templates e combos preenchidas

Imagem
Estou usando o plugin de template do jQuery em uma tela de um sistema que estou construindo, e encontrei o seuginte problema, que mostro no exemplo abaixo. Vamos supor que temos uma página que contém uma tabela usada para edição de informações. Lista de cidades e estados, por exemplo. Nesta listagem, conforme vamos precisando de novas linhas, vamos incluindo informando o nome da cidade e selecionando o estado na combo. Abaixo está o código que faz essa inclusão: <!DOCTYPE html> <html> <head>     <script src=" http://code.jquery.com/jquery-latest.min.js" ></script>     <script src=" http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js" ></script> </head> <body>     <script id="templateLinha" type="text/x-jquery-tmpl">     <tr>         <td>             <input type="text" value="${Cidade}" />         </td>         <