<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5409857123971232912</id><updated>2012-01-18T08:28:16.305-08:00</updated><category term='AOP'/><category term='Visual Studio'/><category term='InstallShield'/><category term='jQuery'/><category term='Rational Clear Case'/><category term='Pérolas do Desenvolvimento'/><category term='Installer'/><category term='Source Control'/><category term='Office'/><category term='TFS'/><category term='UnitTest'/><category term='Roger Waters'/><category term='Configuration Manager'/><category term='Pex'/><category term='MSI'/><category term='Português'/><category term='Oracle'/><category term='IIS'/><category term='ASP.NET MVC'/><category term='Moles'/><category term='ASP.NET'/><category term='C#'/><category term='COMAdmin'/><category term='Pink Floyd'/><category term='VSTO'/><category term='anti-vírus'/><category term='TDD'/><category term='Arquitetura'/><category term='WIA'/><category term='Windows Installer'/><category term='OOP'/><category term='COM+'/><category term='Eventos'/><category term='add-in'/><category term='Rock'/><category term='Nuget'/><category term='SGEN'/><category term='Krav-Magá'/><category term='resiliency'/><category term='Design Patterns'/><category term='.NET'/><category term='Windows 7'/><title type='text'>The world before the fall...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>78</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8602473214620216059</id><published>2012-01-09T17:22:00.001-08:00</published><updated>2012-01-09T17:22:29.036-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Impressões da 70-512</title><content type='html'>&lt;p align="justify"&gt;No final do ano passado (alias, feliz 2012 para todos!) eu fiz a prova de certificação da Microsoft 70-512, de administração do TFS. Felizmente ocorreu tudo ok, e eu passei! E agora vou colocar neste espaço aqui alguns comentários e impressões que eu tive dela, para servir de dica para que irá fazê-la em breve.&lt;/p&gt;  &lt;p align="justify"&gt;Bom, em primeiro lugar, eu vou passar como eu me preparei para a prova:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Antes mesmo de pensar em fazer essa prova, eu tive oportunidade de assistir um treinamento de ALM com meu amigo &lt;a href="http://twitter.com/vcavalcante"&gt;Victor Cavalcante&lt;/a&gt;. Boa parte do conteúdo deste treinamento caiu na prova. Se tiverem oportunidade, procurem algum treinamento com pessoal capacitado como ele.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Já quando eu estava com a idéia de fazer a prova (meta da empresa), eu encontrei o livro &lt;a href="http://www.amazon.com/Professional-Team-Foundation-Server-Programmer/dp/0470943327"&gt;Professional Team Foundation Server 2010&lt;/a&gt;. É um bom livro, apesar que eu achei que algumas partes deixaram a desejar, como a parte de Lab Management e configuração de servidores Proxy do TFS. Mas a visão geral da parte de instalação e configuração e uso de branchs compensa. No final, o livro é um bom material para estudo dessa prova.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Encontrei também alguns links com material online para estudo, como este aqui &lt;a href="http://dfaoliveira.wordpress.com/2010/10/08/exame-70-512/"&gt;http://dfaoliveira.wordpress.com/2010/10/08/exame-70-512/&lt;/a&gt; do Daniel Oliveira. Tem bastante links interessantes.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Baixei a máquina virtual que a Microsoft disponibiliza para testes, pois com ela tive um ambiente já pronto para brincar um pouco: &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=22267"&gt;http://www.microsoft.com/download/en/details.aspx?id=22267&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Basicamente a estratégia de estudo que eu segui foi essa. Agora vou comentar um pouco da prova.&lt;/p&gt;  &lt;p align="justify"&gt;A 70-512 é uma prova bem conceitual, você não precisa saber detalhes da administração para fazê-la. Por exemplo, lembro de uma questão onde era dado um cenário onde se devia tirar um team project de uma team project collection e passar para outro. A solução neste caso seria fazer um split (&lt;a href="http://msdn.microsoft.com/en-us/library/dd936158.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd936158.aspx&lt;/a&gt;), e bastava saber esse conceito para ter a resposta. Não precisava saber dos detalhes que tem nesse último link que passei, apenas uma visão geral.&lt;/p&gt;  &lt;p align="justify"&gt;Outra coisa que pega bastante a parte conceitual da coisa são as questões que envolvem instalação e configuração. São várias onde é dado um cenário (a pessoa instalando um TFS em várias máquinas, fazendo upgrade, etc) e é questionado quais opções de configuração escolher. Isso foi um assunto que eu bloguei alguns dias antes da prova (&lt;a href="http://www.galorebr.blogspot.com/2011/12/resumo-tipos-de-configuracao-do-tfs.html"&gt;http://www.galorebr.blogspot.com/2011/12/resumo-tipos-de-configuracao-do-tfs.html&lt;/a&gt;). Pré-requisitos de servidores, como o uso do WSS 3.0 para integração mínima com Sharepoint, também são cobrados.&lt;/p&gt;  &lt;p align="justify"&gt;Caiu uma questão de restauração de desastres relacioada ao Reporting Services, mais especificamente sobre a necessidade de fazermos um backup da symmetric key. Mas em geral as questões ficam com foco mesmo no TFS, não na configuração da infra necessária.&lt;/p&gt;  &lt;p align="justify"&gt;Outro tipo de questão que cai bastante é relacionado ao uso de branch e merge. Geralmente a questão vai envolver a escolha da alternativa que mostra como disponibilizar certas alterações de código feita em uma branch em uma outra branch, sem o uso de um baseless merge (&lt;a href="http://msdn.microsoft.com/en-us/library/bb668976.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb668976.aspx&lt;/a&gt;). Basicamente escolha a questão que explique um caminho de “merges” desde a branch de origem até a de destino.&lt;/p&gt;  &lt;p align="justify"&gt;Sugiro também dar uma “decorada” nas opções disponíveis quando enfileiramos um build, por exemplo para ativar a execução de testes, impacto dos testes ou Code Analysis. Caem também alguns comandos (lembro de uma questão relacionada ao “tf /lock”). Ah, também foram cobrados conceitos de shelveset e cloak, sendo que a questão dá um cenário por exemplo desenvolvedor querendo que alterações ainda não finalizadas ficassem no backup do TFS ou evitar que arquivos desnecessários sejam baixados na máquina durante o processo de get latest version.&lt;/p&gt;  &lt;p align="justify"&gt;Por enquanto ficam essas dicas, mas se eu lembrar de mais coisas eu atualizo este post.&lt;/p&gt;  &lt;p align="justify"&gt;Boa sorte para todos que forem fazer essa prova.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8602473214620216059?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8602473214620216059/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8602473214620216059&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8602473214620216059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8602473214620216059'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2012/01/impressoes-da-70-512.html' title='Impressões da 70-512'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8384898509401137351</id><published>2011-12-25T13:11:00.001-08:00</published><updated>2011-12-25T13:11:47.857-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Resumo: tipos de configuração do TFS 2010</title><content type='html'>&lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Basic&lt;/strong&gt; – 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).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Standard&lt;/strong&gt; – É 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.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Advanced&lt;/strong&gt; – Agora sim, permite usar SQL Server, Sharepoint e Reporting Services remotos. É nela que temos a maior flexibilidade de configuração.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Application-Tier Only&lt;/strong&gt; – É usada na configuração de ambientes com alta disponibilidade (adicionando servidores em um Network Load Balance, por exemplo). Também pode ser usada em cenários em que se move a camada de aplicação do TFS para outra máquina ou em situações de recuperação de desastres.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Upgrade&lt;/strong&gt; – Como o nome diz, deve ser utilizado em situações de upgrade do TFS 2005 ou 2008.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Configure Team Foundation Server Proxy&lt;/strong&gt; – Para quando instalamos o TFS Proxy Server. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Configure Team Foundation Build Service&lt;/strong&gt; – Para quando a máquina onde instalamos o TFS servirá como Build Agent ou Controller. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;Configure Extensions for SharePoint Products&lt;/strong&gt; – Configura extensões no Sharepoint para que o TFS possa utilizar (em situações de Sharepoint remoto ou web farm). &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;O quadro abaixo dá um resumo por cima das 4 primeiras configurações, mostrando suas principais diferenças.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="518"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="93"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="98"&gt;&lt;strong&gt;Basic&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="83"&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="98"&gt;&lt;strong&gt;Advance&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="144"&gt;&lt;strong&gt;Application-Tier only&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="98"&gt;&lt;strong&gt;Instâncias&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Multiple-server&lt;/td&gt;        &lt;td valign="top" width="83"&gt;Single-server&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Multiple-server&lt;/td&gt;        &lt;td valign="top" width="144"&gt;Multiple-server&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="101"&gt;&lt;strong&gt;Reporting&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Não&lt;/td&gt;        &lt;td valign="top" width="83"&gt;Sim&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Sim&lt;/td&gt;        &lt;td valign="top" width="144"&gt;Sim&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="102"&gt;&lt;strong&gt;Sharepoint Integration&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Não&lt;/td&gt;        &lt;td valign="top" width="83"&gt;Sim&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Sim&lt;/td&gt;        &lt;td valign="top" width="144"&gt;Sim&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="103"&gt;&lt;strong&gt;SQL em outra máquina&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Sim&lt;/td&gt;        &lt;td valign="top" width="83"&gt;Não&lt;/td&gt;        &lt;td valign="top" width="98"&gt;Sim&lt;/td&gt;        &lt;td valign="top" width="144"&gt;Sim&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p align="justify"&gt;Se pensarmos num ambiente corporativo com muito uso do TFS (servidores segregados, ou seja, dados, aplicação, Sharepoint e Reporting Services tudo sepadados), basicamente iremos utilizar a configuração Advanced para configurar o primeiro servidor de aplicação (considerando escolher e configurar o SQL Server, Sharepoint, etc.) e depois a configuração Application-Tier only, para configurar os diversos nós do load balance.&lt;/p&gt;  &lt;p align="justify"&gt;Por hoje é só.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8384898509401137351?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8384898509401137351/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8384898509401137351&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8384898509401137351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8384898509401137351'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/12/resumo-tipos-de-configuracao-do-tfs.html' title='Resumo: tipos de configuração do TFS 2010'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-644021553706201718</id><published>2011-12-15T05:36:00.000-08:00</published><updated>2011-12-25T13:19:58.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='anti-vírus'/><title type='text'>"The requested resource is in use" e o anti-vírus</title><content type='html'>&lt;div style="text-align: justify;"&gt;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.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;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.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Procurando na internet sobre este problema, encontrei uma thread em um fórum de SQL Server onde a pessoa tinha o mesmo problema (&lt;span style="font-family: Arial;"&gt;&lt;a href="http://www.sqlservercentral.com/Forums/Topic625264-265-1.aspx" target="_blank"&gt;http://www.sqlservercentral.com/Forums/Topic625264-265-1.aspx&lt;/a&gt;&lt;/span&gt;), 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.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Dito e feito, esse era o problema para nós também. Após colocar os arquivos que eram processados na lista de exclusão do anti-vírus, o problema não voltou a ocorrer. Existe um KB da Microsoft que sugere alguns cuidados ao utilizar anti-vírus em clusters: &lt;span style="font-family: Arial;"&gt;&lt;a href="http://support.microsoft.com/kb/250355/en-us" target="_blank"&gt;http://support.microsoft.com/kb/250355/en-us&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial; font-size: x-small;"&gt;[]'s &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-644021553706201718?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/644021553706201718/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=644021553706201718&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/644021553706201718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/644021553706201718'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/12/requested-resource-is-in-use-e-o-anti.html' title='&quot;The requested resource is in use&quot; e o anti-vírus'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7758560535665570064</id><published>2011-11-23T05:03:00.000-08:00</published><updated>2011-11-23T05:03:57.343-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Configuration Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Dica rápida: debug desabilitado no Visual Studio</title><content type='html'>&lt;div style="text-align: justify;"&gt;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.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Projetos de banco de dados também fazem o debug ficar indisponível.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Óbvio, mas não tão claro...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7758560535665570064?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7758560535665570064/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7758560535665570064&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7758560535665570064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7758560535665570064'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/11/dica-rapida-debug-desabilitado-no.html' title='Dica rápida: debug desabilitado no Visual Studio'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7655450504243556667</id><published>2011-11-02T17:16:00.001-07:00</published><updated>2011-11-02T17:17:53.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Moles'/><category scheme='http://www.blogger.com/atom/ns#' term='Pex'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Pex + TDD</title><content type='html'>  &lt;p align="justify"&gt;Olá, pessoal!&lt;/p&gt;  &lt;p align="justify"&gt;Na última edição da .NET Magazine (nº 90), saiu meu artigo falando sobre a ferramenta Pex e seu uso dentro do TDD.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/-rAkN8sEaj4M/TrHdapNs4AI/AAAAAAAABDw/phF8j48y_pE/s1600-h/image%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://lh4.ggpht.com/-3e1aDwsZVoU/TrHdbIJiQsI/AAAAAAAABD4/6db3MCgMn5c/image_thumb.png?imgmax=800" width="129" height="174" /&gt;&lt;/a&gt;O Pex (&lt;a title="http://research.microsoft.com/en-us/projects/pex/" href="http://research.microsoft.com/en-us/projects/pex/"&gt;http://research.microsoft.com/en-us/projects/pex/&lt;/a&gt;) é 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.&lt;/p&gt;  &lt;p align="justify"&gt;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 como teorias.&lt;/p&gt;  &lt;p align="justify"&gt;Podemos considerar que uma teoria é falsa se encontrarmos alguma condição que a invalide. Por exemplo, se tivermos uma teoria que “a cor dos olhos de uma pessoa é sempre igual para ambos os olhos”, basta que encontremos uma pessoa com &lt;a href="http://pt.wikipedia.org/wiki/Heterocromia"&gt;heterocromia&lt;/a&gt; para rejeitarmos a idéia. É baseado neste conceito que o Pex pode ser utilizado numa abordagem TDD. Ao criarmos um teste de unidade parametrizável (ou seja, que receba dados de entrada), o Pex pode explorar o código em busca de situações de entrada que façam nosso programa falhar (encontrar furos no código que levem a bugs), e assim podemos refatorá-lo (da maneira que o TDD dita).&lt;/p&gt;  &lt;p align="justify"&gt;É claro que no artigo (&lt;a title="http://www.devmedia.com.br/post-22581-Geracao-automatica-de-testes-numa-abordagem-TDD.html" href="http://www.devmedia.com.br/post-22581-Geracao-automatica-de-testes-numa-abordagem-TDD.html"&gt;http://www.devmedia.com.br/post-22581-Geracao-automatica-de-testes-numa-abordagem-TDD.html&lt;/a&gt;) eu explico isso melhor e com mais detalhes, não vou fazê-lo aqui para que os editores da revista fiquem bravos comigo, rs. Mas segue um link onde essa idéia de testes com teorias é explorado: &lt;a title="http://shareandenjoy.saff.net/tdd-specifications.pdf" href="http://shareandenjoy.saff.net/tdd-specifications.pdf"&gt;http://shareandenjoy.saff.net/tdd-specifications.pdf&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s e até a próxima!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7655450504243556667?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7655450504243556667/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7655450504243556667&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7655450504243556667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7655450504243556667'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/11/pex-tdd.html' title='Pex + TDD'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-3e1aDwsZVoU/TrHdbIJiQsI/AAAAAAAABD4/6db3MCgMn5c/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1876739223015378651</id><published>2011-10-26T15:44:00.001-07:00</published><updated>2011-10-26T15:44:09.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Como fazer undo-checkout em arquivos de um outro usuário</title><content type='html'>&lt;p align="justify"&gt;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 &lt;a href="http://www.woodwardweb.com/teamprise/000333.html"&gt;workspace&lt;/a&gt;, não estavam mais disponíveis (a máquina foi trocada, e a antiga sabe-se lá onde está).&lt;/p&gt;  &lt;p align="justify"&gt;Então, como desfazer os checkouts existentes?&lt;/p&gt;  &lt;p align="justify"&gt;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).&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE&amp;gt;tf workspaces /owner:acroberto      &lt;br /&gt;Collection: tfs.intra.cliente.com.br\TPC       &lt;br /&gt;Workspace&amp;#160;&amp;#160;&amp;#160;&amp;#160; Owner&amp;#160;&amp;#160;&amp;#160;&amp;#160; Computer&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Comment       &lt;br /&gt;------------- --------- ------------- -----------------------------------------       &lt;br /&gt;ESTACAO18&amp;#160;&amp;#160;&amp;#160;&amp;#160; acroberto ESTACAO18       &lt;br /&gt;ESTACAO19&amp;#160;&amp;#160;&amp;#160;&amp;#160; acroberto ESTACAO19&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Em seguida, fizemos uma listagem dos arquivos que estavam em checkout no team project (chamamos de SISTEMA). Veja que jogamos o resultado da consulta em um arquivo texto dentro do c:\.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE&amp;gt;tf status $/SISTEMA /recursive /user:* /server:tfs.intra.cliente.com.br\TPC &amp;gt;&amp;gt; c:\tf.log      &lt;br /&gt;Ignoring the /server option.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Agora vem o comando importante. Usando o nome do workspace + login do usuário + diretório base a partir de onde os arquivos com checkin se encontravam, executamos o comando &lt;em&gt;tf undo&lt;/em&gt;. Note o uso do parâmetro &lt;em&gt;/recursive&lt;/em&gt;, que faz com que seja feita a busca em todas as subpastas do diretório inicial.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE&amp;gt;tf undo /workspace:ESTACAO18;acroberto $/SISTEMA/CLIENTE-SISTEMA-interno /recursive&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pronto, os arquivos foram liberados, efetuando o undo-checkout. Para conferir, rodei novamente o comando &lt;em&gt;tf status&lt;/em&gt;, para pegar todos os arquivos em checkout. Só sobrou um que eu mesmo estava trabalhando.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE&amp;gt;tf status $/SISTEMA /recursive /user:* /server:tfs.intra.cliente.com.br\TPC      &lt;br /&gt;Ignoring the /server option.       &lt;br /&gt;File name&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Change User&amp;#160;&amp;#160;&amp;#160; Local path       &lt;br /&gt;----------------- ------ ------- ----------------------------------------------       &lt;br /&gt;$/SISTEMA/CLIENTE-SISTEMA-interno/CLIENTE.SISTEMA.Batch       &lt;br /&gt;AtualizarDados.cs ! edit falgouw C:\Documents and Settings\FALGOUW\My Documents\Projetos\SISTEMA\CLIENTE-SISTEMA-interno\CLIENTE.SISTEMA.Batch\AtualizarDados.cs       &lt;br /&gt;1 change(s)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1876739223015378651?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1876739223015378651/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1876739223015378651&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1876739223015378651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1876739223015378651'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/10/como-fazer-undo-checkout-em-arquivos-de.html' title='Como fazer undo-checkout em arquivos de um outro usuário'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7219151831763890967</id><published>2011-10-26T11:11:00.000-07:00</published><updated>2011-10-26T11:14:45.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>Pérola: como dificultar o tratamento de erro de aplicações</title><content type='html'>&lt;div style="text-align: justify;"&gt;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.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;public static void AtualizarUsuarios()&lt;br /&gt;{&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        using (BatchFacade batchFacade = new BatchFacade())&lt;br /&gt;        {&lt;br /&gt;            List&amp;lt;Usuario&amp;gt; usuariosSistemaA = batchFacade.ListarUsuariosSistemaA().GetRegistros&amp;lt;List&amp;lt;Usuario&amp;gt;&amp;gt;();&lt;br /&gt;            List&amp;lt;Usuario&amp;gt; usuariosSistemaB = batchFacade.ListarUsuariosSistemaB().GetRegistros&amp;lt;List&amp;lt;Usuario&amp;gt;&amp;gt;();&lt;br /&gt;            foreach (Usuario usuarioA in usuariosSistemaB)&lt;br /&gt;            {&lt;br /&gt;                Usuario usuarioB = usuariosSistemaA.Find(delegate(Usuario u)&lt;br /&gt;                {&lt;br /&gt;                    return u.SIAP.Equals(usuarioA.Codigo.ToString());&lt;br /&gt;                });&lt;br /&gt;                if (usuarioB != null &amp;amp;&amp;amp; UsuarioModificado(usuarioA, ref usuarioB))&lt;br /&gt;                {&lt;br /&gt;                    batchFacade.AtualizarUsuario(usuarioB);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    catch&lt;br /&gt;    {&lt;br /&gt;        throw new ApplicationException("Falha ao atualizar os dados dos usuários");&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Esta aplicação possui um tratamento de erro genérico, que grava no eventlog todos os erros que ocorrem no sistema. Agora imaginem que ocorra um erro durante o processamento deste método: neste caso, a execução irá cair no block &lt;i&gt;catch&lt;/i&gt;, e uma exception do tipo &lt;i&gt;ApplicationException&lt;/i&gt; será lançada, com o texto "Falha ao atualizar os dados de usuários".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Agora imaginem vocês, com um erro em ambiente de produção, tendo apenas essa mensagem para descobrir o problema que está acontecendo. É nessas horas que a gente tem vontade de matar quem programa nas coxas, apenas se importando em entregar a funcionalidade e nem ligando para a pessoa que irá cuidar &lt;strike&gt;dessa tranqueira&lt;/strike&gt; do sistema.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O simples fato de obter a exception original e passá-la como inner exception da ApplicationException que estamos lançando já ajuda, pois na rotina de tratamento de erros genérico podemos pegar os detalhes que ajudarão em muito identificar o problema. Neste caso, o problema era uma informação que vinha faltando no banco de dados.&lt;/div&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7219151831763890967?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7219151831763890967/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7219151831763890967&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7219151831763890967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7219151831763890967'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/10/perola-como-dificultar-o-tratamento-de.html' title='Pérola: como dificultar o tratamento de erro de aplicações'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3280654450444738088</id><published>2011-10-23T14:24:00.001-07:00</published><updated>2011-10-23T14:24:08.176-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Limitações ao se trabalhar com o TFS 2010</title><content type='html'>&lt;p align="justify"&gt;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).&lt;/p&gt;  &lt;p align="justify"&gt;Obs. Esta lista foi retirada do livro &lt;a href="http://www.amazon.com/Professional-Team-Foundation-Server-Programmer/dp/0470943327"&gt;Professional Team Foundation Server 2010 (Wrox Programmer to Programmer)&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;h4&gt;Renomear um Team Project&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-XqkQBgD_Cmg/TqSF41TJTeI/AAAAAAAABBY/bVT8tUxa3gw/s1600-h/image%25255B10%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Renomear team projects" border="0" alt="Renomear team projects" src="http://lh4.ggpht.com/-OXo9rlqkjEQ/TqSF5er-TBI/AAAAAAAABBg/Bj0d6FJ85e4/image_thumb%25255B6%25255D.png?imgmax=800" width="361" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;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…&lt;/p&gt;  &lt;h4&gt;Mover work items entre Team Projects e Team Project Collections&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-9yvSpDJ-r6c/TqSF5lF1msI/AAAAAAAABBo/oCfvScdxiqY/s1600-h/image%25255B11%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Mover work items entre team projects" border="0" alt="Mover work items entre team projects" src="http://lh4.ggpht.com/-6SR3E_zttNQ/TqSF6EnL09I/AAAAAAAABBw/0p1COOTYSRQ/image_thumb%25255B7%25255D.png?imgmax=800" width="739" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Não é possível mover work items entre team projects diferentes, visto que os process templates entre eles podem ser diferentes.&lt;/p&gt;  &lt;h4&gt;Mover Team Projects entre Team Project Collections&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-KGZ8k-Y8W_8/TqSF6bA12rI/AAAAAAAABB0/I4bdFEW0_bA/s1600-h/image%25255B16%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Mover team projects entre team project collections" border="0" alt="Mover team projects entre team project collections" src="http://lh3.ggpht.com/-eFc-l5i7B4s/TqSF6-SfoQI/AAAAAAAABB8/K0_GWDaRPc0/image_thumb%25255B10%25255D.png?imgmax=800" width="739" height="152" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Da mesma forma que os work items, não é possível mudar de lugar um team project. Isso porque pode ocorrer problemas com os IDs gerados para os artefatos armazenados, como work items e changesets.&lt;/p&gt;  &lt;h4&gt;Gerenciar work items no Excel ou Project ou tirar relatório de vários Team Projects &lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-yYGAlCmvDdk/TqSF7YagI3I/AAAAAAAABCE/k9mrgLUJF-w/s1600-h/image%25255B21%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Manipular ou visualizar informações de diversos team projects ao mesmo tempo" border="0" alt="Manipular ou visualizar informações de diversos team projects ao mesmo tempo" src="http://lh5.ggpht.com/-XtbjCdvAdDI/TqSF79I95II/AAAAAAAABCM/HONaZ2JBgKA/image_thumb%25255B13%25255D.png?imgmax=800" width="739" height="389" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Não é possível gerenciar os work items de vários team projects ao mesmo tempo em uma mesma planilha do excel, por exemplo. A visualização dos work items deve ser feita team project por team project. O mesmo vale para relatórios no sharepoint, por exemplo. Um de cada vez…&lt;/p&gt;  &lt;h4&gt;Rastrear merges entre vários Team Projects&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-UQ_RjfOMpmE/TqSF8dO_KhI/AAAAAAAABCY/fA3IMykJqks/s1600-h/image%25255B26%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Ver histórico de merges entre diferentes team projects" border="0" alt="Ver histórico de merges entre diferentes team projects" src="http://lh4.ggpht.com/-h04YqWGBuxw/TqSF81b8cgI/AAAAAAAABCg/OHdSL-jJKOI/image_thumb%25255B16%25255D.png?imgmax=800" width="361" height="318" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Não é possível visualizar o histórico para merges que são feitos entre branchs de team projects distintos. Mesmo porque, não é recomendado trabalhar dessa forma.&lt;/p&gt;  &lt;h4&gt;Links de work itens entre diversos Team Projects&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-3ZrTdTWgycs/TqSF9GdSZ-I/AAAAAAAABCo/ZIXw0xaWtxw/s1600-h/image%25255B34%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Associar work items entre team projects" border="0" alt="Associar work items entre team projects" src="http://lh3.ggpht.com/-u0xoCNDZ-YE/TqSF9zJv3AI/AAAAAAAABCw/Ud8EMIZ2kg4/image_thumb%25255B20%25255D.png?imgmax=800" width="739" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Por último, cada team project é uma unidade isolada. Isso quer dizer que não é possível relacionar work items entre team projects diferentes.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3280654450444738088?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3280654450444738088/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3280654450444738088&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3280654450444738088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3280654450444738088'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/10/limitacoes-ao-se-trabalhar-com-o-tfs.html' title='Limitações ao se trabalhar com o TFS 2010'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-OXo9rlqkjEQ/TqSF5er-TBI/AAAAAAAABBg/Bj0d6FJ85e4/s72-c/image_thumb%25255B6%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1523543054438579383</id><published>2011-10-19T17:26:00.001-07:00</published><updated>2011-10-19T17:26:18.573-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><title type='text'>Uso de static em OOP: escolhendo a arma correta</title><content type='html'>&lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-IvErMk7Q6Lk/Tp9qqGBwYiI/AAAAAAAABBE/FTbJUjnBx0Q/s1600-h/airsoft_M4_bayonet%25255B3%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Baioneta montada em um M-16" border="0" alt="Baioneta montada em um M-16" align="left" src="http://lh5.ggpht.com/-AnElGlprCd0/Tp9qqZNM4-I/AAAAAAAABBM/YD0AG3pDwHQ/airsoft_M4_bayonet_thumb%25255B1%25255D.jpg?imgmax=800" width="419" height="281" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;Mas é claro que atualmente, na maioria das situações, é preferível utilizar fuzis com o objetivo que eles foram criados: disparar projéteis!&lt;/p&gt;  &lt;p align="justify"&gt;E o que isso tem a ver com orientação a objetos e uso de métodos estáticos? Antes da orientação a objetos, os programas eram codificados levando-se em consideração o paradigma procedural, que é basicamente o jeito que trabalhamos quando usamos métodos estáticos: sub-rotinas manipulando estruturas de dados. Isso é diferente da orientação a objetos, onde as sub-rotinas e estruturas de dados são “mesclados” em objetos.&lt;/p&gt;  &lt;p align="justify"&gt;Pois bem, utilizar métodos estáticos em programação orientada a objetos (descontroladamente, que fique bem claro) é como se estivéssemos retrocedendo e utilizando uma ferramenta de forma arcaica, sem obter seus principais benefícios. É a mesma coisa que utilizar um rifle equipado com uma baioneta como lança sendo que você tem munição de sobra e está em campo aberto! O uso desregrado de métodos estáticos mata o que a OOP tem de melhor: polimorfismo, herança, etc. É claro que em casos especiais iremos precisar de métodos estáticos, mas isso tende a ser exceção.&lt;/p&gt;  &lt;p align="justify"&gt;Concluíndo, o uso de métodos estáticos em linguagens orientadas a objetos como C# ou Java não é errado, desde que se saiba o que está fazendo. Dê preferência ao uso de métodos de instância em OOP para tirar o melhor proveito, mas principalmente dê preferência ao bom-senso…&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1523543054438579383?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1523543054438579383/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1523543054438579383&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1523543054438579383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1523543054438579383'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/10/uso-de-static-em-oop-escolhendo-arma.html' title='Uso de static em OOP: escolhendo a arma correta'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-AnElGlprCd0/Tp9qqZNM4-I/AAAAAAAABBM/YD0AG3pDwHQ/s72-c/airsoft_M4_bayonet_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3401301906332802385</id><published>2011-10-18T10:10:00.000-07:00</published><updated>2011-10-18T10:10:47.901-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>Pérola: como remover caracteres de uma string</title><content type='html'>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"):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;string estab = string.Empty;&lt;br /&gt;char[] delimitadores = new char[] { '.', '/', '-' };&lt;br /&gt;string[] partes = lblCNPJEstabelecimento.Text.Split(delimitadores, StringSplitOptions.RemoveEmptyEntries);&lt;br /&gt;for (int i = 0; i &amp;lt; partes.Length; i++)&lt;br /&gt;    estab = estab + partes[i];&lt;br /&gt;}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;Bizarro...&lt;br /&gt;&lt;br /&gt;Para remover uma única ocorrência, o método Replace é indicado: &lt;a href="http://msdn.microsoft.com/en-us/library/fk49wtc1.aspx"&gt;http://msdn.microsoft.com/en-us/library/fk49wtc1.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Outra alternativa é utilizar regular expressions:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace%28v=VS.100%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace%28v=VS.100%29.aspx&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;O link abaixo possui um extension method para remover vários caracteres: &lt;a href="http://www.csharptricks.com/blog/2006/10/remove-characters-from-string-cnet.html"&gt;http://www.csharptricks.com/blog/2006/10/remove-characters-from-string-cnet.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mantenham o código simples e limpo...&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3401301906332802385?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3401301906332802385/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3401301906332802385&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3401301906332802385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3401301906332802385'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/10/perola-como-remover-caracteres-de-uma.html' title='Pérola: como remover caracteres de uma string'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7613993732896540482</id><published>2011-10-17T06:30:00.000-07:00</published><updated>2011-10-18T09:57:44.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Nota rápida: Concatenando valores com caractere de separação em C#</title><content type='html'>&lt;div style="text-align: justify;"&gt;Abaixo está um exemplo rápido de como concatenar um array de strings em uma única string, separando esses valores por um caractere.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;[TestMethod]&lt;br /&gt;public void TestarConcatenacao01()&lt;br /&gt;{&lt;br /&gt;    var arr = new[] { "s1", "s2" };&lt;br /&gt;    var s = string.Join(";", arr);&lt;br /&gt;    Assert.AreEqual("s1;s2", s);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[TestMethod]&lt;br /&gt;public void TestarConcatenacao02()&lt;br /&gt;{&lt;br /&gt;    var arr = new string[] { };&lt;br /&gt;    var s = string.Join(";", arr);&lt;br /&gt;    Assert.AreEqual(string.Empty, s);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[TestMethod]&lt;br /&gt;public void TestarConcatenacao03()&lt;br /&gt;{&lt;br /&gt;    var arr = new[] { "s1" };&lt;br /&gt;    var s = string.Join(";", arr);&lt;br /&gt;    Assert.AreEqual("s1", s);&lt;br /&gt;}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;string.Join&lt;/i&gt; 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).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7613993732896540482?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7613993732896540482/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7613993732896540482&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7613993732896540482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7613993732896540482'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/10/nota-rapida-concatenando-valores-com.html' title='Nota rápida: Concatenando valores com caractere de separação em C#'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-6820426275546900143</id><published>2011-09-23T11:42:00.000-07:00</published><updated>2011-09-23T11:42:31.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Português'/><title type='text'>Regras para siglas</title><content type='html'>&lt;div style="text-align: justify;"&gt;Eu tinha o costume de colocar um &lt;b&gt;'s&lt;/b&gt; 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!!!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;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.".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É importante para quem trabalha com exatas não descuidar do conhecimento de lingua portuguesa, pois já dizia Chacrinha: "&lt;i&gt;&lt;span class="st"&gt;&lt;em&gt;Quem não se comunica&lt;/em&gt;, se trumbica&lt;/span&gt;&lt;/i&gt;". Comunicação é tudo, e é sempre bom fazer as coisas da maneira correta.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este link tem mais informações sobre o uso correto de siglas na língua portuguesa: &lt;a href="http://www.soportugues.com.br/secoes/abrev/abrev9.php"&gt;http://www.soportugues.com.br/secoes/abrev/abrev9.php&lt;/a&gt;. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-6820426275546900143?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/6820426275546900143/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=6820426275546900143&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6820426275546900143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6820426275546900143'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/09/regras-para-siglas.html' title='Regras para siglas'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8493351135163372173</id><published>2011-09-20T07:26:00.000-07:00</published><updated>2011-09-20T07:27:00.003-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Membros ThreadStatic e ASP.NET thread switching: cuidados ao usar</title><content type='html'>&lt;div style="text-align: justify;"&gt;Tudo começou com uma dúvida referente como a classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx"&gt;TransactionScope&lt;/a&gt; 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.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Olhando o código-fonte do TransactionScope através de ferramentas de disassembler, como o &lt;a href="http://reflector.red-gate.com/Download.aspx"&gt;Redgate .NET Reflector&lt;/a&gt; ou &lt;a href="http://www.telerik.com/products/decompiler.aspx"&gt;Telerik JustDecompile&lt;/a&gt; (como eu amo esses aplicativos!), percebi que o contexto de transação é armazenado em um membro decorado com o atributo &lt;a href="http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx"&gt;ThreadStatic&lt;/a&gt;, ou seja, é praticamente uma "variável global" esclusiva de uma thread, que não pode ser acessada por outra thread.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--E5JuoxJkDg/TniZKrunpII/AAAAAAAABAY/eNGWWKSwR4g/s1600/thread0.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://4.bp.blogspot.com/--E5JuoxJkDg/TniZKrunpII/AAAAAAAABAY/eNGWWKSwR4g/s400/thread0.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BwuAapN0WVM/TniZG7grMAI/AAAAAAAABAU/OWt2gd7hjIc/s1600/thread1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://1.bp.blogspot.com/-BwuAapN0WVM/TniZG7grMAI/AAAAAAAABAU/OWt2gd7hjIc/s400/thread1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QqCwv-D2qcw/TniZNI1gGsI/AAAAAAAABAc/0248stOHHpo/s1600/thread2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://3.bp.blogspot.com/-QqCwv-D2qcw/TniZNI1gGsI/AAAAAAAABAc/0248stOHHpo/s400/thread2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;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! Quem define isso é a plataforma ASP.NET, que tenta dar um uso eficaz de recursos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bom, o meu medo era que uma aplicação ASP.NET usando TransactionScope pudesse gerar alguma inconsistência de banco de dados no momento que uma transação estivesse ativa e a thread eventualmente mudasse (&lt;a href="http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx"&gt;http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx&lt;/a&gt;).&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Mas uma pesquisa na internet me mostrou que esse evento de troca de thread é menos comum de acontecer do que eu imaginava. Geralmente ele ocorre quando há algum processamento assíncrono, por exemplo, usando as funcionalidades do async no ASP.NET 2.0 (&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163725.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/cc163725.aspx&lt;/a&gt;) ou na inicialização da página. Ou seja, praticamente esse problema pode ocorrer num mal uso de processamento assíncrono no ASP.NET com TransactionScope: &lt;b&gt;quem em sã consciência abriria uma transação durante um processamento assíncrono?&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Por isso, fiquei mais tranquilo ao usar transações controladas pelo TransactionScope em aplicações ASP.NET. Mas claro, se eu precisar guardar alguma informação de contexto, usaria o HttpContext.Current.Items ao invés de um membro estático marcado com ThreadStatic.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Alguns links esclarecedores:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/7465965/asp-net-and-threadstatic-as-part-of-transactionscopes-implementation"&gt;http://stackoverflow.com/questions/7465965/asp-net-and-threadstatic-as-part-of-transactionscopes-implementation&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://piers7.blogspot.com/2005/11/threadstatic-callcontext-and_02.html"&gt;http://piers7.blogspot.com/2005/11/threadstatic-callcontext-and_02.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://piers7.blogspot.com/2005/12/log4net-context-problems-with-aspnet.html"&gt;http://piers7.blogspot.com/2005/12/log4net-context-problems-with-aspnet.html &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.lhotka.net/weblog/ASPNETThreadSwitching.aspx"&gt;http://www.lhotka.net/weblog/ASPNETThreadSwitching.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8493351135163372173?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8493351135163372173/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8493351135163372173&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8493351135163372173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8493351135163372173'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/09/membros-threadstatic-e-aspnet-thread.html' title='Membros ThreadStatic e ASP.NET thread switching: cuidados ao usar'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--E5JuoxJkDg/TniZKrunpII/AAAAAAAABAY/eNGWWKSwR4g/s72-c/thread0.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8916917760364451455</id><published>2011-09-16T12:21:00.000-07:00</published><updated>2011-09-20T15:50:03.762-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>Conversões e desconversões</title><content type='html'>&lt;div style="text-align: justify;"&gt;Mais uma pérola que pode ser relacionada com meu outro post&lt;a href="http://galorebr.blogspot.com/2011/09/vicios-de-linguagem-de-programacao.html"&gt; Vícios de linguagem de programação&lt;/a&gt;:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;return (Int32.Parse(diff.Days.ToString()) &amp;lt; Int32.Parse(configuracao.Parametro.ToString()));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;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?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Segundo detalhe: a propriedade Parametro da variável configuracao já é uma string. Não há necessidade de chamar o método ToString().&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tem coisa que dá medo...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8916917760364451455?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8916917760364451455/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8916917760364451455&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8916917760364451455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8916917760364451455'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/09/conversoes-e-desconversoes.html' title='Conversões e desconversões'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4227717267425112342</id><published>2011-09-14T10:46:00.000-07:00</published><updated>2011-09-20T15:50:36.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>"".GetType() vs. typeof(string)</title><content type='html'>&lt;div style="text-align: justify;"&gt;No ASP.NET Webforms é possível incluir um javascript para ser renderizado na tela através do método &lt;i&gt;RegisterStartupScript&lt;/i&gt; a partir da propriedade &lt;i&gt;ClientScript&lt;/i&gt; do objeto &lt;i&gt;Page&lt;/i&gt;. 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.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os dois primeiros parâmetros são um &lt;i&gt;Type&lt;/i&gt; 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.&amp;nbsp;Para o primeiro parâmetro, podemos passar o próprio tipo da página onde este script&amp;nbsp;será usado.&amp;nbsp;Mais detalhes em &lt;a href="http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx"&gt;http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;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 &lt;i&gt;"".GetType()&lt;/i&gt;, de forma a obter uma instância de &lt;i&gt;Type&lt;/i&gt; que represente uma string. Poxa,se for para fazer isso, que pelo menos seja passando &lt;i&gt;typeof(string)&lt;/i&gt;.&lt;/div&gt;&lt;pre class="brush:c#"&gt;Page.ClientScript.RegisterStartupScript("".GetType(), "", "alert('Mensagem qualquer de alerta do sistema!');", true);&lt;br /&gt;&lt;/pre&gt;&lt;div class="brush:c#" style="text-align: justify;"&gt;Obs. Internamente, no CIL, &lt;i&gt;typeof&lt;/i&gt; chama o método &lt;i&gt;Type.GetTypeFromHandle&lt;/i&gt;.&lt;/div&gt;&lt;div class="brush:c#" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="brush:c#" style="text-align: justify;"&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4227717267425112342?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4227717267425112342/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4227717267425112342&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4227717267425112342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4227717267425112342'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/09/gettype-vs-typeofstring.html' title='&quot;&quot;.GetType() vs. typeof(string)'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-814084353502464863</id><published>2011-09-11T14:24:00.001-07:00</published><updated>2011-09-12T17:06:02.090-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>Vícios de linguagem de programação</title><content type='html'>&lt;div align="justify"&gt;Você conhece as expressões “acabamento final”, “elo de ligação”, “subir para cima”, “metades iguais”, “protagonista principal”, entre outras?&lt;/div&gt;&lt;div align="justify"&gt;É o chamado &lt;b&gt;pleonasmo&lt;/b&gt;, 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.&lt;/div&gt;&lt;div align="justify"&gt;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.&lt;/div&gt;&lt;pre class="brush:c#"&gt;var lista = new List&amp;lt;string&amp;gt;();&lt;br /&gt;// preenche a lista...ou não&lt;br /&gt;bool existencia = lista.Count &amp;gt; 0;&lt;br /&gt;if (existencia == true)&lt;br /&gt;{&lt;br /&gt;// faz alguma coisa...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Veja o conteúdo do condicional: &lt;i&gt;existencia == true&lt;/i&gt;. Mas o tipo da variável &lt;i&gt;existencia&lt;/i&gt; já não é um bool? E no final das contas, &lt;a href="http://msdn.microsoft.com/en-us/library/5011f09h%28v=VS.100%29.aspx" target="_blank"&gt;um resultado do tipo bool não é o que define a expressão que fica no condicional if&lt;/a&gt;&lt;i&gt;&lt;/i&gt;? Sendo assim, o código poderia ser reescrito simplesmente como:&lt;/div&gt;&lt;pre class="brush:c#"&gt;var lista = new List&amp;lt;string&amp;gt;();&lt;br /&gt;// preenche a lista...ou não&lt;br /&gt;bool existencia = lista.Count &amp;gt; 0;&lt;br /&gt;if (existencia)&lt;br /&gt;{&lt;br /&gt;// faz alguma coisa...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Não existe a necessida de comparar o conteúdo da variável &lt;i&gt;existencia&lt;/i&gt; com a constante &lt;i&gt;true&lt;/i&gt;. Fazê-lo é uma redundância totalmente desnecessária.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Fica a “conclusão final” do post: sempre estejam atentos às repetições no código que não agregam nenhum valor. Procurem sempre deixar o código o mais enxuto possível, sem prejudicar a clareza. Maior quantidade de linhas de código não é critério de qualidade ou produtividade! Evitem o pleonasmo na hora de programar.&lt;/div&gt;&lt;br /&gt;[]’s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-814084353502464863?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/814084353502464863/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=814084353502464863&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/814084353502464863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/814084353502464863'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/09/vicios-de-linguagem-de-programacao.html' title='Vícios de linguagem de programação'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8804387027683168814</id><published>2011-09-06T21:57:00.001-07:00</published><updated>2011-09-06T22:00:07.228-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Krav-Magá'/><title type='text'>Nova graduação!</title><content type='html'>&lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="Faixa laranja do Krav-Magá" border="0" alt="Faixa laranja do Krav-Magá" align="right" src="http://lh4.ggpht.com/-uCm0EOpw3CI/Tmb517h6SZI/AAAAAAAABAE/k7milF_2Bqw/2011-09-06%25252000.13.07%25255B10%25255D.jpg?imgmax=800" width="155" height="190" /&gt;&lt;/p&gt;  &lt;p&gt;Passados mais de um ano (&lt;a title="http://galorebr.blogspot.com/2010/04/primeira-graduacao.html" href="http://galorebr.blogspot.com/2010/04/primeira-graduacao.html"&gt;http://galorebr.blogspot.com/2010/04/primeira-graduacao.html&lt;/a&gt;), recebi nova graduação no Krav Magá: faixa laranja! O exame foi no dia 12 de Agosto, mas a cerimônia de entrega da faixa foi neste último final de semana, no Colégio Assunção em São Paulo.&lt;/p&gt;  &lt;p&gt;Parabéns ao nosso mestre Duda e a todos que se esforçaram para subir mais este nível! Agora é treinar e evoluir o condicionamento físico para o próximo desafio daqui a aproximadamente dois anos.&lt;/p&gt;  &lt;p&gt;Kidá!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8804387027683168814?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8804387027683168814/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8804387027683168814&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8804387027683168814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8804387027683168814'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/09/nova-graduacao.html' title='Nova graduação!'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-uCm0EOpw3CI/Tmb517h6SZI/AAAAAAAABAE/k7milF_2Bqw/s72-c/2011-09-06%25252000.13.07%25255B10%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8265673545106728841</id><published>2011-08-07T11:10:00.001-07:00</published><updated>2011-08-07T11:10:25.658-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><title type='text'>Considerações sobre frameworks corporativos</title><content type='html'>&lt;p align="justify"&gt;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”…&lt;/p&gt;  &lt;p align="justify"&gt;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…&lt;/p&gt;  &lt;p align="justify"&gt;Separei três principais bases na qual um framework corporativo deve se basear, e consequentemente quais são os problemas que geralmente encontramos caso esses pré-requisitos não sejam seguidos.&lt;/p&gt;  &lt;h2&gt;A ferramenta certa para o problema errado&lt;/h2&gt;  &lt;p align="justify"&gt;A primeira base que temos que adotar para a construção de um framework corporativo é o &lt;strong&gt;valor ao desenvolvimento&lt;/strong&gt;, ou seja, o quanto esse componente agrega ao processo de criação de software. Em linhas gerais, posso resumir isso em quanto a solução proposta pelo framework se adequa ao problema da equipe de desenvolvimento e de quanto dinheiro é economizado com o seu uso.&lt;/p&gt;  &lt;p align="justify"&gt;Um dos primeiros erros ao se decidir criar um framework corporativo é começar com a solução, e não com o problema a ser resolvido. Nos achamos superiores ao imaginar que conseguimos criar uma bala-de-prata que irá matar um lobisomem que ainda nem existe (e nem sabemos se será um lobisomem ou outro tipo de monstro). Já vi projetos de ERP em que antes de se ter requisitos de negócio já se estava codificando uma biblioteca de componentes utilitários ao projeto. Não! Vamos entender melhor primeiro o que precisa ser resolvido, e focar no problema e não em criar o componente mais bonito do mundo cuja maior parte (senão todo) não é utilizado. Com os requisitos mais bem definidos, podemos olhar para o mercado e ver se já não existe uma opção pronta e que seja viável tecnicamente e financeiramente.&lt;/p&gt;  &lt;p align="justify"&gt;Além disso, é preciso estar aderente às estratégias de crescimento da empresa (papel do arquiteto), pois de nada adianta as horas gastas se mais para frente todo o trabalho se torna obsoleto (por exemplo gastar esforço em um framework de aplicações desktop sendo que o direcionamento da empresa é ter seus sistemas em web). Por outro lado, precisamos ter um compromentimento da parte dos gestores (gerentes, diretores, etc.) em ter recursos alocados para a evolução e continuidade do que foi feito.&lt;/p&gt;  &lt;p align="justify"&gt;Um último detalhe. Precisamos saber vender o framework construído para outras equipes. Somos os fornecedores deles, e eles não estão fazendo nenhum favor em utilizar o que criamos. Reitero, temos que agregar valor para os outros (TI é sempre assim, trabalhar para suportar o trabalho de outras pessoas).&lt;/p&gt;  &lt;h2&gt;Como enfrentar as mudanças?&lt;/h2&gt;  &lt;p align="justify"&gt;Decidimos que temos que criar um framework corporativo. Ótimo, vamos colocar a mão na massa. Criamos uma primeira versão do componente que atenda uma equipe de sistema X. Fazemos um happy hour para comemorar o uso com sucesso dessa equipe. Outro time Y vê e também quer utilizar o framework, mas o problema que eles têm para resolver é um pouco diferente do primeiro. Vamos ter que alterar nossa recém-criado ferramenta… e agora, é fácil? Podemos sair mexendo? E se quebrarmos alguma coisa que a primeira equipe usava?&lt;/p&gt;  &lt;p align="justify"&gt;Aqui destaco a &lt;strong&gt;maturidade, comprometimento e grande conhecimento&lt;/strong&gt; que as pessoas que constrõem esse tipo de software devem ter. Precisamos de um framework que possa ser adaptador para novas situações de forma fácil! Precisamos de componentes que tenham contratos de uso bem definidos! Não estou falando nenhum conceito fora do comum, é a pura aplicação da orientação a objetos e as boas práticas associadas (isolamento dos detalhes da implementação; princípio Open/Closed – código que permite extensão mas é fechado para modificação, etc.).&lt;/p&gt;  &lt;p align="justify"&gt;A idéia aqui não é ter um BDUF (Big Design Up Front, ou seja, tentar prever todos os problemas e já contemplar a solução logo de primeira), mas precisamos usar nossa experiência para que pelo menos os problemas que já passamos na vida possam ser endereçados de uma forma mais elegante e de fácil manutenção.&lt;/p&gt;  &lt;p align="justify"&gt;Outro ponto importante: o nosso framework precisa ter uma fácil distribuição e minima dependência de outros componentes. Isso facilita quando temos que distribuí-lo para uso de outras pessoas, como fornecedores externos (fábrica de software).&lt;/p&gt;  &lt;p align="justify"&gt;Para este caso, tenho uma experiência feliz. Cuidávamos de um framework de processamento assíncrono, que funciona da seguinte forma: um sistema possui um componente .NET no COM+ (sim, COM+, legado…); ao invés da parte cliente desse sistema chamar este componente diretamente, ele acionava nosso framework, passando o nome do componente deles, o nome do método e os valores dos seus parâmetros para a execução, e nosso componente enfileirava a execução e colocava para rodar assím que possível. Uma vez identificamos um problema neste framework, que segurava referência de dll .NET quando era passado um parâmetro de tipo definido pelo cliente (que não fazia parte dos tipos do CLR). Quando era necessário atualizar o sistema, não era possível mexer na dll. O ponto de problema era a manipulação do objeto contendo as informações do que seria executado diretamente pelos clientes do framework. Com o simples uso de poliformismo, fizemos a alteração no sistema de forma a tratar este caso sem quebrar o contrato dos vários sistemas que utilizavam nosso framework. Este foi um ponto legal, pois era inviável o retrabalho das muitas equipes de sistema em adaptar o uso caso fosse necessário mudar a forma como se utilizava o framework.&lt;/p&gt;  &lt;h2&gt;Conhecimento é a chave&lt;/h2&gt;  &lt;p align="justify"&gt;Temos vários níveis de experiência dos desenvolvedores dentro de uma empresa, desde o mais escovador de bits até o que ainda não sabe ligar um computador (sim, eles existem e provavelmente hoje ganham mais que o seu pai ganhava quando trabalhava para sustentar você). Vou citar um caso. Há algum tempo introduzimos um framework para desenvolvimento web ASP.NET, uma moldura (uma master page, para ser mais exato) na qual as demais equipes de sistemas colocavam suas páginas. O ganho principal neste caso eram controles já embutidos na solução (menus, controle de acesso, etc.), e uma certa padronização visual. De repente, começamos a receber reclamações que este framework não funcionava direito, e estava atrapalhando o desenvolvimento das equipes. Ao analisar melhor o caso, descobrimos que na verdade o erro que os desenvolvedores estavam tendo na chamada aos seus próprios serviços WCF, por falta de conhecimento desse framework da Microsot. Mas como eles não sabiam interpretar os erros, acabavam tomando por verdade que a causa dos seus problemas era o famigerado framework. E eis que surge a famosa “muleta”. Tivemos que parar o que estávamos fazendo e provar por A mais B que o erro era com eles. Para ajudar, o coordenador dessa equipe não tinha competência técnica para entender o problema, e comprava a briga deles sem conseguir compreender que o erro estava com eles. Infelizmente (e é muito difícil para mim falar isso), temos que aceitar a realidade que hoje trabalharemos com muitas pessoas que vão deixar a desejar no quesito de conhecimento, principalmente porque atualmente o mercado de TI está aquecido e dá bons salários para pessoas que não têm muito estudo ou aptidão para a coisa.&lt;/p&gt;  &lt;p align="justify"&gt;O que aprendemos aqui é que um framework corporativos precisam ser de fácil utilização, com mensagens claras de erros que ocorram, sejam eles por uma configuração/uso incorreto pelo desenvolvedor, ou pelo próprio código do desenvolvedor. Em uma outra situação, num framework corporativo para acesso a base de dados SQL Server, vimos que simplesmente colocando um tratamento de erro mais claro (mostrando detalhes do erro, qual base de dados, servidor, etc.) a quantidade de reclamações sobre a qualidade do framework caiu drasticamente, pois os próprios desenvolvedores conseguiam identificar e resolver os problemas.&lt;/p&gt;  &lt;p align="justify"&gt;Mas mesmo assim, é essencial que haja &lt;strong&gt;treinamento contínuo da ferramenta&lt;/strong&gt;. Uma boa documentação com exemplos práticos é essencial. Indo mais fundo, entendo que seja necessário uma &lt;u&gt;equipe dedicada ao suporte&lt;/u&gt; aos desenvolvedores, tirando esta tarefa de quem cria e mantém o framework. Se o framework seja utilizado por fornecedores externos, é necessário que haja um ponto focal desse fornecedor para o suporte. As responsabilidades precisam estar muito bem definidas e clara para todos.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-Wu_g1EgCmAE/Tj7VDJ1aKFI/AAAAAAAAA_I/CnrVfOvVwPs/s1600-h/image%25255B12%25255D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-cFD5JGGhTCg/Tj7VEMysCWI/AAAAAAAAA_M/QVNoB1D1lMk/image_thumb%25255B10%25255D.png?imgmax=800" width="398" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;E ae, vamos construir um framework?&lt;/h2&gt;  &lt;p align="justify"&gt;Na real? Eu estou fora dessa, rs. Acho que hoje estou meio que parecido com veteranos de guerra que qualquer barulho no quintal de casa já acham que são vietcongs. Talvez eu mude de idéia se todos os pontos de problema que eu apresentei acima sejam devidamente endereçados, principalemte na questão do treinamento (esse foi nosso principal calcanhar de Aquiles)…&lt;/p&gt;  &lt;p align="justify"&gt;Mesmo porque acredito que já exista no mercado uma boa solução para todos os tipos de problemas que geralmente encontramos no desenvolvimento de sistemas. Não precisamos criar algo novo. Volto no ponto que disse que precisamos agragar valor na criação de software, mesmo que isso signifique que não vamos desenvolver nada. Manter um framework corporativo é caro, e é preciso muita certeza de que ele é realmente necessário.&lt;/p&gt;  &lt;p align="justify"&gt;Termino o post com mais um ponto de atenção que não coloquei anteriormente: a cultura da empresa. Se a cultura da empresa for contratar pessoas com nível de conhecimento extremamente distinto (gente muito boa e gente muito ruim tecnicamente) e &lt;u&gt;não prover um crescimento profissional&lt;/u&gt;, aí é que o barco afunda de vez. Provavelmente a estratégia dela é querer que as pessoas boas sejam “gurus” que preparem o processo de desenvolvimento de forma que qualquer um (a mão-de-obra “barata” e “facilmente substituível”) possa desenvolver. A tendência é que toda a responsabilidade de qualquer problema caia sobre a equipe sênior, pois é dela a tarefa de prever todo e qualquer erro que alguém possa cometer e não deixá-lo acontecer (já ouvi um coordenador de desenvolvimento tentar isentar a culpa da sua equipe de juniores pois eles “ganhavam muito pouco para poder saber programar direito”). Construir um framework numa empresa assim é um tiro no pé.&lt;/p&gt;  &lt;p align="justify"&gt;Esse foi um resumo das minhas experiências nesta questão, e espero que sejam úteis para alguém.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8265673545106728841?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8265673545106728841/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8265673545106728841&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8265673545106728841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8265673545106728841'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/08/consideracoes-sobre-frameworks.html' title='Considerações sobre frameworks corporativos'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-cFD5JGGhTCg/Tj7VEMysCWI/AAAAAAAAA_M/QVNoB1D1lMk/s72-c/image_thumb%25255B10%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1453845312784171025</id><published>2011-07-23T12:31:00.001-07:00</published><updated>2011-07-23T12:31:26.232-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Artigo de Moles - .NET Magazine 87</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-WAVgssA0nfU/TishiXdHzrI/AAAAAAAAA-w/xgw4B33C7BU/s1600-h/image%25255B10%25255D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh4.ggpht.com/-jc1F7rTG3HE/TishjJ5kK3I/AAAAAAAAA-0/DJ5XUQ_CSMY/image_thumb%25255B8%25255D.png?imgmax=800" width="160" height="197" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Pessoal, esse mês saiu a .NET Magazine edição 87 contendo um artigo meu sobre o Moles.&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;O artigo online está em &lt;a title="http://www.devmedia.com.br/post-21606-Introducao-ao-framework-de-testes-Microsoft-Moles.html" href="http://www.devmedia.com.br/post-21606-Introducao-ao-framework-de-testes-Microsoft-Moles.html"&gt;http://www.devmedia.com.br/post-21606-Introducao-ao-framework-de-testes-Microsoft-Moles.html&lt;/a&gt;, e a revista está na banca mais próxima da sua casa.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s e boa leitura&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1453845312784171025?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1453845312784171025/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1453845312784171025&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1453845312784171025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1453845312784171025'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/07/artigo-de-moles-net-magazine-87.html' title='Artigo de Moles - .NET Magazine 87'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-jc1F7rTG3HE/TishjJ5kK3I/AAAAAAAAA-0/DJ5XUQ_CSMY/s72-c/image_thumb%25255B8%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7627210957809060259</id><published>2011-07-20T09:14:00.001-07:00</published><updated>2011-07-20T09:14:17.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Executar procedure no Oracle que retorne dados como um cursor do tipo OUT</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;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:&lt;br/&gt;&lt;br/&gt;    var refCur REFCURSOR;&lt;br/&gt;    execute NOME_PACKAGE.NOME_PROCEDURE(283, 3507, :refCur);&lt;br/&gt;    print :refCur;&lt;br/&gt;&lt;br/&gt;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):&lt;br/&gt;&lt;br/&gt;    PROCEDURE NOME_PROCEDURE(pID_X IN TB_ABC.ID_X%TYPE,&lt;br/&gt;                                          pID_Y IN TB_XYZ.ID_Y%TYPE,&lt;br/&gt;                                          pCURSOR_SAIDA OUT CURSOR_SAIDA);&lt;br/&gt;[]'s&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7627210957809060259?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7627210957809060259/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7627210957809060259&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7627210957809060259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7627210957809060259'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/07/executar-procedure-no-oracle-que.html' title='Executar procedure no Oracle que retorne dados como um cursor do tipo OUT'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-6555957397974492442</id><published>2011-07-09T17:43:00.001-07:00</published><updated>2011-07-09T17:43:09.096-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pink Floyd'/><category scheme='http://www.blogger.com/atom/ns#' term='Roger Waters'/><category scheme='http://www.blogger.com/atom/ns#' term='Rock'/><title type='text'>Brincadeira sem graça</title><content type='html'>&lt;p&gt;Algum engraçadinho está&amp;#160; querendo causar…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-43EysJ67IxQ/Thj1lUawWjI/AAAAAAAAA8Y/qIDb8IJkUME/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-7OF1jrYc47M/Thj1m4Mvb_I/AAAAAAAAA8c/n7Uk8fajavg/image_thumb%25255B1%25255D.png?imgmax=800" width="581" height="514" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-6555957397974492442?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/6555957397974492442/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=6555957397974492442&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6555957397974492442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6555957397974492442'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/07/brincadeira-sem-graca.html' title='Brincadeira sem graça'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-7OF1jrYc47M/Thj1m4Mvb_I/AAAAAAAAA8c/n7Uk8fajavg/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3237686327336710141</id><published>2011-06-15T08:46:00.000-07:00</published><updated>2011-06-15T08:46:59.882-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>Procedures no Santander</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Galera do noSQL, uma certeza eu tenho, o banco Santander usa stored procedures no seu bankline...&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;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...&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-uIKPCXf170E/TfjS9B_20OI/AAAAAAAAA7s/9Io860fDsJ4/s1600/santander.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="124" src="http://4.bp.blogspot.com/-uIKPCXf170E/TfjS9B_20OI/AAAAAAAAA7s/9Io860fDsJ4/s640/santander.JPG" width="640" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3237686327336710141?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3237686327336710141/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3237686327336710141&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3237686327336710141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3237686327336710141'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/06/procedures-no-santander.html' title='Procedures no Santander'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-uIKPCXf170E/TfjS9B_20OI/AAAAAAAAA7s/9Io860fDsJ4/s72-c/santander.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4970455610340792578</id><published>2011-05-27T13:53:00.001-07:00</published><updated>2011-05-27T13:53:49.900-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UnitTest'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Testando métodos privados</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Me deparei com uma thread interessante sobre unit test no &lt;a href='http://stackoverflow.com/'&gt;StackOverflow&lt;/a&gt; (melhor site para postar dúvidas na minha opinião):&lt;br/&gt;&lt;br/&gt;A dúvida era como testar unitariamente métodos privados.&lt;br/&gt;&lt;br/&gt;Destaco duas respostas técnicas: utilizar o atributo InternalsVisibleToAttribute (&lt;a href='http://devlicio.us/blogs/derik_whittaker/archive/2007/04/09/internalsvisibleto-testing-internal-methods-in-net-2-0.aspx'&gt;http://devlicio.us/blogs/derik_whittaker/archive/2007/04/09/internalsvisibleto-testing-internal-methods-in-net-2-0.aspx)&lt;/a&gt;, 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 (&lt;a href='http://www.amazedsaint.com/2010/05/accessprivatewrapper-c-40-dynamic.html'&gt;http://www.amazedsaint.com/2010/05/accessprivatewrapper-c-40-dynamic.html&lt;/a&gt;), que encapsula o acesso a métodos privados através do dynamic do C# 4.0.&lt;br/&gt;&lt;br/&gt;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.&lt;br/&gt;&lt;br/&gt;Sugiro dar uma olhada no fórum: &lt;a href='http://stackoverflow.com/questions/250692/how-do-you-unit-test-private-methods'&gt;http://stackoverflow.com/questions/250692/how-do-you-unit-test-private-methods&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;[]'s&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4970455610340792578?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4970455610340792578/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4970455610340792578&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4970455610340792578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4970455610340792578'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/05/testando-metodos-privados.html' title='Testando métodos privados'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-5770279401287899436</id><published>2011-05-24T13:37:00.001-07:00</published><updated>2012-01-18T08:28:16.313-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Configurando conexão com Oracle através de TNS - básico</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div align="justify"&gt;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).&lt;br /&gt;&lt;br /&gt;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 setup, CD, etc.&lt;br /&gt;&lt;br /&gt;Em seguida, eu precisei entender como configurar um arquivo chamado tnsnames.ora. Que raios que era isso? Bom, trata-se de um arquivo contendo as definições de endereços de servidores para a conexão. O arquivo tnsnames.ora me foi enviado por e-mail,e para configurá-lo foi necessário os seguintes passos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Colocar este arquivo no disco local. Acabei colocando em C:\oracle\instantclient_10_2\network\admin\. Note que é importante este arquivo estar dentro da pasta network\admin (o que vem antes pode variar).&lt;/li&gt;&lt;li&gt;Criar uma variável de ambiente chamada ORACLE_HOME. Como valor, coloquei o caminho C:\oracle\instantclient_10_2 (pasta onde se encontrava o diretório network\admin).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;div align="justify"&gt;Pronto, com isso minha aplicação funcionou!&lt;br /&gt;&lt;br /&gt;Links interessantes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.connectionstrings.com/oracle#p19"&gt;http://www.connectionstrings.com/oracle#p19&lt;/a&gt; - strings de conexão com o Oracle&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html"&gt;http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html&lt;/a&gt; - download do Instant Client&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Obs. Se alguém que conhece mais o Oracle e quiser acrescentar alguma coisa, por favor comente!&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;br /&gt;ATUALIZAÇÃO (18/01/2012): Olá. Um detalhe que é legal citar aqui também é quando temos uma aplicação rodando no IIS que acessa o Oracle e dá erro&amp;nbsp;&lt;i&gt;ORA-12154: TNS:could not resolve the connect identifier specified&lt;/i&gt;. Nas ocorrências que tive disso, bastou dar permissão de leitura para o usuário que roda o ASP.NET para ele poder ler o arquivo tnsnames.ora lá na pasta onde este arquivo se encontra.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-5770279401287899436?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/5770279401287899436/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=5770279401287899436&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5770279401287899436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5770279401287899436'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/05/configurando-conexao-com-oracle-atraves.html' title='Configurando conexão com Oracle através de TNS - básico'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2044984724274164897</id><published>2011-04-15T16:47:00.001-07:00</published><updated>2011-04-15T16:47:46.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>O pior é impossível?–parte 4</title><content type='html'>&lt;p&gt;Esse é o maior encadeamento de IF’s que eu já vi em vida…, parece um ASCII art.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_KsM26_B4S10/TajZFNJe2iI/AAAAAAAAAhc/t0jgk8SnRPI/s1600-h/clip_image002%5B14%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh6.ggpht.com/_KsM26_B4S10/TajZFf4oeRI/AAAAAAAAAhg/o9Q0BadPZBA/clip_image002_thumb%5B3%5D.jpg?imgmax=800" width="628" height="372" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KsM26_B4S10/TajZF25daAI/AAAAAAAAAhk/gDItwJLt-pk/s1600-h/clip_image002%5B5%5D%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002[5]" border="0" alt="clip_image002[5]" src="http://lh5.ggpht.com/_KsM26_B4S10/TajZGVgv0SI/AAAAAAAAAho/z21avV3K9KI/clip_image002%5B5%5D_thumb%5B1%5D.jpg?imgmax=800" width="628" height="372" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_KsM26_B4S10/TajZGuOxy5I/AAAAAAAAAhs/82LH5_gG9XU/s1600-h/clip_image002%5B7%5D%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002[7]" border="0" alt="clip_image002[7]" src="http://lh5.ggpht.com/_KsM26_B4S10/TajZG-ZFI7I/AAAAAAAAAhw/oma_uSzAlrI/clip_image002%5B7%5D_thumb%5B1%5D.jpg?imgmax=800" width="628" height="372" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_KsM26_B4S10/TajZHTdW9iI/AAAAAAAAAh0/u2YA7CysPzw/s1600-h/clip_image002%5B9%5D%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002[9]" border="0" alt="clip_image002[9]" src="http://lh3.ggpht.com/_KsM26_B4S10/TajZH04P7bI/AAAAAAAAAh4/EDaLriNesVk/clip_image002%5B9%5D_thumb%5B1%5D.jpg?imgmax=800" width="628" height="372" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KsM26_B4S10/TajZIHyE5HI/AAAAAAAAAh8/XfkV2af5Dts/s1600-h/clip_image002%5B11%5D%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002[11]" border="0" alt="clip_image002[11]" src="http://lh6.ggpht.com/_KsM26_B4S10/TajZIjLbjWI/AAAAAAAAAiA/ljeEP_GeWeI/clip_image002%5B11%5D_thumb%5B1%5D.jpg?imgmax=800" width="628" height="372" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Este post foi um oferecimento da AntiIfCampaign:&lt;/p&gt; &lt;a href="http://www.antiifcampaign.com"&gt;&lt;img alt="I have joined Anti-IF Campaign" src="http://www.antiifcampaign.com/assets/banner_ive-joined.gif" width="120" height="60" /&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2044984724274164897?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2044984724274164897/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2044984724274164897&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2044984724274164897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2044984724274164897'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/04/o-pior-e-impossivelparte-4.html' title='O pior é impossível?–parte 4'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KsM26_B4S10/TajZFf4oeRI/AAAAAAAAAhg/o9Q0BadPZBA/s72-c/clip_image002_thumb%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1785147813371252534</id><published>2011-03-19T19:33:00.001-07:00</published><updated>2011-03-19T19:33:16.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Nuget'/><title type='text'>Webcamps em São Paulo</title><content type='html'>&lt;p align="justify"&gt;Nesta última sexta-feira, tive a oportunidade de participar do &lt;a href="http://webcamps.ms/" target="_blank"&gt;Webcamps&lt;/a&gt;, um evento itinerante da Microsoft que passou por Sâo Paulo, no Senac de Santo Amaro. Tivemos apresentações de &lt;a href="http://haacked.com/" target="_blank"&gt;Phil Haack&lt;/a&gt;, do time do ASP.NET MVC, e &lt;a href="http://drewby.com/" target="_blank"&gt;Drew Robbins&lt;/a&gt;, evangelista técnico.&lt;/p&gt;  &lt;p align="justify"&gt;Neste dia, foram as apresentações técnicas, e hoje sábado, que infelizmente não pude participar, foram sessões práticas.&lt;/p&gt;  &lt;p align="justify"&gt;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…&lt;/p&gt;  &lt;p align="justify"&gt;Além deles, &lt;a href="http://coding4windows.wordpress.com/" target="_blank"&gt;Murilo Maciel Curti&lt;/a&gt; apresentou features do IE9 + HTML 5 bem interessantes. Um dos links que ele passou com conteúdo para vermos foi &lt;a title="http://www.beautyoftheweb.com" href="http://www.beautyoftheweb.com"&gt;http://www.beautyoftheweb.com&lt;/a&gt;, que contém alguns exemplos de sites de “vanguarda”.&lt;/p&gt;  &lt;p align="justify"&gt;Como disse, hoje sábado foi o dia do “mão na massa”, com a oportunidade dos participantes fazerem os “hand-ons” contando com a presença do pessoal para ajudar em dúvidas. O material de hoje está disponível em &lt;a title="http://trainingkit.webcamps.ms/" href="http://trainingkit.webcamps.ms/,"&gt;http://trainingkit.webcamps.ms/,&lt;/a&gt; para que não pode participar, como eu.&lt;/p&gt;  &lt;p align="justify"&gt;Da agenda que estava proposta, ficou faltando uma apresentação sobre oData, que foi substituída por uma do &lt;a href="http://nuget.codeplex.com/" target="_blank"&gt;Nuget&lt;/a&gt;. Aliás, falando nesta ferramenta, nem coloquei neste blog que na &lt;a href="http://www.devmedia.com.br/post-19326-Revista--net-Magazine-Edicao-82.html" target="_blank"&gt;.NET Magazine 82&lt;/a&gt; saiu um artigo meu referente à ela.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img src="http://www.devmedia.com.br/loja/img/capa_net82_M.jpg" /&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Pronto, agora que fiz meu momento-publicidade, vamos voltar ao conteúdo da palestra sobre o Nuget. Em resumo, o Nuget é uma ferramenta open-source que permite encontrar e instalar nos nossos projetos do Visual Studio bibliotecas criadas por terceiros, por exemplo o NHibernate. O objetivo dela é facilitar, para que não precisemos ficar procurando na internet a última versão delas, etc. Um dos itens interessantes que foram apresentados sobre o Nuget é a facilidade com que temos para publicar nossos próprios pacotes no repositório oficial. Basta ir no site &lt;a title="http://www.nuget.org/" href="http://www.nuget.org/"&gt;http://www.nuget.org/&lt;/a&gt;, se cadastrar e você pode fazer o upload de um pacote contendo os componentes que você criou, disponibilizando para o mundo inteiro! Também foi mostrada a ferramenta Nuget Explorer (beta), que serve para visualizar os dados de um pacote para identificar seu conteúdo e os metadados associados.&lt;/p&gt;  &lt;p align="justify"&gt;Outra coisa que eu aproveitei e perguntei para o Phil era em relação à disponibilização de um comando de reparação de pacotes instalados, caso alguma referencia seja removida sem querer. O Nuget ainda não possui uma funcionalidade dessa, sendo necessário dar o comando de remover o pacote e readicioná-lo. Bom, sendo uma ferramenta open-source, qualquer um pode criar esta e outras funcionalidades e submeter para aprovação.&lt;/p&gt;  &lt;p&gt;Enfim, foi um evento bem legal!&lt;/p&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1785147813371252534?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1785147813371252534/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1785147813371252534&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1785147813371252534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1785147813371252534'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/03/webcamps-em-sao-paulo.html' title='Webcamps em São Paulo'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8365846677692057067</id><published>2011-02-26T20:56:00.001-08:00</published><updated>2011-02-26T21:11:01.615-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Templates e combos preenchidas</title><content type='html'>&lt;p align="justify"&gt;Estou usando o &lt;a href="http://api.jquery.com/category/plugins/templates/" target="_blank"&gt;plugin de template do jQuery&lt;/a&gt; em uma tela de um sistema que estou construindo, e encontrei o seuginte problema, que mostro no exemplo abaixo.&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KsM26_B4S10/TWnZTl01KGI/AAAAAAAAAgw/yKZ3B9PsERk/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_KsM26_B4S10/TWnZVX7ItQI/AAAAAAAAAg0/3gYmxsr7hug/image_thumb%5B1%5D.png?imgmax=800" width="454" height="272" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;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:&lt;/p&gt;  &lt;pre class="brush:html"&gt;&lt;p&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script src=&amp;quot;&lt;a href="http://code.jquery.com/jquery-latest.min.js&amp;quot;"&gt;http://code.jquery.com/jquery-latest.min.js&amp;quot;&lt;/a&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script src=&amp;quot;&lt;a href="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js&amp;quot;"&gt;http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js&amp;quot;&lt;/a&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script id=&amp;quot;templateLinha&amp;quot; type=&amp;quot;text/x-jquery-tmpl&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;${Cidade}&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;select&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;GO&amp;quot;&amp;gt;GO&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;SP&amp;quot;&amp;gt;SP&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;PR&amp;quot;&amp;gt;PR&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;RJ&amp;quot;&amp;gt;RJ&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/select&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(document).ready(function () {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#btnAdd&amp;quot;).click(function () {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var cidades = [{ Cidade: $(&amp;quot;#txtCidade&amp;quot;).val(), Estado: $(&amp;quot;#ddlEstado&amp;quot;).val()}];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#templateLinha&amp;quot;).tmpl(cidades).appendTo(&amp;quot;#listaCidades&amp;quot;).find(&amp;quot;select&amp;quot;).val(function (index, value) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return cidades[index].Estado;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input id=&amp;quot;txtCidade&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;select id=&amp;quot;ddlEstado&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;GO&amp;quot;&amp;gt;GO&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;SP&amp;quot;&amp;gt;SP&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;PR&amp;quot;&amp;gt;PR&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;RJ&amp;quot;&amp;gt;RJ&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/select&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;button id=&amp;quot;btnAdd&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Adicionar cidade&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;thead&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cidade&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Estado&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/thead&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;tbody id=&amp;quot;listaCidades&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Santo André&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;select&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;GO&amp;quot;&amp;gt;GO&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;SP&amp;quot; selected&amp;gt;SP&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;PR&amp;quot;&amp;gt;PR&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;RJ&amp;quot;&amp;gt;RJ&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/select&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Perceba que no código estou utilizando a funcionalidade de template para a inclusão da nova linha. Dentro da tag &amp;lt;script&amp;gt; chamada “templateLinha”, tenho todo o modelo que será utilizado para esta inclusão. Note que trata-se apenas de uma nova linha na tabela, contendo uma caixa de texto e uma combo. Veja que no lugar do valor da caixa de texto, eu coloquei &lt;em&gt;${Cidade}&lt;/em&gt;. É a partir da substituição desse campo que o modelo da linha será preenchido automaticamente (e veja também que, pela característica de um objeto do tipo &amp;lt;select&amp;gt;, não conseguimos fazer essa substituição, e este será nosso problema.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;No código que é executado no clique do botão, eu obtenho os valores que serão passados ao template, transformados em um array de objetos, e chamo a função abaixo, que faz com que os dados sejam aplicados no template “templateLinha”, e anexados no objeto “listaCidades”.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;$(&amp;quot;#templateLinha&amp;quot;).tmpl(cidades).appendTo(&amp;quot;#listaCidades&amp;quot;);&lt;/pre&gt;&lt;br /&gt;&lt;p align="justify"&gt;No entanto, ao executar, vemos que a combo não é preenchida com o valor que queremos (ela fica com o valor padrão, que é o primeiro da lista, “GO”). Isto ocorre pois não temos como substituir um valor dentro da tag &amp;lt;select&amp;gt; para que seja ajustado o valor da combo (diferentemente de um objeto do tipo &amp;lt;input&amp;gt;, que é apenas substituir o conteúdo da propriedade “value”).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_KsM26_B4S10/TWnZZX7X0XI/AAAAAAAAAg4/Cde9BOGrc38/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_KsM26_B4S10/TWnZaOftrfI/AAAAAAAAAg8/n4FmXTClrE8/image_thumb%5B3%5D.png?imgmax=800" width="454" height="272" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Neste caso específico, a resolução não pode ser feita apenas com o template do jQuery (minto, até consegue usando a &lt;a href="http://api.jquery.com/template-tag-if/" target="_blank"&gt;funcionalidade de “if” do plugin de Template do jQuery&lt;/a&gt;, mas se usar desta maneira terá que construir o código da combo na mão, e não poderá, por exemplo, utilizar um helper de geração de HTML como o método &lt;em&gt;Html.DropDownList()&lt;/em&gt; do ASP.NET MVC).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Bom, para resolver este problema de uma forma elegante, temos que contar com a função &lt;em&gt;.val(xxx)&lt;/em&gt; do jQuery, só que não passando um valor mas sim uma função que retorne este valor. Com isso, podemos fazer uma iteração nos valores do array, obtendo o dado correto. Veja o trecho do código alterado abaixo (destacado em azul).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $(document).ready(function () { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#btnAdd&amp;quot;).click(function () { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var cidades = [{ Cidade: $(&amp;quot;#txtCidade&amp;quot;).val(), Estado: $(&amp;quot;#ddlEstado&amp;quot;).val()}]; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#templateLinha&amp;quot;).tmpl(cidades).appendTo(&amp;quot;#listaCidades&amp;quot;).find(&amp;quot;select&amp;quot;).val(function (index, value) { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return cidades[index].Estado; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }); &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_KsM26_B4S10/TWnZa5aiipI/AAAAAAAAAhA/EX5MgqB3BOI/s1600-h/image%5B12%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_KsM26_B4S10/TWnZbqB3XZI/AAAAAAAAAhE/fVUTXPZE3sM/image_thumb%5B5%5D.png?imgmax=800" width="454" height="272" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Desta maneira, logo após a inclusão da linha na tabela, já fazemos a correção dos valores da combo.&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;[]’s e até a próxima!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8365846677692057067?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8365846677692057067/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8365846677692057067&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8365846677692057067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8365846677692057067'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2011/02/jquery-templates-e-combos-preenchidas.html' title='jQuery Templates e combos preenchidas'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_KsM26_B4S10/TWnZVX7ItQI/AAAAAAAAAg0/3gYmxsr7hug/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3790631811943803084</id><published>2010-12-27T16:39:00.001-08:00</published><updated>2010-12-27T16:39:05.223-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><title type='text'>Instalando Windows 7 – problema de HD / partição</title><content type='html'>&lt;p align="justify"&gt;Tenho um computador com 2 HD, e que estavam sendo utilizados da seguinte forma:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HD1:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Drive C:\ – Windows Vista&lt;/li&gt;      &lt;li&gt;Drive D:\ – Arquivos&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;HD2:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Drive F:\ – Arquivos&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Decidi instalar o Windows 7 nele. Fiz meus backups, coloquei o DVD do Win7 na máquina e dei boot. Na hora de escolher a partição, formatei a partição que estava instalado o Windows Vista e a informei para utilizada. Foi quando o setup do Win7 começou a reclamar de “Setup was unable to create a new system partition or locate an existing system partition”…&lt;/p&gt;  &lt;p align="justify"&gt;Que diabos era isso, o Vista estava funcinando ok nesta partição há uns 3 ou 4 anos…&lt;/p&gt;  &lt;p align="justify"&gt;Busquei na internet (sorte que eu estava com um netbook ao lado), e encontrei a solução: desliguei o segundo HD, aquele que tinha a partição F:\. Com isso, consegui escolher a partição para efetuar a instalação. Achei a solução estranha, mas o importante é que está funcionando…&lt;/p&gt;  &lt;p align="justify"&gt;Obs. Essa solução eu encontrei na seguinte thread de fórum: &lt;a title="http://arstechnica.com/civis/viewtopic.php?f=15&amp;amp;t=83939" href="http://arstechnica.com/civis/viewtopic.php?f=15&amp;amp;t=83939"&gt;http://arstechnica.com/civis/viewtopic.php?f=15&amp;amp;t=83939&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Vamos ver se eu tenho mais algum problema nessa instalação…, neste exato momento está há 83%…&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3790631811943803084?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3790631811943803084/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3790631811943803084&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3790631811943803084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3790631811943803084'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/12/instalando-windows-7-problema-de-hd.html' title='Instalando Windows 7 – problema de HD / partição'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3384768157439308488</id><published>2010-12-06T15:42:00.001-08:00</published><updated>2010-12-06T15:42:20.015-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>O pior é impossível? – parte 3</title><content type='html'>&lt;p&gt;Desta vez vamos deixar a seção de “Pérolas do Desenvolvimento” mais voltada para a especificação.&lt;/p&gt;  &lt;p&gt;Na UML, um diagrama de sequência é a representação gráfica da troca de mensagens entre objetos, mostrando essa interação durante o tempo de execução da funcionalidade. O que agrega neste diagrama é saber a sequência de acontecimentos, para podermos programar corretamente o comportamento esperado do sistema.&lt;/p&gt;  &lt;p&gt;Só que pra isso precisamos de mais detalhes…vejam o diagrama abaixo. O que ele agrega para nós? Nada, é a mesma coisa que falar “usuário usa o sistema”. Não dá detalhes de quais objetos estão envolvidos na funcionalidade (generalizou-se o objeto “Aplicação” como todos os objetos internos do sistema).&lt;/p&gt;  &lt;p&gt;Documentação boa é documentação que tráz valor ao desenvolvimento. Se não trouxer, só serve pra engordar o orçamento do projeto.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KsM26_B4S10/TP101tFFxFI/AAAAAAAAAfs/T143G9zyjbI/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_KsM26_B4S10/TP102tt0QYI/AAAAAAAAAfw/9eO4CxrAQco/image_thumb%5B1%5D.png?imgmax=800" width="350" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Obs. Não coloquei aqui, mas tem também o fluxo alternativo dessa funcionalidade…, que é igual ao fluxo básico…&lt;/p&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3384768157439308488?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3384768157439308488/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3384768157439308488&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3384768157439308488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3384768157439308488'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/12/o-pior-e-impossivel-parte-3.html' title='O pior é impossível? – parte 3'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_KsM26_B4S10/TP102tt0QYI/AAAAAAAAAfw/9eO4CxrAQco/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7626737722760608066</id><published>2010-11-24T16:20:00.001-08:00</published><updated>2010-11-24T16:20:30.806-08:00</updated><title type='text'>Obras Completas de Carl Barks</title><content type='html'>&lt;p align="justify"&gt;Finalmente, após alguns anos colecionando e gastos “caros” no Mercado Livre, consegui completar minha coleção das Obras Completas de Carl Barks.&lt;/p&gt;  &lt;p align="justify"&gt;Carl Barks foi o criador de vários personagens da Disney, entre eles o Pato Donald e o Tio Patinhas. Ele foi fonte de inspiração não apenas para pessoas que trabalham com quadrinhos mas também outros artistas. Um exemplo é Steven Spielberg. A cena inicial de Indiana Jones, onde ele é perseguido por uma rocha rolante, é baseada na história “As Cidades do Ouro”, de 1954.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_KsM26_B4S10/TO2ryNP5_aI/AAAAAAAAAfk/-HShPTzzFyc/s1600-h/P6090050%5B8%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Minha coleção" border="0" alt="Coleção das Obras Completas de Carl Barks" src="http://lh3.ggpht.com/_KsM26_B4S10/TO2rzMC9-3I/AAAAAAAAAfo/OGoE9yv7gYE/P6090050_thumb%5B3%5D.jpg?imgmax=800" width="644" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7626737722760608066?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7626737722760608066/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7626737722760608066&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7626737722760608066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7626737722760608066'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/11/obras-completas-de-carl-barks.html' title='Obras Completas de Carl Barks'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_KsM26_B4S10/TO2rzMC9-3I/AAAAAAAAAfo/OGoE9yv7gYE/s72-c/P6090050_thumb%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1987754731459920222</id><published>2010-08-27T18:25:00.001-07:00</published><updated>2010-08-27T18:26:30.629-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Pérolas do Desenvolvimento'/><title type='text'>O pior é impossível? – parte 2</title><content type='html'>&lt;p align="justify"&gt;Continuando a série de “pérolas do desenvolvimento”, temos esta chamada a um web service. Veja que forma inovadora de efetuar a chamada: através de um post http! Não há mais necessidade de se criar proxies!&lt;/p&gt;  &lt;p align="justify"&gt;E o pior de tudo, isso funciona!&lt;/p&gt;  &lt;p align="justify"&gt;Obs. Este método retorna um XML. Veja que é feito um tratamento no retorno obtido, para modificar HTML para que esteja num formato correto. Vários replaces…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KsM26_B4S10/THhlnRKLPKI/AAAAAAAAAfM/t90YB2-zlSs/s1600-h/perola%5B6%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="perola" border="0" alt="perola" src="http://lh5.ggpht.com/_KsM26_B4S10/THhloIIA8XI/AAAAAAAAAfQ/KLQSGgGIXo4/perola_thumb%5B4%5D.jpg?imgmax=800" width="644" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1987754731459920222?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1987754731459920222/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1987754731459920222&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1987754731459920222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1987754731459920222'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/08/o-pior-e-impossivel-parte-2.html' title='O pior é impossível? – parte 2'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_KsM26_B4S10/THhloIIA8XI/AAAAAAAAAfQ/KLQSGgGIXo4/s72-c/perola_thumb%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8276414342883930012</id><published>2010-08-11T16:48:00.001-07:00</published><updated>2010-08-11T16:48:54.058-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Composite e Chain of Responsibility</title><content type='html'>&lt;p&gt;Pessoal,&lt;/p&gt;  &lt;p&gt;saiu outro &lt;a href="http://www.devmedia.com.br/post-17691-Design-Patterns.html" target="_blank"&gt;artigo meu&lt;/a&gt; na &lt;a href="http://www.devmedia.com.br/post-17713-Revista--net-Magazine-Edicao-76.html" target="_blank"&gt;.NET Magazine 76&lt;/a&gt;, ainda a respeito de design patterns: nesta edição, eu abordo os padrões Composite e Chain of Responsibility.&lt;/p&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KsM26_B4S10/TGM24NLtFJI/AAAAAAAAAe8/_Rz2jQhfs24/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title=".NET Magazine 76" border="0" alt=".NET Magazine 76" src="http://lh3.ggpht.com/_KsM26_B4S10/TGM25HtXv1I/AAAAAAAAAfA/Ge5rjyz_MPg/image_thumb.png?imgmax=800" width="209" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8276414342883930012?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8276414342883930012/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8276414342883930012&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8276414342883930012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8276414342883930012'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/08/composite-e-chain-of-responsibility.html' title='Composite e Chain of Responsibility'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_KsM26_B4S10/TGM25HtXv1I/AAAAAAAAAfA/Ge5rjyz_MPg/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-376048839588683184</id><published>2010-08-01T15:06:00.001-07:00</published><updated>2010-08-01T15:09:29.797-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>MVP – Passive View</title><content type='html'>&lt;p align="justify"&gt;O MVP é um padrão para a construção de aplicações que interagem com o usuários (User Interface) que tem dois objetivos principais:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Separar as responsabilidades na camada de apresentação, ou seja, o que é da tela e o que é da lógica de negócio do aplicativo.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Facilitar os testes,&amp;#160; permitindo que os mesmos sejam automatizados.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;O pattern MVP pode ser separado em duas categorias: &lt;a href="http://www.martinfowler.com/eaaDev/PassiveScreen.html" target="_blank"&gt;Passive View&lt;/a&gt; e &lt;a href="http://www.martinfowler.com/eaaDev/SupervisingPresenter.html" target="_blank"&gt;Supervising Controller&lt;/a&gt;. A diferença entre os dois é o grau de testabilidade que cada um provê. Hoje iremos ver alguns detalhes da primeira categoria, com foco na questão de separação de responsabilidades.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_KsM26_B4S10/TFXv7XS48TI/AAAAAAAAAec/9XLTBrHwRpo/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Diagrama de classes MVP" border="0" alt="Diagrama de classes MVP" src="http://lh5.ggpht.com/_KsM26_B4S10/TFXv71lEvvI/AAAAAAAAAeg/oUflF-LFHmA/image_thumb%5B3%5D.png?imgmax=800" width="568" height="388" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;A idéia aqui é separarmos o que o que é da apresentação e o que é da lógica de acesso aos objetos do domínio de negócios. O diagrama acima mostra como temos essa separação entre as classes que compõe a estrutura básica do MVP Passive View. Do lado da camada de apresentação, temos a classe View, que no final das contas será uma tela WPF ou uma página ASP.NET. Do lado da lógica de negócios, temos a classe Model, que representa os dados que serão exibidos pela aplicação. Na intersecção das duas camadas está a interface IView, que veremos em breve deve ser implementada por todas as views (telas ou páginas) e a classe Presenter. A classe Presenter funciona como um meio-de-campo entre a camada de apresentação e a lógica de negócios.&lt;/p&gt;  &lt;p align="justify"&gt;Antes de prosseguirmos com um exemplo, vamos notar como é o relacionamento entre no diagrama acima. A classe Presenter é referenciada diretamente por View, mas Presenter não conhece View. Na verdade, ela conhece apenas a interface IView que é implementada por View, e é dessa forma que a conversa entre as duas ocorre. Por isso que este pattern é conhecido como Passive View, pois a view é manipulada, indiretamente, pela classe Presenter. Veja que em nenhum momento View acessa diretamente Model, o que provê a separação entre as camadas.&lt;/p&gt;  &lt;p align="justify"&gt;Vamos comentar o exemplo criado para ilustrar. Ele é uma tela fictícia de consulta de preços de ações (Bolsa de Valores), onde o usuário irá informar o código da ação (conhecido por “ticker”), e a aplicação retornará o valor atual da cotação. É claro que, como um exemplo, vou gerar estes valores de forma aleatória, para simplificar. Abaixo está como eu organizei a solution. Temos quatro projetos aqui:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;MVP.Domain – É o projeto que contém os objetos de negócio (Model). Numa solução distribuída do “mundo real”, estas classes ficariam hospedadas em um servidor de componentes e poderiam, por exemplo, serem expostas através de serviços &lt;a href="http://msdn.microsoft.com/pt-br/netframework/aa663324.aspx" target="_blank"&gt;WCF&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;MVP.Presentation – Este projeto faz parte da camada de apresentação / serviços e contém a classe que fará o meio-de-campo entre a interface e a chamada aos componentes de negócio.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;MVP.Task – No nosso exemplo, este projeto contém os componentes que compõem a camada de serviços de apresentação. Esta camada também faz um papel intermediário entre a camada de apresentação e a camada de componentes de negócios. Para o MVP, podemos considerá-la como uma abstração da classe Model (que está presente no exemplo em MVP.Domain).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;MVP.WPFUI – Este projeto é a camada de apresentação em si, e é composto de uma tela construída em &lt;a href="http://windowsclient.net/wpf/" target="_blank"&gt;WPF&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_KsM26_B4S10/TFXv8H4os0I/AAAAAAAAAek/QNgHAH9tJXI/s1600-h/image%5B12%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Solution" border="0" alt="Solution" src="http://lh6.ggpht.com/_KsM26_B4S10/TFXv8k8yj-I/AAAAAAAAAeo/nH9ihu9pLOA/image_thumb%5B5%5D.png?imgmax=800" width="301" height="388" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Começaremos pela interface que representa IVew: IStockSearchView. Esta interface possui algumas propriedades que ajustam valores, ou seja, que recebem valores e os colocarão em “algum lugar”. Veja que neste momento não interessa que lugar seja esse.&lt;/p&gt;  &lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace MVP.Presentation&lt;br /&gt;{&lt;br /&gt;    public interface IStockSearchView&lt;br /&gt;    {&lt;br /&gt;        string Ticker { set; }&lt;br /&gt;        double Price { set; }&lt;br /&gt;        string Message { set; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Em seguida temos a classe Presenter: StockSearchPresenter. Lembre-se que ela é o meio-de-campo com a interface e a classe Model. Olhe que interessante: no construtor de Presenter recebe-se um objeto que implementa IStockSearchView, e esta instância é armazenada em uma propriedade privada. No método SearchStock, que efetua a pesquisa de uma determinada ação, é o modelo (Model) é acessado através da classe StockSearchTask (camada de serviços da apresentação), e o resultado obtido é atribuído na view. Quem quer que seja este objeto que implementa IStockSearchView, ele está recebendo os valores passivamente. O que será que será feito com estes dados?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using MVP.Task;&lt;br /&gt;&lt;br /&gt;namespace MVP.Presentation&lt;br /&gt;{&lt;br /&gt;    public class StockSearchPresenter&lt;br /&gt;    {&lt;br /&gt;        private IStockSearchView _view = null;&lt;br /&gt;        private StockSearchTask _task = new StockSearchTask();&lt;br /&gt;&lt;br /&gt;        public StockSearchPresenter(IStockSearchView view)&lt;br /&gt;        {&lt;br /&gt;            _view = view;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void SearchStock(string ticker)&lt;br /&gt;        {&lt;br /&gt;            StockInfoVO info = _task.SearchStock(ticker);&lt;br /&gt;            _view.Price = info.IsValid ? info.Price : 0;&lt;br /&gt;            _view.Message = info.Message;&lt;br /&gt;            _view.Ticker = info.IsValid ? info.Ticker : ticker;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Antes de prosseguir, vamos dar uma olhada na camada de serviços de apresentação e o modelo de negócios.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;StockSearchTask é uma classe que acessa os componentes de negócio. Neste nosso exemplo, é uma chamada simples, mas na “vida real” esta chamada poderia ter sido feita através de um Web Service. Note que aqui a classe Task está fazendo uma abstração de como nós estamos acessando a camada de negócios. Veja também que ela faz uso de uma classe do tipo Value Object (StockInfoVO), ou seja, um objeto criado simplesmente para servidor de conteiner de informações, ou seja, este objeto não possui operações (comportamento).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using MVP.Domain;&lt;br /&gt;&lt;br /&gt;namespace MVP.Task&lt;br /&gt;{&lt;br /&gt;    public class StockSearchTask&lt;br /&gt;    {&lt;br /&gt;        public StockInfoVO SearchStock(string ticker)&lt;br /&gt;        {&lt;br /&gt;            StockInfoVO info = new StockInfoVO();&lt;br /&gt;            StockManager manager = new StockManager();&lt;br /&gt;            Stock stock = manager.SearchForStock(ticker);&lt;br /&gt;            info.IsValid = stock != null;&lt;br /&gt;            if (info.IsValid)&lt;br /&gt;            {&lt;br /&gt;                info.Ticker = stock.Ticker;&lt;br /&gt;                info.Price = stock.Price;&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;                info.Message = &amp;quot;Stock not found!&amp;quot;;&lt;br /&gt;            return info;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Outro detalhe importante deste objeto do tipo VO é que ele também ajuda a separar a camada de apresentação da de negócios, fazendo com que os tipos que nesta última existam não sejam conhecidos pela interface gráfica.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace MVP.Task&lt;br /&gt;{&lt;br /&gt;    public struct StockInfoVO&lt;br /&gt;    {&lt;br /&gt;        public string Ticker;&lt;br /&gt;        public double Price;&lt;br /&gt;        public bool IsValid;&lt;br /&gt;        public string Message;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Agora vamos a fundo no projeto dos componentes de negócio. Temos a classe Stock, que representa uma ação. Ela armazena o ticker da ação e possui um método que retorna seu preço (que aqui, como falamos, retorna um número aleatório).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace MVP.Domain&lt;br /&gt;{&lt;br /&gt;    public class Stock&lt;br /&gt;    {&lt;br /&gt;        public string Ticker { get; set; }&lt;br /&gt;        public double Price&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                // Gera um preço aleatório&lt;br /&gt;                Random random = new Random(Environment.TickCount);&lt;br /&gt;                return random.NextDouble() * 100;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Também temos a classe StockManager, que é responsável pelo gerenciamento das classes Stock. Aqui ela funciona como um agrupador de várias instâncias de Stock para nosso exemplo simples (temos apenas algumas empresas relacionadas aqui…, Petrobrás, Vale, Lojas Renner, etc.). O que ela faz, efetivamente, é manter uma lista dessas empresas em memória, e quando chamado o método SearchForStock(string), ele retorna uma dessas instâncias, caso ela exista (senão retorna null).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace MVP.Domain&lt;br /&gt;{&lt;br /&gt;    public class StockManager&lt;br /&gt;    {&lt;br /&gt;        private static List&lt;stock&gt; _stocks = new List&lt;stock&gt;() &lt;br /&gt;        {&lt;br /&gt;            new Stock(){ Ticker = &amp;quot;PETR3&amp;quot;},&lt;br /&gt;            new Stock(){ Ticker = &amp;quot;VALE5&amp;quot;},&lt;br /&gt;            new Stock(){ Ticker = &amp;quot;LREN3&amp;quot;},&lt;br /&gt;            new Stock(){ Ticker = &amp;quot;GGBR4&amp;quot;},&lt;br /&gt;            new Stock(){ Ticker = &amp;quot;ITUB3&amp;quot;},&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;        public Stock SearchForStock(string ticker)&lt;br /&gt;        {&lt;br /&gt;            Stock stock = (from s in _stocks&lt;br /&gt;                           where s.Ticker == ticker.ToUpper()&lt;br /&gt;                           select s).FirstOrDefault();&lt;br /&gt;            return stock;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Por fim, temos a própria tela em WPF. Veja que ela implementa IStockSearchView. As implementações das operações definidas nessa interface fazem a atribuição dos valores aos controles visuais que estão na ela (labels, por exemplo). No evento de clique do botão, temos a chamada a classe Presenter: No seu construtor, passamos a própria instância da tela (this). Executando o seu método SearchStock, passamos as informações necessárias a StockSearchPresenter para que ela possa acessar o modelo de negócios e trazer as informações que queremos.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_KsM26_B4S10/TFXv9Ku2f0I/AAAAAAAAAes/9BT2LM0yoek/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Tela em WPF" border="0" alt="Tela em WPF" src="http://lh3.ggpht.com/_KsM26_B4S10/TFXv9n6_yUI/AAAAAAAAAew/T2i8AbPzfrg/image_thumb.png?imgmax=800" width="244" height="148" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Windows;&lt;br /&gt;using MVP.Presentation;&lt;br /&gt;&lt;br /&gt;namespace MVP.WPFUI&lt;br /&gt;{&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Interaction logic for MainWindow.xaml&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    public partial class MainWindow : Window, IStockSearchView&lt;br /&gt;    {&lt;br /&gt;        public MainWindow()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Ticker&lt;br /&gt;        {&lt;br /&gt;            set { txtTicker.Text = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public double Price&lt;br /&gt;        {&lt;br /&gt;            set { lblPrice.Content = string.Format(&amp;quot;{0:c}&amp;quot;, value); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Message&lt;br /&gt;        {&lt;br /&gt;            set { lblMsg.Content = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void btnSearch_Click(object sender, RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            StockSearchPresenter presenter = new StockSearchPresenter(this);&lt;br /&gt;            presenter.SearchStock(txtTicker.Text);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Vimos aqui como fazer a separação entre a apresentação e o serviços de negócio, mas qual seria o esforço se precisássemos colocar essa funcionalidade em outra plataforma, por exemplo uma plataforma web? A criação da página seria bem simples, como podemos ver no código abaixo. Basta apenas fazer com que a própria página ASP.NET implemente IStockSearchView, acertar o que deve ser mudado quando suas propriedades forem chamadas e colocar o que deve ser feito quando o botão de pesquisa é clicado.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using MVP.Presentation;&lt;br /&gt;&lt;br /&gt;namespace MVP.ASPNETUI&lt;br /&gt;{&lt;br /&gt;    public partial class _Default : System.Web.UI.Page, IStockSearchView&lt;br /&gt;    {&lt;br /&gt;        protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Ticker&lt;br /&gt;        {&lt;br /&gt;            set { txtTicker.Text = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public double Price&lt;br /&gt;        {&lt;br /&gt;            set { lblPrice.Text = string.Format(&amp;quot;{0:c}&amp;quot;, value); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Message&lt;br /&gt;        {&lt;br /&gt;            set { lblMsg.Text = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected void btnSearch_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            StockSearchPresenter presenter = new StockSearchPresenter(this);&lt;br /&gt;            presenter.SearchStock(txtTicker.Text);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_KsM26_B4S10/TFXv-TQsTgI/AAAAAAAAAe0/G_OcaPSpyh8/s1600-h/image%5B19%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Página ASP.NET" border="0" alt="Página ASP.NET" src="http://lh5.ggpht.com/_KsM26_B4S10/TFXv_Tl2cEI/AAAAAAAAAe4/ScQQUpFXReY/image_thumb%5B10%5D.png?imgmax=800" width="644" height="379" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Com isso, percebemos como é feita a separação de responsabilidades entre a camada de apresentação e a camada de negócios. Com isso, temos menos código rodando na tela / página, o que facilita a manutenção e migração de plataforma dos sistemas que construímos.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Outra vantagem importante mas que não cobri neste post é a facilidade com que podemos criar testes automatizados nos sistemas, utilizando técnicas de mock.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-376048839588683184?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/376048839588683184/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=376048839588683184&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/376048839588683184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/376048839588683184'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/08/mvp-passive-view.html' title='MVP – Passive View'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_KsM26_B4S10/TFXv71lEvvI/AAAAAAAAAeg/oUflF-LFHmA/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1408159569692713694</id><published>2010-07-25T19:52:00.001-07:00</published><updated>2010-07-25T19:53:09.490-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Abusos dos design patterns</title><content type='html'>&lt;p align="justify"&gt;Recentemente recebi de um colega de trabalho um link de um artigo escrito por Rockford Lhotka, criador do framework de desenvolvimento de aplicações &lt;a href="http://www.lhotka.net/cslanet/" target="_blank"&gt;CSLA .NET&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Neste arquivo, ele comenta sobre o mau uso dos design patterns nas aplicações.&lt;/p&gt;  &lt;p align="justify"&gt;Ele condena o uso de padrões sem critério algum, ou seja, quando se faz o uso deles apenas por se “achar bonito”, sem se preocupar em realmente identificar um problema a ser resolvido. Isso acontece muito, principalmente quando se lança uma tecnologia nova ou um pattern se torna popular. Temos a tendência de nos “regogizarmos mentalmente” quando fazemos algo complexo.&lt;/p&gt;  &lt;p align="justify"&gt;Em resumo, o artigo cita que se deve:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Utilizar patterns quando se tem um problema a resolver e o padrão se aplica.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Utilizar o padrão quando suas qualidades superarem suas desvantagens (sim, nenhum pattern é perfeito, todos têm seu lado ruim).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Combinar padrões simples para enfrentar problemas complexos.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Quando usado um padrão, ter certeza que todos os desenvolvedores e analistas envolvidos no projeto tenham entendimento dele.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Tomar cuidado com a multiplicidade e dependência que o uso de determinados padrões de nível complexo possam trazer à sua aplicação (faz parte da análise de custo vs. benefício).&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Sem mais demoras, o link para o artigo é este:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="http://www.lhotka.net/weblog/OnTheUseAndMisuseOfPatterns.aspx" href="http://www.lhotka.net/weblog/OnTheUseAndMisuseOfPatterns.aspx"&gt;http://www.lhotka.net/weblog/OnTheUseAndMisuseOfPatterns.aspx&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1408159569692713694?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1408159569692713694/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1408159569692713694&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1408159569692713694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1408159569692713694'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/07/abusos-dos-design-patterns.html' title='Abusos dos design patterns'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-975518340047651934</id><published>2010-07-15T18:43:00.001-07:00</published><updated>2010-07-15T19:00:30.365-07:00</updated><title type='text'>Roger Waters + David Gilmour: novas esperanças?</title><content type='html'>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_KsM26_B4S10/TD-5LNAH3BI/AAAAAAAAAeU/b_qf0ZQc870/image%5B6%5D.png?imgmax=800" width="644" height="430" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.davidgilmourblog.com/2010/07/hoping-foundation.html" href="http://www.davidgilmourblog.com/2010/07/hoping-foundation.html"&gt;http://www.davidgilmourblog.com/2010/07/hoping-foundation.html&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Esta notícia foi muito animadora! No sábado passado, 10/07/2010, David Gilmour e Roger Waters tocaram juntos em um evento de caridade, voltado para crianças palestinas (&lt;a title="http://www.hopingfoundation.org/" href="http://www.hopingfoundation.org/"&gt;http://www.hopingfoundation.org/&lt;/a&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;As músicas que foram tocadas foram “To Know Him Is To Love Him” (usada na passagem de som do Pink Floyd), “Wish You Were Here”, “Comfortably Numb” e “Another Brick in the Wall (Part Two)”.&lt;/p&gt;  &lt;p align="justify"&gt;Em 2010 e 2011, Roger Waters fará uma turnê em comemoração dos 30 anos do álbum “The Wall”. Será que cabe uma visita ao Brasil? Quem sabe, com David Gilmour junto?&lt;/p&gt;  &lt;p align="justify"&gt;Esperança é a última que morre…&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-975518340047651934?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/975518340047651934/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=975518340047651934&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/975518340047651934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/975518340047651934'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/07/roger-waters-david-gilmour-novas.html' title='Roger Waters + David Gilmour: novas esperanças?'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_KsM26_B4S10/TD-5LNAH3BI/AAAAAAAAAeU/b_qf0ZQc870/s72-c/image%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-9021678723145631009</id><published>2010-07-03T20:02:00.001-07:00</published><updated>2010-07-03T20:10:56.119-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='WIA'/><title type='text'>Windows Image Acquisition</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Windows Image Acquisition (WIA) é uma API da Microsoft para manipulação de dispositivos como câmeras e scanners.&lt;/p&gt;  &lt;p align="justify"&gt;Tive o interesse em pesquisar esta API para a criação de um windows service em .NET que fique tirando fotos de tempos em tempos de quem está usando o computador e mandando para um site ou e-mail. Isso é bem útil no caso de roubo de notebooks…, pelo menos se pode ter a foto do maldito ladrão!&lt;/p&gt;  &lt;p align="justify"&gt;O que vou colocar aqui é um exemplo de código que faz a captura de uma imagem. Uma coisa bem simples, mas que deu um pouco de trabalho até entender legal como é que funciona essa API.&lt;/p&gt;  &lt;p align="justify"&gt;Antes de começar, é necessário dizer que esta API não funciona com todos os dispositivos. Bom, basicamente e teoricamente irá funcionar com dispositivos que estejam listados em Painel de Controle –&amp;gt; Scanners e câmeras. Por causa disso, esse exemplo que vou passar não funcionou no meu desktop, que possui uma &lt;a href="http://www.bright.com.br/produtos/webcams/0033_62.html" target="_blank"&gt;webcam da marca Bright&lt;/a&gt;. No entanto, funciona no meu netbook, que possui uma webcam embutida (Acer).&lt;/p&gt;  &lt;p align="justify"&gt;Bom, a primeira coisa a se fazer é baixar o SDK desta &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=a332a77a-01b8-4de6-91c2-b7ea32537e29&amp;amp;displaylang=en" target="_blank"&gt;biblioteca do site da Microsoft&lt;/a&gt;. Note que isso só é necessário com o Windows XP, pois o Vista já vem com ela instalada. As instruções de instalação vêm junto do pacote (não se esqueça de fazer isso senão não irá funcionar!).&lt;/p&gt;  &lt;p align="justify"&gt;Vamos criar uma tela simples Windows Form que apresente uma foto recém tirada. Um detalhe que esta API é COM, não é nativa .NET. Neste caso, precisaremos trabalhar com interop. Nada complicado, bastando fazer uma referência ao Microsoft Windows Image Acquisition v2.0.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_KsM26_B4S10/TC_5rhEA3BI/AAAAAAAAAd4/a7Rg6ZuSW8M/image%5B4%5D.png?imgmax=800" width="471" height="387" /&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Todo o código abaixo foi colocado em um evento de clique de botão (é uma aplicação para testes apenas, então não vou me preocupar muito com boas práticas de programação). Outro detalhe é que importei os namespaces &lt;em&gt;WIA&lt;/em&gt;, &lt;em&gt;System.IO&lt;/em&gt; e &lt;em&gt;System.Diagnostics&lt;/em&gt; neste exemplo.&lt;/p&gt;  &lt;p align="justify"&gt;A primeira coisa a ser feita é obter o ID do dispositivo que iremos utilizar. Como falei antes, está é uma API para uso de vários dispositivos, e precisamos escolher apenas um. Quando usamos a classe WIA.CommonDialog nos é exibida uma tela onde escolhemos qual dispositivo usar (essa tela é do Windows, não temos o controle dela). Um detalhe importante é que eu não consegui fazer a instância dessa classe através simplesmente de &lt;/p&gt;  &lt;pre class="brush:c#"&gt;CommonDialogClass class1 = new CommonDialogClass();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;, pois quando fazia isso o Visual Studio me retornava o erro “Interop type 'WIA.CommonDialogClass' cannot be embedded. Use the applicable interface instead.”. Resolvi isso através de late binding.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;O retorno desta seleção é um objeto do tipo Device, de onde podemos obter seu identificador único (ID).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;// Escolhe o dispositivo que será usado para tirar a foto&lt;br /&gt;string deviceId = string.Empty;&lt;br /&gt;ICommonDialog class1 = (ICommonDialog)Activator.CreateInstance(Type.GetTypeFromProgID(&amp;quot;WIA.CommonDialog&amp;quot;));&lt;br /&gt;Device d = class1.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);&lt;br /&gt;if (d != null)&lt;br /&gt;    deviceId = d.DeviceID.ToString();&lt;br /&gt;MessageBox.Show(string.Format(&amp;quot;O identificador do dispositivo é {0}&amp;quot;, deviceId));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_KsM26_B4S10/TC_5sP2pv2I/AAAAAAAAAd8/ZRfdG69C7fI/image%5B21%5D.png?imgmax=800" width="463" height="299" /&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_KsM26_B4S10/TC_5sqsmgmI/AAAAAAAAAeA/sTBzo18FRA4/image%5B22%5D.png?imgmax=800" width="433" height="104" /&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Com o ID em mãos, podemos conectar no dispositivo que será usado. Um detalhe importante é que eu não precisaria fazer isso, pois já obtive uma referência a um Device quando selecionei através da tela anterior. Mas é bom fazer isso já que como meu código vai rodar num windows service, não é interessante que fique sendo exibido sempre qual dispositivo utilizar.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;// Faz conexão com o dispositivo&lt;br /&gt;IDeviceManager manager = (IDeviceManager)Activator.CreateInstance(Type.GetTypeFromProgID(&amp;quot;WIA.DeviceManager&amp;quot;));&lt;br /&gt;Device device = null;&lt;br /&gt;foreach (DeviceInfo info in manager.DeviceInfos)&lt;br /&gt;{&lt;br /&gt;    if (info.DeviceID == deviceId)&lt;br /&gt;    {&lt;br /&gt;        device = info.Connect();&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Agora vem a parte principal, que é tirar a foto. Isso é feito através do envio de uma execução de comando através da instância da classe Device. O guid {AF933CAC-ACAD-11D2-A093-00C04F72DC3C} é padrão para comando de “tirar foto”, e existe &lt;a href="http://msdn.microsoft.com/en-us/library/ms630806%28VS.85%29.aspx" target="_blank"&gt;outros mais&lt;/a&gt;. Outra coisa que notei neste código é que ele demora bastante para rodar, uns 7 segundo até a foto ser tirada. Por isso coloque um cronômetro (StopWatch) no código para saber sempre quanto tempo a execução levou. Não sei como resolver isso, se é que dá para resolver, mas para o tipo de serviço que eu quero fazer, não vejo problemas por enquanto…&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;// Envia o comando para a câmera tirar uma foto&lt;br /&gt;Stopwatch watch = new Stopwatch();&lt;br /&gt;watch.Start();&lt;br /&gt;Item item = device.ExecuteCommand(&amp;quot;{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}&amp;quot;); // CommandID.wiaCommandTakePicture&lt;br /&gt;watch.Stop();&lt;br /&gt;MessageBox.Show(string.Format(&amp;quot;Foram necessários {0} milissegundos para tirar a foto.&amp;quot;, watch.ElapsedMilliseconds.ToString()));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_KsM26_B4S10/TC_5s-AXkzI/AAAAAAAAAeE/jK96QZ8cNek/image%5B23%5D.png?imgmax=800" width="300" height="104" /&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_KsM26_B4S10/TC_5uFcSCQI/AAAAAAAAAeI/oGNowcYsbYk/image%5B24%5D.png?imgmax=800" width="428" height="404" /&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Com o retorno da execução da foto, recebemos como retorno uma instância da classe Item, que é o item resultante do processo que foi feito. No nosso caso, uma foto. Com este objeto, podemos transferir seu conteúdo para uma instãncia da classe WIA.FileImage. E com este objeto, podemos chamar o método SaveFile para armazenarmos em disco. Isso eu faço para poder exibí-la em um controle do tipo PictureBox.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;// Salva a foto temporáriamente para exibição&lt;br /&gt;foreach (string format in item.Formats)&lt;br /&gt;{&lt;br /&gt;    if (format.ToUpper() == &amp;quot;{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}&amp;quot;)   // ImageFormat.Jpeg.Guid&lt;br /&gt;    {&lt;br /&gt;        WIA.ImageFile imagefile = item.Transfer(format) as WIA.ImageFile;&lt;br /&gt;        string filename = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + &amp;quot;.jpg&amp;quot;);&lt;br /&gt;        if (!string.IsNullOrEmpty(filename))&lt;br /&gt;        {&lt;br /&gt;            imagefile.SaveFile(filename);&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                this.pictureBox1.Load(filename);&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                File.Delete(filename);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    break;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Bom, com isso terminamos, certo? Não, ainda não…, a foto que tiramos ainda ficou armazenada na cãmera, precisamos removê-la para não ficar ocupando memória desnecessária. Para fazer isso, basta percorrer os itens do Device e remover o que tiver o mesmo ID da foto que foi tirada (Obs. Note que essa coleção de itens não começa com elemento na posição zero, mas sim na 1).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c#"&gt;// Remove a foto que ficou armazenada&lt;br /&gt;if (device.Items.Count &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;    int indice = 1;&lt;br /&gt;    foreach (IItem i in device.Items)&lt;br /&gt;    {&lt;br /&gt;        if (i.ItemID == item.ItemID)&lt;br /&gt;            break;&lt;br /&gt;        indice++;&lt;br /&gt;    }&lt;br /&gt;    device.Items.Remove(indice);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Agora sim terminamos este exemplo. Agora vou começar a fazer o windows service que espero nunca precisar ter que realmente usar, rs.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Boas fotos!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-9021678723145631009?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/9021678723145631009/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=9021678723145631009&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/9021678723145631009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/9021678723145631009'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/07/windows-image-acquisition.html' title='Windows Image Acquisition'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KsM26_B4S10/TC_5rhEA3BI/AAAAAAAAAd4/a7Rg6ZuSW8M/s72-c/image%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1754007589508518382</id><published>2010-07-03T19:02:00.001-07:00</published><updated>2010-07-03T19:12:48.606-07:00</updated><title type='text'>Vulnerabilidades de um Tiger</title><content type='html'>&lt;p align="justify"&gt;Achei interessante esta imagem, que mostra a lista de pontos fracos de um &lt;a href="http://en.wikipedia.org/wiki/Tiger_I" target="_blank"&gt;Tiger&lt;/a&gt; (tanque de guerra alemão, da Segunda Guerra Mundial).&lt;/p&gt;  &lt;p align="justify"&gt;O link original desta imagem é &lt;a title="http://www.lonesentry.com/articles/ttt_tigervulnerability/index.html" href="http://www.lonesentry.com/articles/ttt_tigervulnerability/index.html"&gt;http://www.lonesentry.com/articles/ttt_tigervulnerability/index.html&lt;/a&gt;, onde é explicado que ela se trata de uma tradução americana de um jornal sovietico. Na época em que foi publicado, os americamos haviam encontrado este carro de combate apenas algumas poucas vezes, durante batalhas contra o Afrika Korps e durante a invasão da Itália.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ttt_tiger_vulnerability" border="0" alt="ttt_tiger_vulnerability" src="http://lh6.ggpht.com/_KsM26_B4S10/TC_rrj9Yq5I/AAAAAAAAAd0/jCxLZyqG3-Q/ttt_tiger_vulnerability%5B5%5D.jpg?imgmax=800" width="504" height="674" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1754007589508518382?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1754007589508518382/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1754007589508518382&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1754007589508518382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1754007589508518382'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/07/vulnerabilidades-de-um-tiger.html' title='Vulnerabilidades de um Tiger'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KsM26_B4S10/TC_rrj9Yq5I/AAAAAAAAAd0/jCxLZyqG3-Q/s72-c/ttt_tiger_vulnerability%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-5283334071519476001</id><published>2010-06-07T17:31:00.001-07:00</published><updated>2010-07-03T19:13:18.955-07:00</updated><title type='text'>Krav Maga e Guinness!</title><content type='html'>&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="PHOTO_9494098_7691_4764480_ap_420X315" border="0" alt="PHOTO_9494098_7691_4764480_ap_420X315" src="http://lh6.ggpht.com/_KsM26_B4S10/TA2PSNAc1xI/AAAAAAAAAdw/cCEuSQzHsYE/PHOTO_9494098_7691_4764480_ap_420X315%5B3%5D.jpg?imgmax=800" width="244" height="163" /&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="http://community.guinnessworldrecords.com/_A-maior-aula-de-defesa-pessoal/BLOG/2376153/7691.html?widgetId=321868" href="http://community.guinnessworldrecords.com/_A-maior-aula-de-defesa-pessoal/BLOG/2376153/7691.html?widgetId=321868"&gt;http://community.guinnessworldrecords.com/_A-maior-aula-de-defesa-pessoal/BLOG/2376153/7691.html?widgetId=321868&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;No dia 28 de Maio, a comemoração do centenário de Imi Lichtenfeld reuniu em Copacabana 2212 alunos de Krav Maga, entre eles eu! Neste dia, entramos para o Guinness Book como a maior aula de defesa pessoal do mundo.&lt;/p&gt;  &lt;p align="justify"&gt;Gostei muito de ter participado. É bom quebrar a rotina de vez em quando. Foi a primeira vez que estive no Rio, e achei a cidade muito bonita.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-5283334071519476001?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/5283334071519476001/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=5283334071519476001&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5283334071519476001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5283334071519476001'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/06/krav-maga-e-guinness.html' title='Krav Maga e Guinness!'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KsM26_B4S10/TA2PSNAc1xI/AAAAAAAAAdw/cCEuSQzHsYE/s72-c/PHOTO_9494098_7691_4764480_ap_420X315%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-147670346439614301</id><published>2010-05-25T18:27:00.001-07:00</published><updated>2010-05-25T18:29:35.664-07:00</updated><title type='text'>O pior é impossível?</title><content type='html'>&lt;p align="justify"&gt;Sabemos que hoje a TI é uma das áreas que tem a melhor relação entre salário e tempo de aprendizado / experiência. O que quero dizer é que hoje uma pessoa que tem um mínimo necessário de instrução já consegue trabalhar recebendo um salário razoável. Isso, entre outras coisas, causado pela falta de regulamentação que temos na nossa categoria.&lt;/p&gt;  &lt;p align="justify"&gt;Com isso, várias pessoas que ainda não estão preparadas são atraídas para este ramo, e isso só traz desvantagens, como sistemas mal projetados e codificados. Isso se traduz em dores de cabeça para os demais analistas e programadores. Dou como exemplo a imagem abaixo, que foi tirada da vida real.&lt;/p&gt;  &lt;p align="justify"&gt;Vamos entender o problema que há nesse código.&lt;/p&gt;  &lt;p align="justify"&gt;Temos uma classe X (retirei os nomes e namespaces para evitar que a pessoa fique chateada), que será exposta em um serviço WCF. Podemos perceber isso pois ela é decorada com (ambos!) os atributos Serializable e DataContract. Ou seja, instâncias dessa classe serão trafegadas pela rede, seja através de TCP, HTTP ou qualquer outro binding disponível nesse framework, nas chamadas do serviço.&lt;/p&gt;  &lt;p align="justify"&gt;Agora perceba o que há dentro da classe. Temos membros que são instâncias de classes do ASP.NET (camada de interface da aplicação), como System.Web.UI.Page e HttpSessionState! O que foi feito foi acoplar tipos que não deveriam ser conhecidos na camada de serviços. Se amanhã esse serviço passa a ser consumido por um sistema que é construído em WPF, por que ter esse tipo de objeto envolvido na chamada?&lt;/p&gt;  &lt;p align="justify"&gt;A brilhante idéia que se teve aqui foi para apenas poder capturar informações da interface ASP.NET na camada de serviços, por exemplo o nome do usuário logado através da propriedade User.Identity.Name (na imagem não dá pra ver, mas acreditem, é isso), entre outros. Se há a necessidade disso, porque não trafegar essas informações em uma estrutura própria? Pra que ter esses objetos pesados instanciados sempre?&lt;/p&gt;  &lt;p align="justify"&gt;Nesse ponto, não dá apenas para culpar a pessoa que fez o código, mas principalmente que a colocou para trabalhar com uma tecnologia a qual ele ainda não está preparado. A pessoa pode não ser ruim, atire a primeira pedra quem nunca escreveu uma “pérola de programação”, o que falta é treinamento. Falta da parte de gerência uma visão de que para se efetuar trabalhos de qualidade é necessário investimento em pessoas bem treinadas, que gostem do que fazem e comprometidas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Pérola" border="0" alt="Pérola" src="http://lh4.ggpht.com/_KsM26_B4S10/S_x5CiWx8BI/AAAAAAAAAYc/gNUhFfqCJ90/image%5B18%5D.png?imgmax=800" width="753" height="812" /&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Obs. Infelizmente isso não se restringe a área de informática. Já vi pessoas formadas em Direito falando “cabeleleiro” e “mendingo”. É um triste retrato da instrução do nosso país.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-147670346439614301?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/147670346439614301/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=147670346439614301&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/147670346439614301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/147670346439614301'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/05/o-pior-e-impossivel.html' title='O pior é impossível?'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_KsM26_B4S10/S_x5CiWx8BI/AAAAAAAAAYc/gNUhFfqCJ90/s72-c/image%5B18%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-6028710149077402197</id><published>2010-05-12T19:17:00.001-07:00</published><updated>2010-05-12T19:31:33.836-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>O que são design patterns?</title><content type='html'>&lt;p align="justify"&gt;Design patterns não têm segredos: tratam-se de soluções bem experimentadas e documentadas para problemas comuns. São as boas soluções para problemas que sempre enfrentamos. E esse conceito não está relacionado apenas à TI (aliás, nem começou na TI, começou na engenharia).&lt;/p&gt;  &lt;p align="justify"&gt;Se observarmos, até na natureza existem tais conceitos de patterns. Tomemos como exemplo o vôo das aves. Existe um problema que é o desgaste que uma ave tem ao voar longas distâncias, geralmente em rotas migratórias. Para resolver esse problema, os pássaros voam em grupos, em uma formação “V”: dessa forma, as aves que estão atrás da primeira se aproveitam do vácuo gerado pelo vôo da líder, diminuindo o atrito com o ar e conseqüentemente diminuindo a energia gasta por elas. Quando o primeiro pássaro se cansa, ele vai para o final do grupo, e é substituído. Com isso, o grupo consegue uma autonomia de vôo em média 70% melhor do que se estivessem sozinhos. Este padrão de vôo é utilizado por aeronaves militares e também é muito comum em shows aéreos.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Gansos selvagens" border="0" alt="Gansos selvagens" src="http://lh6.ggpht.com/_KsM26_B4S10/S-thPrlwCJI/AAAAAAAAAYU/QOE5kpIER_8/image%5B9%5D.png?imgmax=800" width="319" height="236" /&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Thunderbolt III" border="0" alt="Thunderbolt III" src="http://lh4.ggpht.com/_KsM26_B4S10/S-thRK1kIrI/AAAAAAAAAYY/-z4L0s8yncc/image%5B15%5D.png?imgmax=800" width="322" height="230" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Voltando à TI, temos alguns patterns famosos da Orientação à Objetos, que foram descritos no “Design Patterns Elements of Reusable Object-Oriented Software”. São eles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Creacionais: Abstract Factory, Builder, Factory Method, Prototype e Singleton.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Estruturais: Adapter, Bridge, &lt;strong&gt;Composite&lt;/strong&gt;, Decorator, Facade, &lt;strong&gt;Flyweight&lt;/strong&gt; e Proxy.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Comportamentais: &lt;strong&gt;Chain of Responsibility&lt;/strong&gt;, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, &lt;strong&gt;Strategy&lt;/strong&gt;, Template Method e Visitor.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Vale muito a pena conhecer esses padrões, pois eles são muito úteis quando encaramos determinados problemas. Os patterns que eu marquei em negrito foram os que eu descrevi em artigos da .NET Magazine, que já foram lançados ou que serão lançados em breve.&lt;/p&gt;  &lt;p align="justify"&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-6028710149077402197?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/6028710149077402197/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=6028710149077402197&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6028710149077402197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6028710149077402197'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/05/o-que-sao-design-patterns.html' title='O que são design patterns?'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KsM26_B4S10/S-thPrlwCJI/AAAAAAAAAYU/QOE5kpIER_8/s72-c/image%5B9%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8377974464079997896</id><published>2010-05-09T15:25:00.001-07:00</published><updated>2010-05-09T15:25:18.520-07:00</updated><title type='text'>Backup de webmail</title><content type='html'>&lt;p align="justify"&gt;Preocupado com a possibilidade de perder as mensagens armazenadas no webmail que uso (Yahoo!), decidi fazer um backup dos meus e-mails.&lt;/p&gt;  &lt;p align="justify"&gt;No entanto, o próprio webmail não dá uma funcionalidade desse tipo (fazer o download das mensagens em algum formato que possa ser lido em qualquer programa de e-mail como o Outlook). Com isso, houve a necessidade de fazer uma “gambiarra”.&lt;/p&gt;  &lt;p align="justify"&gt;Decidi instalar o Mozilla Thunderbird pra baixar todas as minhas mensagens da caixa de entrada através de POP3 (felizmente o Yahoo! dá suporte para isso). Dessa forma, eu baixei todas as minhas mensagens (pra ser sincero, ainda estou baixando, pois é um processo demorado já que o POP3 só baixa o que está na caixa de entrada, e para fazer o backup das mensagens enviadas, por exemplo, estou tendo que movê-las da pasta Enviadas para a Entrada).&lt;/p&gt;  &lt;p align="justify"&gt;Bom, até aí é a metade da solução. Falta exportar essas mensagens em disco, para poder guardar em um DVD de backup.&lt;/p&gt;  &lt;p align="justify"&gt;Eu até poderia, mas não quero guardar os arquivos de armazenamento do próprio Thunderbird (esse arquivo fica em alguma subpasta dentro de &lt;em&gt;C:\Documents and Settings\&amp;lt;usuário&amp;gt;\Dados de aplicativos\Thunderbird\Profiles\&lt;/em&gt;), já que tenho receio que só com essa ferramenta é que eu poderia ler as mensagens. Então decidi que as exportaria para disco, em formato EML. O problema é que eu não consigo fazer isso de forma simples no Thunderbird, teria que salvar mensagem por mensagem, e isso demoraria muito tempo.&lt;/p&gt;  &lt;p align="justify"&gt;Por sorte, encontrei um add-in do Thunderbird que faz todo esse trabalho para mim. É o &lt;strong&gt;ImportExportTools&lt;/strong&gt;, e pode ser encontrado em &lt;a title="http://www.nic-nac-project.de/~kaosmos/mboximport-en.html" href="http://www.nic-nac-project.de/~kaosmos/mboximport-en.html"&gt;http://www.nic-nac-project.de/~kaosmos/mboximport-en.html&lt;/a&gt;. Com ele, é possível importar e exportar os e-mails entre o Thunderbird e qualquer dispositivo de armazenamento (ou seja, qualquer pasta em disco).&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_KsM26_B4S10/S-c2StcqLNI/AAAAAAAAAYM/FaUerLzBJi8/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_KsM26_B4S10/S-c2TXWZM8I/AAAAAAAAAYQ/BjQ97Dk1sj4/image_thumb%5B3%5D.png?imgmax=800" width="644" height="228" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Com isso, puder gerar esses arquivos em uma pasta local, e agora consigo fazer o backup em DVD. Só um detalhe que eu acharia bem interessante é se esse add-in, quando usada a opção de salvar em formato HTML, também armazenasse os arquivos anexos das minhas mensagens. Com isso, ficaria bem melhor, já que eu não precisaria de nenhum programa para ler os arquivos em formato EML.&lt;/p&gt;  &lt;p align="justify"&gt;Mas, de qualquer maneira, meus e-mails estão salvos de qualquer problema que venha a ocorrer com o serviço gratuito de e-mail do Yahoo! (nunca me deixou na mão, mas vai que um dia deixe…).&lt;/p&gt;  &lt;p align="justify"&gt;Obs. Não sei se existe uma melhor forma pra fazer esse backup, uma forma mais rápida e fácil, de repente um programa já pronto que me poupe todo o trabalho. Se houver, agradeço sugestões!&lt;/p&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8377974464079997896?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8377974464079997896/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8377974464079997896&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8377974464079997896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8377974464079997896'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/05/backup-de-webmail.html' title='Backup de webmail'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KsM26_B4S10/S-c2TXWZM8I/AAAAAAAAAYQ/BjQ97Dk1sj4/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2940396429815445852</id><published>2010-04-27T20:45:00.001-07:00</published><updated>2010-04-27T20:46:13.715-07:00</updated><title type='text'>Primeira graduação!</title><content type='html'>&lt;p align="justify"&gt;&lt;em&gt;Krav Magá ou Krav Maga (em hebraico: קרב מגע, &amp;quot;combate próximo/de contato&amp;quot;) é um sistema de combate corpo a corpo eclético, desenvolvido em Israel, que envolve técnicas de luta, agarramento e golpeamento. O Krav Magá é derivado de habilidades de briga de rua, desenvolvidas por Imi Lichtenfeld, que fez uso de seu treinamento como boxeador e lutador profissional, como um modo de defender o quarteirão Judeu durante o período de ativismo anti-semita em Bratislava da metade ao fim de 1930. No fim de 1940, após sua imigração para Israel, ele começou a fornecer treinamento em combate corpo-a-corpo para o que se tornaria as Forças de Defesa de Israel, desenvolvendo as técnicas que se tornaram conhecidas como Krav Magá. Desde então ele tem sido aperfeiçoado para ambas aplicações, civis e militares. (Wikipédia - &lt;a title="http://pt.wikipedia.org/wiki/Krav_Mag%C3%A1" href="http://pt.wikipedia.org/wiki/Krav_Mag%C3%A1"&gt;http://pt.wikipedia.org/wiki/Krav_Mag%C3%A1&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Depois de muito treinar, recentemente recebi minha primeira graduação, a faixa amarela! &lt;/p&gt;  &lt;p&gt;Pra quem tiver interesse, mais detalhes em &lt;a href="http://www.kravmaga.com.br"&gt;www.kravmaga.com.br&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2940396429815445852?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2940396429815445852/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2940396429815445852&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2940396429815445852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2940396429815445852'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/04/primeira-graduacao.html' title='Primeira graduação!'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4541458602282176329</id><published>2010-04-18T14:59:00.001-07:00</published><updated>2010-04-18T15:08:16.705-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Strategy + Flyweight</title><content type='html'>&lt;p&gt;Pessoal,&lt;/p&gt;  &lt;p&gt;escrevi um artigo sobre design patterns na &lt;a href="http://www.devmedia.com.br/resumo/default.asp?ed=72&amp;amp;site=1" target="_blank"&gt;edição 72 da .NET Magazine&lt;/a&gt;. Ele foca em cima dos padrões &lt;a href="http://www.devmedia.com.br/post-16452-Design-Patterns-Strategy-e-Flyweight.html" target="_blank"&gt;Strategy e Flyweight&lt;/a&gt;. A idéia foi dar um conceito geral sobre esses padrões, e depois criar uma aplicação onde se faça uso deles ao mesmo tempo. Isso surgiu da questão onde eu achava na Internet apenas exemplos isolados de uso de patterns, quase impossível encontrar coisas onde o uso era combinado. Espero que gostem!&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.devmedia.com.br/loja/img/capa_net72_G.jpg" /&gt; &lt;/p&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4541458602282176329?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4541458602282176329/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4541458602282176329&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4541458602282176329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4541458602282176329'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/04/strategy-flyweight.html' title='Strategy + Flyweight'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4083873895420551456</id><published>2010-02-21T11:51:00.000-08:00</published><updated>2010-02-21T11:53:39.514-08:00</updated><title type='text'>Dicas para manter a vida útil de uma bateria de notebook</title><content type='html'>&lt;p&gt;Obs. As dicas se referem à uma bateria de lítio!&lt;/p&gt;  &lt;p&gt;1. A pior situação possível para a bateria é usá-la com o notebook na tomada: sempre remova a bateria nestas situações, pois senão a bateria ficará sempre em um estado de carregar e descarregar. Neste caso, mantenha a bateria fora do notebook com uns 40% da sua carga (lembre-se de usar o notebook ligado em um estabilizador ou no-break). Não as deixe fora do notebook totalmente descarregadas.&lt;/p&gt;  &lt;p&gt;2. Reduza o calor que cerca a bateria. Calor aumenta a taxa na qual a bateria envelhece, resultando em perda do tempo de vida. Em casa, isso significa manter o notebook longe de carpete ou qualquer outro isolante que faça com que a temperatura do laptop aumente.&lt;/p&gt;  &lt;p&gt;3. Não fique descarregando totalmente e carregando totalmente a bateria, isso diminui seu tempo de vida.&lt;/p&gt;  &lt;p&gt;4. Às vezes a bateria precisa ser descarregada e recarregada por completo. Enquanto isto é mau quando feito constrantemente, fazê-lo a cada 3 ou 4 semanas mantém a precisão do medidor da bateria. O medidor digital utilizado pelos notebooks para rastrear quanto tempo resta de uma bateria se torna menos e menos preciso quando a bateria é parcialmente carregada ou descarregada.&lt;/p&gt;  &lt;p&gt;5. Mantenha a bateria em um lugar fresco. No entanto, nunca deixe uma bateria de lítio em um freezer.&lt;/p&gt;  &lt;p&gt;Sites de onte eu compilei (ou copiei, rs) estas dicas:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://labnol.blogspot.com/2006/03/10-tips-to-make-your-laptop-battery.html"&gt;http://labnol.blogspot.com/2006/03/10-tips-to-make-your-laptop-battery.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dvhardware.net/article13731.html"&gt;http://www.dvhardware.net/article13731.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Lithium_ion_batteries#Guidelines_for_prolonging_lithium-ion_battery_life"&gt;http://en.wikipedia.org/wiki/Lithium_ion_batteries#Guidelines_for_prolonging_lithium-ion_battery_life&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ehow.com/how_5240852_care-notebook-battery.html"&gt;http://www.ehow.com/how_5240852_care-notebook-battery.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4083873895420551456?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4083873895420551456/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4083873895420551456&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4083873895420551456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4083873895420551456'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/02/dicas-para-manter-vida-util-de-uma.html' title='Dicas para manter a vida útil de uma bateria de notebook'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-5833495782638661531</id><published>2010-02-08T10:15:00.000-08:00</published><updated>2011-08-07T11:26:48.558-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Obtendo usuários de grupo AD</title><content type='html'>&lt;p&gt;Abaixo está um simples código para se obter os usuários que pertencem a determinado grupo de AD. Este snippet percorre recursivamente o AD, preenchendo um arraylist com os usuários nele presentes.&lt;/p&gt;  &lt;p&gt;É uma Console Application, e recebe como parâmetros o nome do grupo (ex.: &lt;strong&gt;Grp-Desenvolvedores&lt;/strong&gt;) e o LDAP (ex.: &lt;strong&gt;LDAP://DC=dominio,DC=com,DC=br&lt;/strong&gt;)&lt;/p&gt;  &lt;pre class="brush:c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.DirectoryServices;&lt;br /&gt;using System.IO;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;namespace ADUsersFromGroup&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static ArrayList _userNames = new ArrayList();&lt;br /&gt;        static ArrayList _groupNames = new ArrayList();&lt;br /&gt; &lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&amp;quot;Informe o nome do grupo AD e pressione ENTER: &amp;quot;);&lt;br /&gt;            string group = Console.ReadLine();&lt;br /&gt;            string ldap = Console.ReadLine();&lt;br /&gt;            ArrayList list = GetADGroupUsers(group, ldap);&lt;br /&gt;            using (StreamWriter sr = new StreamWriter(&amp;quot;c:\\usuarios.txt&amp;quot;, false))&lt;br /&gt;            {&lt;br /&gt;                foreach (var item in list)&lt;br /&gt;                    sr.WriteLine(&amp;quot;{0}&amp;quot;, item);&lt;br /&gt;            }&lt;br /&gt;            Console.WriteLine(&amp;quot;********** FIM **********&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        static ArrayList GetADGroupUsers(string groupName, string ldap)&lt;br /&gt;        {&lt;br /&gt;            SearchResultCollection results;&lt;br /&gt;            DirectorySearcher search = new DirectorySearcher(ldap);&lt;br /&gt;            search.Filter = String.Format(&amp;quot;(cn={0})&amp;quot;, groupName);&lt;br /&gt;            results = search.FindAll();&lt;br /&gt;            foreach (SearchResult result in results)&lt;br /&gt;            {&lt;br /&gt;                ResultPropertyCollection resultPropColl = result.Properties;&lt;br /&gt;                foreach (Object memberColl in resultPropColl[&amp;quot;member&amp;quot;])&lt;br /&gt;                {&lt;br /&gt;                    DirectoryEntry gpMemberEntry = new DirectoryEntry(&amp;quot;LDAP://&amp;quot; + memberColl);&lt;br /&gt;                    System.DirectoryServices.PropertyCollection userProps = gpMemberEntry.Properties;&lt;br /&gt;                    object objetoAD = userProps[&amp;quot;sAMAccountName&amp;quot;].Value;&lt;br /&gt;                    if ((userProps[&amp;quot;objectClass&amp;quot;].Value as object[]).Contains&amp;lt;object&amp;gt;("group"))&lt;br /&gt;                    {&lt;br /&gt;                        // valida se já percorremos este grupo&lt;br /&gt;                        if (!_groupNames.Contains(objetoAD))&lt;br /&gt;                        {&lt;br /&gt;                            _groupNames.Add(objetoAD.ToString());&lt;br /&gt;                            Console.WriteLine("Explodindo membros do grupo {0} ...", objetoAD);&lt;br /&gt;                            GetADGroupUsers(objetoAD.ToString());&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        if (!_userNames.Contains(objetoAD))&lt;br /&gt;                        {&lt;br /&gt;                            _userNames.Add(objetoAD.ToString());&lt;br /&gt;                            Console.WriteLine("      Incluindo {0} ...", objetoAD);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            return _userNames;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;UPDATE 2011-08-07 : colocando o SyntaxHighlighter no código.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-5833495782638661531?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/5833495782638661531/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=5833495782638661531&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5833495782638661531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5833495782638661531'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/02/obtendo-usuarios-de-grupo-ad.html' title='Obtendo usuários de grupo AD'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4485109717269966446</id><published>2010-01-10T13:25:00.001-08:00</published><updated>2010-01-10T13:25:20.697-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSI'/><category scheme='http://www.blogger.com/atom/ns#' term='Office'/><title type='text'>Problema: Instalando Office 2007 em um netbook</title><content type='html'>&lt;p align="justify"&gt;Ganhei um netbook (Acer Aspire One D250) no Natal. Decidi instalar o Windows XP nele para ir usando, enquanto eu não pego um Windows 7 (32 bits, por sinal, pois esse modelo de netbook só suporta esta arquitetura).&lt;/p&gt;  &lt;p align="justify"&gt;Após instalar o Windows XP, através do USB (utilizei o aplicativo &lt;a href="http://wintoflash.com/"&gt;WinToFlash&lt;/a&gt; para copiar o setup de instalação do CD para o pen drive), precisei instalar o Office 2007.&lt;/p&gt;  &lt;p align="justify"&gt;Durante a instalação do Office, ocorreu um problema e não consegui terminá-la. O erro está na imagem abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_KsM26_B4S10/S0pFvPOZnyI/AAAAAAAAAX0/u9s-QezIzyI/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_KsM26_B4S10/S0pFvwKI1gI/AAAAAAAAAX4/_V0BGws_nag/image_thumb%5B1%5D.png?imgmax=800" width="437" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;O setup reclamou que não conseguiu atualizar uma dll chamada &lt;strong&gt;fp4autl.dll&lt;/strong&gt; que fica em c:\arquivos de programas\arquivos comuns\microsoft shared\web server extensions\40\bin\. Fui neste diretório e esta dll não existia.&lt;/p&gt;  &lt;p align="justify"&gt;Procurando na Internet, encontrei um &lt;a href="http://forums.techarena.in/office-setup/627360.htm"&gt;caso similar&lt;/a&gt;. Parece que este problema ocorre pelo fato de ter instalado o sistema operacional no netbook pela USB (talvez a aplicação que move o setup para o pen drive tenha feito alguma alteração…).&lt;/p&gt;  &lt;p align="justify"&gt;Bom, para resolver basta copiar a dll que está no setup (dentro do arquivo &amp;lt;drive de instalação&amp;gt;\I386\FP40EXT.CAB) para a pasta que ela deveria estar.&lt;/p&gt;  &lt;p align="justify"&gt;Depois, foi só reiniciar a instalação do Office que tudo se resolveu!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4485109717269966446?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4485109717269966446/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4485109717269966446&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4485109717269966446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4485109717269966446'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2010/01/problema-instalando-office-2007-em-um.html' title='Problema: Instalando Office 2007 em um netbook'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KsM26_B4S10/S0pFvwKI1gI/AAAAAAAAAX4/_V0BGws_nag/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1224525940497080122</id><published>2009-10-26T17:28:00.001-07:00</published><updated>2009-10-26T17:28:10.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>GAC vs. &lt;codeBase&gt;</title><content type='html'>&lt;p&gt;Onde trabalho, não faz muito tempo que fomos questionados sobre boas práticas e o bom uso de assemblies .NET no GAC (Global Assembly Cache). Sinceramente, o melhor uso do GAC é não utilizá-lo, pelo menos no contexto que as aplicações aqui são desenvolvidas.&lt;/p&gt;  &lt;p&gt;As aplicações, com excessão das que são utilitários e frameworks, geralmente são isoladas no que se diz respeito a reaproveitamento de código. Então, o uso do GAC não se justifica para essa maioria dos casos.&lt;/p&gt;  &lt;p&gt;Umas das coisas legais que aprendi enquanto dava uma olhada no assunto foi utilizar melhor as configurações de runtime, mais especificamente em relação ao codebase.&lt;/p&gt;  &lt;p&gt;Com esta configuração, é possível indicar o caminho de um assembly que deve ser utilizado pela aplicação, estando ela onde estiver na máquina ou inclusive na rede! Com isso, acabou a desculpa de colocar um componente no GAC apenas porque a aplicação, seja ela windows ou web, não consegue encontrá-lo. GAC é para compartilhar, como o próprio nome diz.&lt;/p&gt;  &lt;p&gt;E como fazer com que o runtime encontre o assembly? Simplesmente adicionando a seguinte configuração ao arquivo config:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;      &lt;br /&gt;&amp;lt;configuration&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;runtime&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;assemblyBinding xmlns=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dependentAssembly&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;assemblyIdentity name=&amp;quot;&lt;strong&gt;CodebaseLib&lt;/strong&gt;&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; publicKeyToken=&amp;quot;&lt;strong&gt;72eb1259ccc328b1&lt;/strong&gt;&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; culture=&amp;quot;&lt;strong&gt;neutral&lt;/strong&gt;&amp;quot; /&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;codeBase version=&amp;quot;&lt;strong&gt;1.0.0.0&lt;/strong&gt;&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; href=&amp;quot;&lt;strong&gt;file://D:\Projetos\Testes\TesteCodebase\CodebaseLib\bin\Debug\CodebaseLib.dll&lt;/strong&gt;&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/dependentAssembly&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/assemblyBinding&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/runtime&amp;gt;       &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Cada assembly que precisa ser encontrado deve ter uma tag &lt;strong&gt;dependentAssembly&lt;/strong&gt;, contendo as tags &lt;strong&gt;assemblyIdentity&lt;/strong&gt; e &lt;strong&gt;codeBase&lt;/strong&gt;. A própria configuração é auto-explicativa: com assemblyIdentity, se identifica o componente, informando o nome, a cultura, o publicKeyToken (no caso de componentes com strong name); codeBase informa a versão e onde encontrar o componente.&lt;/p&gt;  &lt;p&gt;Aqui cabem duas observações:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;href&lt;/strong&gt; pode fazer referência tanto a um arquivo em disco como um arquivo na internet (poderia ser http://www.meusite.com.br/CodebaseLib.dll). &lt;/li&gt;    &lt;li&gt;Caso o componente tenha strong name, então ele pode se localizar em qualquer lugar; já se ele não possuir então deve estar em um subdiretório do diretório da aplicação.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;[]’s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1224525940497080122?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1224525940497080122/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1224525940497080122&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1224525940497080122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1224525940497080122'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/10/gac-vs.html' title='GAC vs. &amp;lt;codeBase&amp;gt;'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-38749541802019611</id><published>2009-10-16T07:25:00.000-07:00</published><updated>2009-10-16T07:31:02.922-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='InstallShield'/><category scheme='http://www.blogger.com/atom/ns#' term='COM+'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Installer'/><title type='text'>Detection of product '{0}', feature 'Base_And_Client', component '{1}' failed</title><content type='html'>Finalmente consegui resolver o problema que estava tendo com o Windows Installer e o COM+ de uma forma aceitável.&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;O Problema&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;O problema inicial foi quando criei um instalador, utilizando o InstallShield, para empacotar um aplicativo que utilizamos onde trabalho, que havia sido migrado de .NET 1.1 para .NET 2.0. Este aplicativo é composto de componentes .NET 1.1 (para manter a compatibilidade com versões de sistemas que usam esse runtime), .NET 2.0 com windows services e COM+ (também para manter compatibilidade).&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;A compatibilidade foi necessária para fazer com que os sistemas que utilizassem a versão em .NET 1.1 desse aplicativo pudessem passar a utilizar a nova, sem a necessidade de alterações em código. E para manter a compatibilidade, foi criado o pacote COM+ citado acima, para ser o divisor de águas entre os runtimes 1.1 e 2.0, permitindo as chamadas.&lt;br /&gt;&lt;br /&gt;Quando este pacote foi instalado nos servidores de componentes, a cada chamada do aplicativo, eram logados os eventos abaixo, além de ter um pequeno atraso na execução do mesmo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_KsM26_B4S10/StiCo24engI/AAAAAAAAAU4/MjBW5PqAvdc/s1600-h/1.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5393204192214949378" style="WIDTH: 289px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://4.bp.blogspot.com/_KsM26_B4S10/StiCo24engI/AAAAAAAAAU4/MjBW5PqAvdc/s320/1.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;em&gt;Detection of product '{3FAE8AAC-EA51-4060-8181-7FC647E5EC9E}', feature 'Base_And_Client', component '{5A249606-8811-4E9D-BF61-36E04087B112}' failed. The resource '' does not exist.&lt;/em&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;em&gt;&lt;/em&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;em&gt;&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_KsM26_B4S10/StiC6POQdbI/AAAAAAAAAVA/4H28tOn1y2Q/s1600-h/2.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5393204490806523314" style="WIDTH: 289px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://3.bp.blogspot.com/_KsM26_B4S10/StiC6POQdbI/AAAAAAAAAVA/4H28tOn1y2Q/s320/2.JPG" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;em&gt;Detection of product '{3FAE8AAC-EA51-4060-8181-7FC647E5EC9E}', feature 'Base_And_Client' failed during request for component '{3E87C314-FFBB-4F7F-A52C-609189873BB3}'&lt;/em&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;O produto {3FAE8AAC-EA51-4060-8181-7FC647E5EC9E} é o aplicativo que foi migrado para .NET 2.0. O componente {3E87C314-FFBB-4F7F-A52C-609189873BB3} é o componente que fica no COM+, responsável por rotear as chamadas vindas do .NET 1.1 para .NET 2.0 e o componente {5A249606-8811-4E9D-BF61-36E04087B112} é o componente que fez a chamada ao componente do COM+. Ambos também são instalados no GAC.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Obs. Utilizar COM+ para fazer a interoperabilidade entre as versões do runtime do .NET talvez não tenha sido a melhor idéia. Poderia ter utilizado .NET Remoting ou mesmo Web Services para isso, mas esse questionamento fica para depois.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;A Análise&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Como introduzimos o instalador MSI para empacotar o aplicativo, minha desconfiança caiu sobre o Windows Installer. Após algumas pesquisas, descobri que existe uma funcionalidade no Windows Installer chamada “resiliency” (comentei sobre ela neste post &lt;a href="http://galorebr.blogspot.com/2009/09/windows-installer-application.html"&gt;http://galorebr.blogspot.com/2009/09/windows-installer-application.html&lt;/a&gt;). Basicamente ela restaura uma instalação caso um componente não seja encontrado.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Parecia que a CLR do .NET 1.1 não encontrava o componente COM+ em .NET 2.0, mesmo estando no GAC. Talvez isso seja porque existem diferenças de localização do GAC entre essas versões do runtime: a primeira coloca as dll’s em C:\WINDOWS\assembly\GAC, a segunda em C:\WINDOWS\assembly\GAC_MSIL.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Utilizando o Filemon (&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx"&gt;http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx&lt;/a&gt;), não encontrei evidências de não se encontrar o arquivo.&lt;br /&gt;A próxima análise foi utilizando o log do Fusion (&lt;a href="http://blogs.msdn.com/suzcook/archive/2003/05/29/57120.aspx"&gt;http://blogs.msdn.com/suzcook/archive/2003/05/29/57120.aspx&lt;/a&gt;). Com isso, conseguimos identificar que o CLR tomava um capote quando tentava achar o componente do COM+. Um detalhe que percebemos é que o erro acontecia quando o sistema que chamava nosso aplicativo se encontrava no COM+ também (.NET 1.1). Um dos locais onde era pesquisada a existência da dll era o diretório C:\Windows\System32\.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Como o CLR não encontrava a dll, chamava o Windows Installer para perguntar por que ela não existia (&lt;a href="http://msdn.microsoft.com/en-us/library/15hyw9x3(VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/15hyw9x3(VS.71).aspx&lt;/a&gt;, If Assembly2 is not found at either of those locations, the runtime queries the Windows Installer ). Isso é que provavelmente ocasionava a tentativa de reparação.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;A Solução&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Talvez não seja a solução ideal, nem a mais bela, mas funcionou. Simplesmente colocamos uma cópia do componente que vai no COM+ dentro do diretório C:\Windows\System32\. Com isso, o CLR localiza o componente e não pergunta nada ao Windows Installer.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Somente uma ressalva, não fizemos testes quando os sistemas que chamam nosso aplicativo possuem a propriedade Application Root Directory ajustada no COM+. Com isso, teoricamente o CLR não iria procurar no System32. Mas se isso acontecer, podemos ajudar no arquivo de config desse sistema para localizar o componente no lugar certo, através do Probing (&lt;a href="http://msdn.microsoft.com/en-us/library/4191fzwb(VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/4191fzwb(VS.71).aspx&lt;/a&gt;.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Ufa, finalmente este problema foi resolvido!&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;[]’s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-38749541802019611?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/38749541802019611/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=38749541802019611&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/38749541802019611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/38749541802019611'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/10/detection-of-product-0-feature.html' title='Detection of product &apos;{0}&apos;, feature &apos;Base_And_Client&apos;, component &apos;{1}&apos; failed'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KsM26_B4S10/StiCo24engI/AAAAAAAAAU4/MjBW5PqAvdc/s72-c/1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-450764871561258678</id><published>2009-09-20T14:31:00.001-07:00</published><updated>2009-09-20T14:34:50.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='resiliency'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Installer'/><title type='text'>Windows Installer &amp; Application Resiliency</title><content type='html'>Atualmente tenho lido sobre uma característica do Windows Installer, que é a "resiliência" (não encontrei ainda tradução para resiliency).&lt;br /&gt;&lt;br /&gt;Trata-se de uma característica onde o próprio serviço do Windows Installer consegue identificar se um produto instalado está saudável, ou seja, se todos seus componentes estão instalados e configurados, etc etc.&lt;br /&gt;&lt;br /&gt;O seguinte artigo é muito bom, pois explica um pouco mais sobre a forma que a resiliência funciona: (Application Resiliency: Unlock the Hidden Features of Windows Installer) &lt;a href="http://msdn.microsoft.com/en-us/library/aa302344.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa302344.aspx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-450764871561258678?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/450764871561258678/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=450764871561258678&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/450764871561258678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/450764871561258678'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/09/windows-installer-application.html' title='Windows Installer &amp; Application Resiliency'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8953368623503045961</id><published>2009-08-20T06:53:00.000-07:00</published><updated>2009-08-20T06:56:06.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rational Clear Case'/><category scheme='http://www.blogger.com/atom/ns#' term='SGEN'/><category scheme='http://www.blogger.com/atom/ns#' term='Source Control'/><title type='text'>Erro ao executar o SGEN</title><content type='html'>Hoje encontrei um problema ao tentar compilar um projeto dentro do Source Control (no caso, Rational Clear Case).&lt;br /&gt;&lt;br /&gt;Este projeto em C# faz referência a um web service, e por isso no processo de compilação é chamado o SGEN para gerar dll *.XmlSerializers.dll. Pra ser sincero não sei porque esta dll deve existir, isso fica para um próximo post. A questão agora é como resolver o problema.&lt;br /&gt;&lt;br /&gt;O erro que ocorreu foi o abaixo. Deu access denied na hora de executar o SGEN em cima do meu projeto, sendo que este projeto faz referência a componentes (FxCopSdk.dll) que fazem parte do Source Control (ou seja, estão com o atributo read-only).&lt;br /&gt;&lt;br /&gt;&lt;em&gt;------ Rebuild All started: Project: bba.fwk.vbp.rules.code, Configuration: Release Any CPU ------c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:TRACE /reference:..\..\04_referencias\FxCop\FxCopSdk.dll /reference:..\..\04_referencias\FxCop\Microsoft.Cci.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.EnterpriseServices.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug:pdbonly /filealign:512 /optimize+ /out:obj\Release\bba.fwk.vbp.rules.code.dll /resource:FwkCodeRuleResource.xml,bba.fwk.vbp.rules.code.FwkCodeRuleResource.xml /target:library DoNotExceedMaximumLinesOfCode.cs FwkCodeConfig.cs FwkCodeRule.cs MayExceedSomeNumberOfLinesOfCode.cs Properties\AssemblyInfo.cs Properties\Settings.Designer.cs "Web References\webReferences\Reference.cs"&lt;br /&gt;Compile complete -- 0 errors, 0 warningsC:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sgen.exe /assembly:Z:\bf_view_C02_BBACQ00298239\ADMCOMP_01\BBA_Framework\02_FWK.Net_v2\16_Validador_BP_SQL\00_Implementacao\00_Fontes\bba.fwk.vbp.rules.code\obj\Release\bba.fwk.vbp.rules.code.dll /proxytypes /reference:..\..\04_referencias\FxCop\FxCopSdk.dll /reference:..\..\04_referencias\FxCop\Microsoft.Cci.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.EnterpriseServices.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll &lt;strong&gt;SGEN : error : Could not load file or assembly 'FxCopSdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. Access is denied.&lt;/strong&gt;Done building project "bba.fwk.vbp.rules.code.csproj" -- FAILED.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;A solução que encontrei foi desativar ("Off") a opção "Generate serialization assembly". Com isso, a dll *.XmlSerializers.dll não é gerada, e não passamos pelo problema.&lt;br /&gt;&lt;br /&gt;Agora a questão é pra que serve "Generate serialization assembly"..., mas isso fica pra depois...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_KsM26_B4S10/So1VhTL1swI/AAAAAAAAAUw/rL11K2NdFog/s1600-h/untitled.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5372043961096844034" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 188px" alt="" src="http://2.bp.blogspot.com/_KsM26_B4S10/So1VhTL1swI/AAAAAAAAAUw/rL11K2NdFog/s320/untitled.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8953368623503045961?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8953368623503045961/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8953368623503045961&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8953368623503045961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8953368623503045961'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/08/erro-ao-executar-o-sgen.html' title='Erro ao executar o SGEN'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KsM26_B4S10/So1VhTL1swI/AAAAAAAAAUw/rL11K2NdFog/s72-c/untitled.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8263072810589894379</id><published>2009-07-23T08:33:00.000-07:00</published><updated>2009-07-23T08:43:20.275-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSI'/><category scheme='http://www.blogger.com/atom/ns#' term='Installer'/><title type='text'>Windows Installer CleanUp Utility - MSIZap</title><content type='html'>&lt;div&gt;Vira e mexe temos um problema onde não conseguimos desinstalar um MSI instalado, onde não temos mais o arquivo .msi. Quando tentamos remover, aparece uma mensagem informando que a referência ao arquivo não é encontrada.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Para remediar, existe uma aplicação (Windows Installer CleanUp Utility) que faz a limpeza da instalação MSI no registry.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Note que ela não desinstala o produto, só remove as referências. A desinstalação fica por sua parte...&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;A aplicação lista todos os produtos instalados, e remove os que você selecionou usando o MSIZAP.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Segue KB &lt;a href="http://support.microsoft.com/kb/290301/en-us"&gt;http://support.microsoft.com/kb/290301/en-us&lt;/a&gt; e onde baixar &lt;a href="http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe"&gt;http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe&lt;/a&gt;.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_KsM26_B4S10/SmiEjTaJA8I/AAAAAAAAAQ8/Ga46KIMSE24/s1600-h/msizap.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5361681098424779714" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 317px" alt="" src="http://1.bp.blogspot.com/_KsM26_B4S10/SmiEjTaJA8I/AAAAAAAAAQ8/Ga46KIMSE24/s320/msizap.JPG" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8263072810589894379?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8263072810589894379/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8263072810589894379&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8263072810589894379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8263072810589894379'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/07/windows-installer-cleanup-utility.html' title='Windows Installer CleanUp Utility - MSIZap'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KsM26_B4S10/SmiEjTaJA8I/AAAAAAAAAQ8/Ga46KIMSE24/s72-c/msizap.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3114712989731194158</id><published>2009-06-07T11:25:00.001-07:00</published><updated>2009-06-07T11:31:06.503-07:00</updated><title type='text'>Diferenças entre fundos DI e Renda Fixa</title><content type='html'>Trechos tirados de um artigo do UOL, de autoria de Sophia Camargo (&lt;a href="http://economia.uol.com.br/financas/investimentos/2009/06/05/ult5346u189.jhtm"&gt;http://economia.uol.com.br/financas/investimentos/2009/06/05/ult5346u189.jhtm&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Referenciados DI&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Os fundos referenciados DI são investimentos considerados conservadores e costumam ser usados para proteger o patrimônio do investidor, pois são atrelados à taxa de juros interbancária, o chamado CDI (Certificado de Depósito Interbancário), que por sua vez acompanha a variação da taxa básica de juros da economia brasileira, a Selic.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Quando a Selic aumenta, o rendimento do fundo DI sobe; quando a Selic cai, o mesmo ocorre com o fundo DI. Como estamos em um processo de queda da taxa de juros, a rentabilidade dos fundos DI tende a cair também.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;As regras da CVM (Câmara de Valores Mobiliários), que regulamenta o setor de fundos, são bem rígidas quando se trata de fundos referenciados. Estes devem conter na sua denominação o seu indicador de desempenho (no caso, o CDI), e devem atender todas as seguintes condições: ter no mínimo 80% de seu patrimônio líquido em títulos emitidos pelo Tesouro Nacional ou Banco Central ou títulos e valores mobiliários de renda fixa cujo emissor esteja classificado na categoria baixo risco de crédito, com certificação por agência de classificação de risco localizada no País (por exemplo, CDB de grandes bancos).&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Além disso, 95% da carteira destes fundos deve ser composta por ativos que visem acompanhar a variação desse indicador de desempenho. A atuação no mercado de derivativos também deve ficar restrita a operações que tenham objetivo de proteger as posições.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Renda Fixa&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Pelas regras da CVM, os chamados fundos de renda fixa devem possuir 80% da carteira em ativos relacionados diretamente aos principais fatores de risco da carteira que podem ser a variação da taxa de juros do país ou um índice de inflação, ou ambas.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Como estes fundos buscam uma rentabilidade mais elevada do que a dos fundos DI, trabalham com um nível de risco também maior. De que maneira? Os gestores compram ativos prefixados ou pós-fixados, que podem ser títulos do Tesouro e do Banco Central, além de CDBs, RDBs e debêntures, dependendo da expectativa de queda ou elevação da taxa de juros do país.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Mas, diferentemente dos fundos referenciados DI, em que 80% dos títulos têm de ser obrigatoriamente de baixo risco, nos fundos de renda fixa não existe essa obrigatoriedade. Daí o risco maior.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Dentro desta categoria de fundos encontram-se os renda fixa tradicionais e os que embutem médio e alto risco, inserindo em suas carteiras ativos que oferecem uma maior probabilidade de ganho, mas que também podem representar perdas expressivas no patrimônio de seus clientes. &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Também pelas regras da CVM, todos os fundos que operem com derivativos capazes resultar em perdas patrimoniais ou, em especial, levar à ocorrência de patrimônio líquido negativo, deverão conter esta advertência ao investidor logo na capa do prospecto e também em todo o material de divulgação.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3114712989731194158?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3114712989731194158/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3114712989731194158&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3114712989731194158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3114712989731194158'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/06/diferencas-entre-fundos-di-e-renda-fixa.html' title='Diferenças entre fundos DI e Renda Fixa'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1190575025459168064</id><published>2009-05-21T19:49:00.001-07:00</published><updated>2011-09-11T14:18:31.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Configuration Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Apertem os cintos, o Configuration Manager sumiu!</title><content type='html'>Por algum motivo que foge a razão, o Configuration Manager havia sumido do meu Visual Studio 2008. Não conseguia encontrar a opção para compilar as minhas soluções em Debug ou Release. Coisa de louco.&lt;br /&gt;&lt;br /&gt;Reparei a instalação do Visual Studio, e nada... até que encontrei o seguinte post: &lt;a href="http://blogs.msdn.com/saraford/archive/2008/03/05/did-you-know-how-to-pretend-the-configuration-manager-doesn-t-exist-besides-closing-your-eyes-and-saying-i-don-t-see-you-165.aspx"&gt;http://blogs.msdn.com/saraford/archive/2008/03/05/did-you-know-how-to-pretend-the-configuration-manager-doesn-t-exist-besides-closing-your-eyes-and-saying-i-don-t-see-you-165.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nele se explica que para que o Configuration Manager apareça, é necessário que uma opção esteja marcada nas configurações do Visual Studio. É a “Show advanced build configuration”, e fica em Tools --&amp;gt; Options --&amp;gt; Project and Solutions --&amp;gt; General.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_KsM26_B4S10/ShYS3ZgczpI/AAAAAAAAAQ0/nViYJFpcO0o/s1600-h/Untitled.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5338475151243398802" src="http://2.bp.blogspot.com/_KsM26_B4S10/ShYS3ZgczpI/AAAAAAAAAQ0/nViYJFpcO0o/s320/Untitled.jpg" style="cursor: hand; height: 186px; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Após selecionar (e ainda quero descobrir com certeza o que aconteceu para ela ser removida), o Configuration Manager voltou. O Solution Configuration (aquela combo que mostra Debug e Release) voltou a aparece, agora posso configurar opções para compilações em Debug e Release, criar novas configurações, etc.&lt;br /&gt;&lt;br /&gt;Fica essa dica se isso acontecer com você...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE: Se ele ainda assim não aparece, adicione-o através da customização da barra de ferramentas, clicando com o botão direito sobre ela e clicando em "Customize", no menu de contexto. Abaixo está uma imagem para ficar mais fácil de achar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_KsM26_B4S10/SnY1PXLjRtI/AAAAAAAAARE/zlvALdzAnKw/s1600-h/Untitled.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5365534544095299282" src="http://1.bp.blogspot.com/_KsM26_B4S10/SnY1PXLjRtI/AAAAAAAAARE/zlvALdzAnKw/s320/Untitled.jpg" style="cursor: hand; height: 247px; width: 320px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1190575025459168064?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1190575025459168064/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1190575025459168064&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1190575025459168064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1190575025459168064'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/05/apertem-os-cintos-o-configuration.html' title='Apertem os cintos, o Configuration Manager sumiu!'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KsM26_B4S10/ShYS3ZgczpI/AAAAAAAAAQ0/nViYJFpcO0o/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2674442259232779847</id><published>2009-05-13T18:08:00.000-07:00</published><updated>2009-05-18T14:06:40.338-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='add-in'/><category scheme='http://www.blogger.com/atom/ns#' term='Office'/><title type='text'>Add-in VSTO Excel não carregando em Terminal Service</title><content type='html'>Há algum tempo trabalhei em um projeto que precisou de uma solução envolvendo add-in VSTO para Excel. Era uma aplicação onde o usuário informava alguns dados na planilha e executava determinada funcionalidade no add-in que enviava esses dados para processamento no servidor.&lt;br /&gt;&lt;br /&gt;Esta solução foi implantada há aproximadamente um ano, e funciona ok. Ela costuma ser instalada diretamente nas máquinas dos usuários.&lt;br /&gt;&lt;br /&gt;Recentemente nos deparamos com um problema. Essa solução, quando instalada em servidores de terminal service, não funciona. O add-in não aparece para os usuários. Nem mesmo ele aparece nos “Disabled Items”, que é o local onde são exibidos os add-ins que não conseguiram carregar no Excel.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_KsM26_B4S10/SgtvY240NCI/AAAAAAAAAQk/ePJSD_BfFRA/s1600-h/1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5335480656391844898" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 198px" alt="" src="http://1.bp.blogspot.com/_KsM26_B4S10/SgtvY240NCI/AAAAAAAAAQk/ePJSD_BfFRA/s320/1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Excel 2003 – no menu “Help”, clicar em “About Microsoft Office Excel” e depois em “Disabled Items”)&lt;br /&gt;&lt;br /&gt;Obs. Há algum tempo, coloquei no blog como verificar erros no carregamento de add-ins (&lt;a href="http://galorebr.blogspot.com/2008/03/nas-ltimas-semanas-estive-trabalhando.html"&gt;http://galorebr.blogspot.com/2008/03/nas-ltimas-semanas-estive-trabalhando.html&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Ao tentar adicionar o add-in “na unha”, através da janela COM Add-in e selecionando a respectiva dll, aparecia uma mensagem dizendo que meu add-in não era um add-in válido ("&lt;caminho&gt;.dll is not a valid Office add-in".).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_KsM26_B4S10/Sgtved5EpgI/AAAAAAAAAQs/uhq2FzPVgyo/s1600-h/2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5335480752761251330" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 212px" alt="" src="http://3.bp.blogspot.com/_KsM26_B4S10/Sgtved5EpgI/AAAAAAAAAQs/uhq2FzPVgyo/s320/2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Resolvi ir atrás de como o Excel e o VSTO carregam os ad-ins. Encontrei um artigo no site do MSDN, que explica que o Excel busca algumas chaves no registry para fazê-lo (&lt;a href="http://msdn.microsoft.com/en-us/library/bb386106.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb386106.aspx&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Nele, vi que as seguintes chaves precisam existir:&lt;br /&gt;Para o Office 2003:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Microsoft\Office\application name\Addins\add-in ID&lt;/li&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Classes\add-in ID\CLSID&lt;/li&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}&lt;/li&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\InprocServer32&lt;/li&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\ProgID&lt;/li&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\Programmable&lt;/li&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\VersionIndependentProgID&lt;/li&gt;&lt;/ul&gt;Para o Office 2007:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HKEY_CURRENT_USER\Software\Microsoft\Office\application name\Addins\add-in ID&lt;/li&gt;&lt;/ul&gt;Mais detalhes estão no artigo, mas o problema que acontecia era que essas chaves não estavam cadastradas para o usuário (cada usuário que loga no servidor possui sei HKEY_CURRENT_USER).&lt;br /&gt;&lt;br /&gt;A solução que tivemos foi fazer a importação dessas chaves através de um script que é executado quando o usuário loga no servidor pela primeira vez. Dessa maneira, foi possível com que o add-in aparecesse! Inclusive ela funcionou com o Citrix!&lt;br /&gt;&lt;br /&gt;Uma observação: escolhemos essa solução de importar as chaves para cada usuário ao invés de importá-las no HKEY_LOCAL_MACHINE (que é acessível a todos os usuários) por causa do Office 2007, que só enxerga os add-ins que estão no HKCU.&lt;br /&gt;&lt;br /&gt;[]’s&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Em tempo, abaixo estão os scripts utilizados na importação das chaves. Veja que tanto Reg_XYZ.vbs quanto XYZ.reg devem estar localizados na pasta c:\Reg_XYZ\.&lt;br /&gt;Para fazer com que cada usuário execute o script ao efetuar o login, devemos colocar a linha o call “c:\Reg_XYZ\Reg_XYZ.vbs no arquivo c:\windows\system32\usrlogon.cmd (pode ser logo após o primeiro comando @Echo Off).&lt;br /&gt;&lt;br /&gt;A idéia dos scripts é primeiro verificar se existe um arquivo txt. Se já existir, então quer dizer que as chaves já foram importadas. Se não existir, então quer dizer que as chaves devem ser importadas. Logo após a importação, é gerado um txt para marcar que o usuário está ok com as chaves.&lt;br /&gt;&lt;br /&gt;Obs. Royalties ao Luiz Alberto Valente, que escreveu esta parte.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Reg_XYZ.vbs&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Call verificatxt&lt;br /&gt;Set WshShell = WScript.CreateObject("WScript.Shell")&lt;br /&gt;WshShell.Run "reg import C:\Reg_XYZ\XYZ.reg"&lt;br /&gt;Call criatxt&lt;br /&gt;'Funcao Verifica se o Script Ja foi executado&lt;br /&gt;Function Verificatxt&lt;br /&gt;Const USER_PROFILE = &amp;amp;H28&amp;amp;&lt;br /&gt;Set objShell = CreateObject("Shell.Application")Set objFolder = objShell.Namespace(USER_PROFILE)Set objFolderItem = objFolder.Self&lt;br /&gt;caminho = objFolderItem.Path &amp;amp; "\XYZ.txt"&lt;br /&gt;Set objFSO = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;If objFSO.FileExists(caminho) Then    Wscript.quitEnd If End Function&lt;br /&gt;'Funcao cria o log de validacao&lt;br /&gt;Function criatxt&lt;br /&gt;Const USER_PROFILE = &amp;amp;H28&amp;amp;&lt;br /&gt;Set objShell = CreateObject("Shell.Application")Set objFolder = objShell.Namespace(USER_PROFILE)Set objFolderItem = objFolder.Self&lt;br /&gt;caminho = objFolderItem.Path &amp;amp; "\XYZ.txt"&lt;br /&gt;Set objFSO = CreateObject("Scripting.FileSystemObject")Set objFile = objFSO.CreateTextFile(caminho)&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;XYZ.reg&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Windows Registry Editor Version 5.00&lt;br /&gt;[HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\galore.XYZ.ui.XYZExcel2003Addin]"Manifest"="C:\\Program Files\\FABRICANTE\\XYZ\\galore.XYZ.ui.XYZExcel2003Addin.dll.manifest""LoadBehavior"=dword:00000003"Description"="galore XYZ - Addin para Excel 2003""FriendlyName"="galore XYZ - v. Excel 2003""CommandLineSafe"=dword:00000001&lt;br /&gt;[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}]@="galore.XYZ.ui.XYZExcel2003Addin -- an addin created with VSTO technology"&lt;br /&gt;[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\InprocServer32]"ManifestLocation"="C:\\Program Files\\FABRICANTE\\XYZ\\""ThreadingModel"="Both"@=hex(2):25,00,43,00,6f,00,6d,00,6d,00,6f,00,6e,00,50,00,72,00,6f,00,67,00,72,\  00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,4d,00,69,00,63,00,\  72,00,6f,00,73,00,6f,00,66,00,74,00,20,00,53,00,68,00,61,00,72,00,65,00,64,\  00,5c,00,56,00,53,00,54,00,4f,00,5c,00,38,00,2e,00,30,00,5c,00,41,00,64,00,\  64,00,69,00,6e,00,4c,00,6f,00,61,00,64,00,65,00,72,00,2e,00,64,00,6c,00,6c,\  00,00,00"ManifestName"="galore.XYZ.ui.XYZExcel2003Addin.dll.manifest"&lt;br /&gt;[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\ProgID]@="galore.XYZ.ui.XYZExcel2003Addin"&lt;br /&gt;[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\Programmable]&lt;br /&gt;[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\VersionIndependentProgID]@="galore.XYZ.ui.XYZExcel2003Addin"&lt;br /&gt;[HKEY_CURRENT_USER\Software\Classes\galore.XYZ.ui.XYZExcel2003Addin]@=""&lt;br /&gt;[HKEY_CURRENT_USER\Software\Classes\galore.XYZ.ui.XYZExcel2003Addin\CLSID]@="{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2674442259232779847?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2674442259232779847/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2674442259232779847&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2674442259232779847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2674442259232779847'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/05/add-in-vsto-excel-nao-carregando-em.html' title='Add-in VSTO Excel não carregando em Terminal Service'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KsM26_B4S10/SgtvY240NCI/AAAAAAAAAQk/ePJSD_BfFRA/s72-c/1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1445035814176286151</id><published>2009-04-28T14:24:00.001-07:00</published><updated>2009-05-21T19:53:03.275-07:00</updated><title type='text'>COM+ e problemas de memória</title><content type='html'>Onde trabalho possuímos uma infra que serve de façade para a chamada de componentes dos sistemas de forma remota. Esta forma remota pode ser desde estações de usuário para servidores de componentes, servidores web para servidores de componentes e mesmo entre servidores de componentes. Ela é um pacote COM+, e chama componentes que estão também hospedados no COM+ (temos muito legado aqui, vai demorar para sair dessa tecnologia).&lt;br /&gt;&lt;br /&gt;Recentemente deparamos com um problema de alto consumo de memória do nosso processo dllhost.&lt;br /&gt;&lt;br /&gt;Pedimos um dump deste processo (windbg), e ao analisar, encontrei muitas entradas de System.OutOfMemoryException. Ao verificar a causa dessas exceptions, encontrei a seguinte mensagem: Retrieving the COM class factory for component with CLSID {6DEDD69A-065F-4781-90A7-35E0E0DEB4BA} failed due to the following error: 8007000e. O componente que está se querendo instanciar é um DTO nosso, e não está sendo possível pelo erro de falta de memória.&lt;br /&gt;&lt;br /&gt;Encontrei um KB que fala sobre isso: &lt;a href="http://support.microsoft.com/?scid=kb%3Ben-us%3B890425&amp;amp;x=7&amp;amp;y=14"&gt;http://support.microsoft.com/?scid=kb%3Ben-us%3B890425&amp;amp;x=7&amp;amp;y=14&lt;/a&gt;, e talvez possa relacionado. Ele diz que o RPC tem uma limitação de quantidade de interfaces únicas que podem ser chamadas entre processos no COM+. Como resultado, erros de OutOfMemory (8007000e) podem aparecer.&lt;br /&gt;&lt;br /&gt;Ainda não temos um parecer final, mas estamos seguindo por essa linha para resolver a questão.&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;br /&gt;UPDATE - 21/05/2009:&lt;br /&gt;&lt;br /&gt;Desistimos de tentar descobrir o problema neste servidor (acontece em apenas uma máquina, outros executam o mesmo sistema sem o erro)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1445035814176286151?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1445035814176286151/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1445035814176286151&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1445035814176286151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1445035814176286151'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/04/com-e-problemas-de-memoria.html' title='COM+ e problemas de memória'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2532666329394341682</id><published>2009-03-17T17:18:00.000-07:00</published><updated>2009-03-17T17:19:32.528-07:00</updated><title type='text'>Um ano de blog e meia dúzia de posts...</title><content type='html'>Agora que eu percebi..., o blog fez um ano com alguns posts esporádicos, rsrs. Bom, tá valendo, hehe&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2532666329394341682?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2532666329394341682/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2532666329394341682&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2532666329394341682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2532666329394341682'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/03/um-ano-de-blog-e-meia-duzia-de-posts.html' title='Um ano de blog e meia dúzia de posts...'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4678522854053602988</id><published>2009-03-14T15:56:00.000-07:00</published><updated>2009-03-14T16:05:15.108-07:00</updated><title type='text'>Cakewalk Sonar 7 sem som</title><content type='html'>Fiquei muito feliz nesses últimos dias ao instalar uma nova versão do Cakewalk (agora chamado Sonar) e abrir alguns projetos de músicas da época qu eeu era um aspirante a músico.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Um ar nostalgico pairou ao meu redor...&lt;br /&gt;&lt;br /&gt;No entanto, não consegui ouvir as músicas de primeira. Não tenho equipamento profissional, e para usar esse tipo de programa me valho de MIDI, só que não estava configurado para utilizá-lo, e ao executar a música nada se ouvia.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bom, tive que seguir os passos abaixo, que foram tirados do seguinte post: &lt;a href="http://74.125.95.132/search?q=cache:Ps7c-BK3QyQJ:forum.cakewalk.com/fb.asp%3Fgo%3Dnext%26m%3D1304455%26viewType%3Dtm+sonar+7+no+sound&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;cd=1"&gt;http://74.125.95.132/search?q=cache:Ps7c-BK3QyQJ:forum.cakewalk.com/fb.asp%3Fgo%3Dnext%26m%3D1304455%26viewType%3Dtm+sonar+7+no+sound&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;cd=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, fui até o menu Options --&gt; Audio...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_KsM26_B4S10/Sbw2-qBbtPI/AAAAAAAAAP0/ywS2ux4yl4A/s1600-h/sonar1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5313182110450431218" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 206px" alt="" src="http://4.bp.blogspot.com/_KsM26_B4S10/Sbw2-qBbtPI/AAAAAAAAAP0/ywS2ux4yl4A/s320/sonar1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Na tab Advanced, alterei o Driver Mode para MME (32-bit). Depois disso reiniciei o aplicativo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_KsM26_B4S10/Sbw3EOOSlUI/AAAAAAAAAP8/DG3qSNdDuo4/s1600-h/sonar2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5313182206067381570" style="WIDTH: 314px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://1.bp.blogspot.com/_KsM26_B4S10/Sbw3EOOSlUI/AAAAAAAAAP8/DG3qSNdDuo4/s320/sonar2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quando a nova instância foi aberta, me foi alertado que não havia nenhum output selecionado.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_KsM26_B4S10/Sbw3Hw-Rp4I/AAAAAAAAAQE/rvw-Uwx0Q9A/s1600-h/sonar3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5313182266935060354" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 115px" alt="" src="http://3.bp.blogspot.com/_KsM26_B4S10/Sbw3Hw-Rp4I/AAAAAAAAAQE/rvw-Uwx0Q9A/s320/sonar3.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Foi então que pude escolher o wavetable da Microsoft para simular os sons dos instrumentos musicais!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_KsM26_B4S10/Sbw3Lb5Vb0I/AAAAAAAAAQM/_680Sfr-PDg/s1600-h/sonar4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5313182329996668738" style="WIDTH: 288px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://1.bp.blogspot.com/_KsM26_B4S10/Sbw3Lb5Vb0I/AAAAAAAAAQM/_680Sfr-PDg/s320/sonar4.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Com isso, foi possível ouvir as músicas dos projetos sem problemas!&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4678522854053602988?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4678522854053602988/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4678522854053602988&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4678522854053602988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4678522854053602988'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/03/cakewalk-sonar-7-sem-som.html' title='Cakewalk Sonar 7 sem som'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KsM26_B4S10/Sbw2-qBbtPI/AAAAAAAAAP0/ywS2ux4yl4A/s72-c/sonar1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-1230883397811943016</id><published>2009-02-04T14:56:00.000-08:00</published><updated>2009-02-04T15:07:52.939-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM+'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='COMAdmin'/><title type='text'>Como excluir pacotes COM+ que não possuem a opção Delete no menu de contexto</title><content type='html'>Olá!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Estou trabalhando em um projeto de uma aplicação que faz instalações de componentes em servidores de forma automatizada. Uma das funcionalidades é criar diretórios virtuais no IIS. Acontece que durante alguns testes dessa funcionalidade, notei que cada vez que os diretórios virtuais eram criados, também era criado um pacote COM+ de nome IIS-{&lt;em&gt;&lt;nome&gt;&lt;/em&gt;//ROOT/&lt;em&gt;&lt;nome&gt;&lt;/em&gt;}. O engraçado é que mesmo excluindo os diretórios virtuais, esses pacotes permaneciam, e não podiam ser excluídos (não havia a opção &lt;em&gt;Delete&lt;/em&gt; no menu de contexto).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_KsM26_B4S10/SYod4IgpTkI/AAAAAAAAAPk/qjUHI71O1tU/s1600-h/1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5299080761749098050" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 223px" alt="" src="http://2.bp.blogspot.com/_KsM26_B4S10/SYod4IgpTkI/AAAAAAAAAPk/qjUHI71O1tU/s320/1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O problema foi corrigido na aplicação de instalação (não cheguei a ver a causa e correção, mas prometo fazê-lo), no entanto restava a necessidade de remover esses pacotes COM+, já que eram inúteis. Procurei no Google e encontrei uma solução para permitir que os pacotes fossem "excluíveis": usando o COMAdmin, alterar uma propriedade do pacote que libera esta opção.&lt;br /&gt;&lt;br /&gt;O código utilizado é o abaixo:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;ICOMAdminCatalog catalogo;&lt;br /&gt;ICatalogCollection pacotesCOMPlus;&lt;br /&gt;ICatalogObject pacoteCOMPlus = null;&lt;br /&gt;catalogo = (ICOMAdminCatalog)Microsoft.VisualBasic.Interaction.CreateObject("COMAdmin.COMAdminCatalog", string.Empty);&lt;br /&gt;pacotesCOMPlus = (ICatalogCollection)catalogo.GetCollection("Applications");&lt;br /&gt;pacotesCOMPlus.Populate();&lt;br /&gt;foreach (ICatalogObject pacote in pacotesCOMPlus)&lt;br /&gt;if (pacote.Name.ToString().ToLower().Equals(textBox1.Text.ToLower().Trim()))&lt;br /&gt;{&lt;br /&gt;pacoteCOMPlus = pacote;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;if (pacoteCOMPlus != null)&lt;br /&gt;{&lt;br /&gt;pacoteCOMPlus.set_Value("Deleteable", true);&lt;br /&gt;pacotesCOMPlus.SaveChanges();&lt;br /&gt;MessageBox.Show(string.Format("Pode apagar o pacote {0} agora...", textBox1.Text));&lt;br /&gt;}&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Obs. textBox1 é o controle da telinha que fiz para rodar o código, e que é preenchida com o nome do pacote COM+.&lt;br /&gt;&lt;br /&gt;Com isso, a opção de excluir o pacote COM+ foi habilitada!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_KsM26_B4S10/SYofApmh1AI/AAAAAAAAAPs/E96xjJyeY6k/s1600-h/2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5299082007582725122" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 224px" alt="" src="http://4.bp.blogspot.com/_KsM26_B4S10/SYofApmh1AI/AAAAAAAAAPs/E96xjJyeY6k/s320/2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-1230883397811943016?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/1230883397811943016/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=1230883397811943016&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1230883397811943016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/1230883397811943016'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2009/02/como-excluir-pacotes-com-que-nao.html' title='Como excluir pacotes COM+ que não possuem a opção Delete no menu de contexto'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KsM26_B4S10/SYod4IgpTkI/AAAAAAAAAPk/qjUHI71O1tU/s72-c/1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-6900002946814044408</id><published>2008-12-24T06:56:00.000-08:00</published><updated>2008-12-24T07:23:33.893-08:00</updated><title type='text'>Operador yield no C#</title><content type='html'>Hoje encontrei um operador no C# que desconhecia, o &lt;em&gt;yield&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Ele serve para manter estado quando se percorre uma coleção de objetos, e está intimente ligado à implementação do pattern &lt;em&gt;Iterator&lt;/em&gt; dentro do C#. Na prática, ele pode ser aplicado quando temos métodos que retornam um &lt;em&gt;IEnumerable&lt;t&gt;&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;No exemplo abaixo, eu tenho um método que percorre as datas de finais de semana (Sábado e Domingo) dado um ano. Veja que este método é chamado dentro de um &lt;em&gt;foreach&lt;/em&gt;, e cada iteração ele exibe uma data na tela. Não estou preocupado, dentro do &lt;em&gt;foreach&lt;/em&gt;, em saber qual foi a última data que foi exibida, isso é controlado internamente durante a iteração, que vai mantendo o loop "ativo" através do operador &lt;em&gt;yield&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Feliz Natal e até a próxima!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3366ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;namespace&lt;/span&gt; TesteYield&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#3366ff;"&gt;class&lt;/span&gt; &lt;span style="color:#00cccc;"&gt;Program&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#3366ff;"&gt;static void&lt;/span&gt; Main(&lt;span style="color:#3366ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:#00cccc;"&gt;Console&lt;/span&gt;.WriteLine("Finais de semana de 2009:");&lt;br /&gt;            &lt;span style="color:#3366ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#00cccc;"&gt;DateTime&lt;/span&gt; data &lt;span style="color:#3366ff;"&gt;in&lt;/span&gt; ObterFinaisDeSemana(2009))&lt;br /&gt;                &lt;span style="color:#00cccc;"&gt;Console&lt;/span&gt;.WriteLine("{0:dd/MM/yyyy}", data);&lt;br /&gt;            &lt;span style="color:#00cccc;"&gt;Console&lt;/span&gt;.ReadKey(&lt;span style="color:#3366ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#3366ff;"&gt;private static&lt;/span&gt; &lt;span style="color:#00cccc;"&gt;IEnumerable&lt;/span&gt;&lt;datetime&gt;&lt;&lt;span style="color:#00cccc;"&gt;DateTime&lt;/span&gt;&gt;ObterFinaisDeSemana(&lt;span style="color:#3366ff;"&gt;int&lt;/span&gt; ano)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:#00cccc;"&gt;DateTime&lt;/span&gt; pivo = &lt;span style="color:#3366ff;"&gt;new&lt;/span&gt; &lt;span style="color:#00cccc;"&gt;DateTime&lt;/span&gt;(ano, 1, 1);&lt;br /&gt;            &lt;span style="color:#3366ff;"&gt;while &lt;/span&gt;(pivo.Year == ano)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color:#3366ff;"&gt;if&lt;/span&gt; (pivo.DayOfWeek == &lt;span style="color:#00cccc;"&gt;DayOfWeek&lt;/span&gt;.Sunday  pivo.DayOfWeek == &lt;span style="color:#00cccc;"&gt;DayOfWeek&lt;/span&gt;.Saturday)&lt;br /&gt;                    &lt;strong&gt;&lt;span style="color:#3366ff;"&gt;yield return&lt;/span&gt; pivo;&lt;/strong&gt;&lt;br /&gt;                pivo = pivo.AddDays(1);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_KsM26_B4S10/SVJS4x2LU3I/AAAAAAAAAPU/0rVJkiBAjnI/s1600-h/Untitled.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5283376448265737074" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 161px" alt="" src="http://3.bp.blogspot.com/_KsM26_B4S10/SVJS4x2LU3I/AAAAAAAAAPU/0rVJkiBAjnI/s320/Untitled.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-6900002946814044408?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/6900002946814044408/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=6900002946814044408&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6900002946814044408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6900002946814044408'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/12/operador-yield-no-c.html' title='Operador yield no C#'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KsM26_B4S10/SVJS4x2LU3I/AAAAAAAAAPU/0rVJkiBAjnI/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-8046131825458783522</id><published>2008-12-07T17:31:00.001-08:00</published><updated>2008-12-07T17:36:41.129-08:00</updated><title type='text'>Aprovação do governo Lula no trato da crise</title><content type='html'>&lt;a href="http://br.noticias.yahoo.com/s/reuters/negocios_crise_br_datafolha"&gt;http://br.noticias.yahoo.com/s/reuters/negocios_crise_br_datafolha&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gostaria de saber pra quem é que eles fazem as perguntas...&lt;br /&gt;&lt;br /&gt;Sem demagogia, boa parte desses 49% devem ser aquelas pessoas que ganham o bolsa-família. Para essas a crise não afeta mesmo, só vai afetar se a coisa ficar bem feia e o Governo tiver que cortar seu maior apelo de marketing.&lt;br /&gt;&lt;br /&gt;Lula não tem condições de representar o país, não passa de uma marionete. O problema é que quem controla essa marionete sabe bem aplicar os princípios de Maquiavel.&lt;br /&gt;&lt;br /&gt;Enquanto isso, a marola vai mostrando sua forma...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-8046131825458783522?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/8046131825458783522/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=8046131825458783522&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8046131825458783522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/8046131825458783522'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/12/aprovao-do-governo-lula-no-trato-da.html' title='Aprovação do governo Lula no trato da crise'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2235666627551133247</id><published>2008-12-02T16:20:00.000-08:00</published><updated>2011-10-26T15:45:37.820-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Português'/><title type='text'>Barbarismo</title><content type='html'>Estou escrevendo um texto sobre classes &lt;strong&gt;customizadas&lt;/strong&gt; para a leitura de configurações no .NET..., mas senti que a palavra "customizadas", apesar de muito utilizada nas empresas e em especial na área de informática, não soa legal...&lt;br /&gt;&lt;br /&gt;Customizar vem da palavra "customize" e que vem de "customer", "cliente" em inglês, ou seja, construir, alterar ou reformar conforme especificações individuais. Pode ser um estrangeirismo, o ato de adotar uma palavra de outra língua se não tivermos uma correspondente. Se tiver uma correspondente, é chamado de barbarismo.&lt;br /&gt;&lt;br /&gt;Então, para não correr o risco de um barbarismo, resolvi colocar a palavra "personalizar". Melhor, não?&lt;br /&gt;&lt;br /&gt;Senão vou começar a usar termos como "deployar" em vez de "implantar", "buildar" em vez de "compilar", etc..., aí não dá certo, rs.&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2235666627551133247?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2235666627551133247/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2235666627551133247&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2235666627551133247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2235666627551133247'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/12/barbarismo.html' title='Barbarismo'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7011942258385404553</id><published>2008-11-28T19:19:00.000-08:00</published><updated>2011-10-27T07:31:08.845-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Erro de 404 com ASP.NET em Windows 2003 Server (IIS6)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Você criou um novo diretório virtual em um novo servidor Windows 2003 (IIS6), colocou uma aplicação ASP.NET nele, e quando foi acessá-lo, eis que aparece o erro 404! E o engraçado, quando você acessa páginas HTML, elas abrem sem problemas! Estranho? Não, diria que a mensagem é que não é clara. Provavelmente o ASP.NET não está habilitado nas Web Service Extensions. É só colocá-los como Allowed que seu site irá funcionar.&lt;/div&gt;&lt;br /&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5273914550086477042" src="http://1.bp.blogspot.com/_KsM26_B4S10/STC1V0WrJPI/AAAAAAAAAOE/vfs6LAY8Ipw/s400/Untitled.png" style="display: block; height: 253px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;br /&gt;&lt;div&gt;[]'s&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7011942258385404553?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7011942258385404553/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7011942258385404553&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7011942258385404553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7011942258385404553'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/11/erro-de-404-com-aspnet-em-windows-2003.html' title='Erro de 404 com ASP.NET em Windows 2003 Server (IIS6)'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KsM26_B4S10/STC1V0WrJPI/AAAAAAAAAOE/vfs6LAY8Ipw/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-6595865193062876328</id><published>2008-11-07T16:07:00.000-08:00</published><updated>2008-11-07T16:08:14.540-08:00</updated><title type='text'>Tirinha...</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_KsM26_B4S10/SRTYXqvE0yI/AAAAAAAAAMw/vHgoeyTWA0Y/s1600-h/calvineharoldo_criaturasbizarras_f_011.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5266071765423280930" style="WIDTH: 320px; CURSOR: hand; HEIGHT: 233px" alt="" src="http://1.bp.blogspot.com/_KsM26_B4S10/SRTYXqvE0yI/AAAAAAAAAMw/vHgoeyTWA0Y/s320/calvineharoldo_criaturasbizarras_f_011.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-6595865193062876328?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/6595865193062876328/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=6595865193062876328&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6595865193062876328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6595865193062876328'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/11/tirinha.html' title='Tirinha...'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KsM26_B4S10/SRTYXqvE0yI/AAAAAAAAAMw/vHgoeyTWA0Y/s72-c/calvineharoldo_criaturasbizarras_f_011.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3574694124858087854</id><published>2008-11-01T11:41:00.000-07:00</published><updated>2008-11-01T11:50:02.770-07:00</updated><title type='text'>Artigo de PostSharp .NET Magazine</title><content type='html'>Este mês foi publicado um artigo que fiz para a .NET Magazine, sobre PostSharp.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/space.asp?id=206189"&gt;http://www.devmedia.com.br/space.asp?id=206189&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quem quiser prestigiar meu humilde artigo, pode comprar a versão online da revista no link acima, ou a impressa na banca de revistas de sua preferência!&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3574694124858087854?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3574694124858087854/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3574694124858087854&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3574694124858087854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3574694124858087854'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/11/artigo-de-postsharp-net-magazine.html' title='Artigo de PostSharp .NET Magazine'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4681851157756914154</id><published>2008-10-04T17:51:00.000-07:00</published><updated>2008-10-04T18:02:06.957-07:00</updated><title type='text'>A pseudo vingança do povo</title><content type='html'>Hoje quando fui jantar acabei assintindo um pedaço da atual "novela das 8". Na cena, um político corrupto era obrigado a abrigar pessoas (vamos chamar de "povo") na sua mansão por alguma coisa relacionado à moradia deles.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O curioso era o foco que era dado na cena. Nela, o político, sempre procurava agradar o "povo", cedendo bens pessoas e comida. Os demais moradores da mansão eram constantemente bombardeados pelo "povo", pois este estava no direito de tomar o que quisessem da casa.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;É engraçado como isso é colocado para as pessoas assistirem. Parece que esse tipo de cena gera uma pseudo-vingança do "povo" contra aqueles que são ricos. Não estou defendendo aqueles que enriquecem de forma ilícita (que parece que é o caso do personagem da novela), mas sempre precebi uma ansia de ver as pessoas que possuem mais sendo prejudicadas, como uma forma de compensação pela pobreza da grande maioria.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;É como uma música do Rappa, que tem um refrão assim: &lt;span class="Apple-style-span" style="font-style: italic;"&gt;seu banco afundou, foi demais, tu rodou, tu rodou &lt;/span&gt;(inspirado no Banco Santos, se não me engano). Algumas (muitas) pessoas adoram especialmente esta parte, e cantam com um certo ódio, como se dessa forma conseguissem se colocar em uma posição melhor que a do banqueiro. O que eles não sabem é que mesmo "rodando", o banqueiro deve estar numa situação melhor que a da maioria da população que canta o refrão com tanta energia...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4681851157756914154?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4681851157756914154/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4681851157756914154&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4681851157756914154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4681851157756914154'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/10/pseudo-vingana-do-povo.html' title='A pseudo vingança do povo'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-4284407008752676816</id><published>2008-08-15T16:04:00.000-07:00</published><updated>2008-08-15T16:07:48.840-07:00</updated><title type='text'>Brigas, risos, broncas e toques de celular marcam julgamento de Beira-Mar</title><content type='html'>Essa é a cara da Justiça brasileira. Parabéns à todos os Excelentíssimos Doutores Advogados.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www1.folha.uol.com.br/folha/cotidiano/ult95u434012.shtml"&gt;http://www1.folha.uol.com.br/folha/cotidiano/ult95u434012.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Risos, brigas, broncas e toques de celular marcaram o julgamento do traficante Luiz Fernando da Costa, o Fernandinho Beira-Mar, na tarde desta sexta-feira no 4º Tribunal do Júri do Rio. Ele foi julgado por um processo do ano 2000 sobre um tiroteio entre policiais e um grupo de traficantes ao qual ele é acusado de ter ligação. O traficante foi condenado nesta tarde a seis anos de prisão em regime fechado por associação ao tráfico.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Descontraído, Beira-Mar riu bastante e interagiu com amigos e parentes que assistiam à sessão no plenário do 4º Tribunal do Júri do Rio, no centro da cidade. Durante toda a sessão, que durou pouco mais de quatro horas, o plenário ficou lotado. Os celulares, que deveriam estar desligados, tocaram ao menos quatro vezes, o que irritou a juíza Maria Angélica Guerra Guedes, que julgava o caso.&lt;br /&gt;&lt;br /&gt;Meia hora após o início da sessão, um celular com o toque do hino do Flamengo tocou, interrompendo a fala do promotor de Justiça Luciano Lessa dos Santos. A juíza chamou a atenção do proprietário do aparelho, que desculpou-se. Três minutos depois, um outro celular tocou, e a juíza levantou-se e interrompeu o promotor, ameaçando apreender o próximo aparelho que tocasse.&lt;br /&gt;&lt;br /&gt;"Vocês não estão na casa do pai nem da mãe de vocês, estão na casa da Justiça. Isso é um desrespeito. Se tocar de novo, vou mandar esses policiais [federais, que acompanhavam Beira-Mar] apreenderem", disse. O próximo celular a tocar, contudo, foi justamente o de um dos policiais, que saiu apressado da sala, sob o olhar da juíza, que nada falou.&lt;br /&gt;&lt;br /&gt;Por várias vezes durante a sessão Beira-Mar riu e gesticulou para conhecidos que assistiam ao julgamento. Fez um gesto circular em volta da barriga apontando para dois amigos. "Ele disse que a gente engordou", contou um deles, que não quis se identificar.&lt;br /&gt;&lt;br /&gt;Em duas ocasiões, o traficante pediu para se retirar do julgamento. Na segunda delas, em que ficou fora por mais de 40 minutos, foi almoçar, segundo os policiais federais que o acompanhavam.&lt;br /&gt;&lt;br /&gt;O promotor Luciano Lessa dos Santos e o advogado de Beira-Mar, Francisco Santana, protagonizaram discussões que arrancaram risos no plenário, inclusive da juíza e do traficante julgado. Durante a fala do advogado, que tentava convencer o júri que as provas do processo eram levianas, o promotor interrompeu, contestando a tese de Santana. Após uma discussão, o advogado disse que Santos "não sabe o que quer" e virou de costas. Com ironia, Santos disse: "magoei", e saiu da sala, sob gargalhadas do plenário.&lt;br /&gt;&lt;br /&gt;Um homem que assistia a sessão disse, em voz alta, que a situação não era engraçada, e a juíza Maria Angélica, irritada com a interrupção, exigiu que ele fosse retirado do plenário. "O riso te incomoda?", indagou a juíza.&lt;br /&gt;&lt;br /&gt;Beira-Mar deixou o prédio do Tribunal de Justiça do Rio, no centro, logo após o julgamento, acompanhado de cerca de 20 policiais federais.&lt;br /&gt;&lt;br /&gt;No processo em que foi julgado nesta tarde, o traficante é acusado pelo Ministério Público do Rio de ter ligação com um grupo de traficantes que atirou contra policiais que o perseguiam em Duque de Caxias (Baixada Fluminense) em 1996. Para a Promotoria, o bando tentava evitar a prisão de Charles Silva Batista, o Charles do Lixão, líder do tráfico de drogas na favela do Lixão, em Duque de Caxias.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-4284407008752676816?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/4284407008752676816/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=4284407008752676816&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4284407008752676816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/4284407008752676816'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/08/brigas-risos-broncas-e-toques-de.html' title='Brigas, risos, broncas e toques de celular marcam julgamento de Beira-Mar'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2583485686734207004</id><published>2008-08-10T10:23:00.000-07:00</published><updated>2008-08-10T10:36:04.921-07:00</updated><title type='text'>Como informações dentro do CallContext são passadas entre threads?</title><content type='html'>Estes dias tenho feito testes para uma prova de conceito de uma infra que estou desenvolvendo, para instrumentar chamadas de métodos.&lt;br /&gt;&lt;br /&gt;Nela, a idéia é ir armazenando informações do contexto da chamada (parâmetros, tempo de chamada, usuário, máquina, etc), para se ter a rastreabilidade do que ocorre na execução dos sistemas.&lt;br /&gt;&lt;br /&gt;Cheguei na conclusão que o uso da classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.callcontext.aspx"&gt;CallContext&lt;/a&gt; é uma boa para manter essas informações, pois o que é armazenado nela é trafegado entre threads e appdomains, durante o contexto da execução (lembrando que os objetos nela armazenados devem implementar &lt;a id="ctl00_rs1_mainContentContainer_ctl47" onclick="javascript:Track('ctl00_rs1_mainContentContainer_cpe237687_cctl00_rs1_mainContentContainer_ctl47',this);" href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.ilogicalthreadaffinative.aspx"&gt;ILogicalThreadAffinative&lt;/a&gt;, para que funcione como desejado).&lt;br /&gt;&lt;br /&gt;Uma dúvida tinha ficado no ar... Como são mantidas as informações quando o contexto da execução passa para outras threads, por exemplo, via ThreadPool?&lt;br /&gt;&lt;br /&gt;A resposta está na classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.executioncontext.aspx"&gt;ExecutionContext&lt;/a&gt;. Cada thread possui uma instância desse objeto associada, e é nessa instância que são armazenadas informações como contexto de segurança e sincronização. E também é onde se coloca o CallContext.&lt;br /&gt;&lt;br /&gt;Durante a instancia uma nova classe Thread, é pego o ExecutionContext da thread atual, copiado e passado para a nova thread. É dessa maneira que as informações passam de uma thread para a nova.&lt;br /&gt;&lt;br /&gt;Vale lembrar que isso funciona apenas no .NET Framework 2.0 e superiores, pois no 1.x não funciona dessa maneira.&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2583485686734207004?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2583485686734207004/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2583485686734207004&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2583485686734207004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2583485686734207004'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/08/como-informaes-dentro-do-callcontext-so.html' title='Como informações dentro do CallContext são passadas entre threads?'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-6240089989428188038</id><published>2008-08-02T11:20:00.000-07:00</published><updated>2008-08-02T11:22:48.647-07:00</updated><title type='text'>Fim das touradas</title><content type='html'>&lt;a href="http://noticias.uol.com.br/album/080802_album.jhtm?abrefoto=6"&gt;http://noticias.uol.com.br/album/080802_album.jhtm?abrefoto=6&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sou totalmente a favor.&lt;br /&gt;&lt;br /&gt;Alias, se não quiserem acabar, então que não interfiram na tourada. Se o toureiro bobear, deixem o touro acabar com a vida dele, é mais justo.&lt;br /&gt;&lt;br /&gt;Mesma coisa para os rodeios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-6240089989428188038?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/6240089989428188038/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=6240089989428188038&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6240089989428188038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/6240089989428188038'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/08/fim-das-touradas.html' title='Fim das touradas'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3425316653492837289</id><published>2008-06-26T17:10:00.000-07:00</published><updated>2008-06-26T17:24:56.785-07:00</updated><title type='text'>MySQL error number 1005 Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150)</title><content type='html'>Tenho trabalhado em um projeto freelancer que utiliza base de dados MySQL. Fiz uma alteração em um modelo de dados, e entre as alterações tive que criar uma nova FK entre duas tabelas, sendo que a tabela pai antes não existia.&lt;br /&gt;&lt;br /&gt;Na hora de executar o script que cria a FK, me deparei com um erro, a primeira vista, complicado de resolver. A execução do script retornava:&lt;br /&gt;&lt;em&gt;MySQL Error Number 1005Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Após buscar um pouco no Google (o oráculo de todos os desenvolvedores!), encontrei uma página que explicava este erro. A página, em inglês, é &lt;a href="http://www.verysimple.com/blog/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/"&gt;http://www.verysimple.com/blog/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Basicamente e neste caso, este erro ocorre porque os pré-requisitos para a criação de uma FK não foram atendidos.&lt;br /&gt;&lt;br /&gt;Para conferir se todos os itens necessários para a FK foram atendidos, é só seguir a checklist abaixo:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Os campos da tabela pai e da tabela filho são do mesmo tipo e tamanho? De início pode parecer besta a sugestão, mas o Query Browser considera como tipo INTEGER tanto o INT(10) quanto o INT(11). Além disso, é preciso conferir se o campo é SIGNED ou UNSIGNED. Para conferir essas informações, o melhor é comparar o resultado do comando SHOW CREATE TABLE &lt;nome&gt;.&lt;/li&gt;&lt;li&gt;O(s) campo(s) que você quer referenciar devem ser chaves primárias ou pelo menos possuir um índice.&lt;/li&gt;&lt;li&gt;Verifique se você não está querendo criar uma FK com um nome que já existe.&lt;/li&gt;&lt;li&gt;Verifique se as tabelas usam o InnoDB. Se estiverem com MyISAM, não vai funcionar.&lt;/li&gt;&lt;li&gt;Verifique se o Charset e o Collate estão iguais nos campos referenciados.&lt;/li&gt;&lt;li&gt;Verifique se você não está especificando um valor default na FK.&lt;/li&gt;&lt;li&gt;Está especificado um SET NULL para o DELETE cascade, mas a coluna é do tipo NOT NULL. Para arrumar isso, ou remova esse SET NULL, ou permita valores NULL neste campo.&lt;/li&gt;&lt;li&gt;E finalizando, veja se o seu ALTER TABLE não tem algum erro de sintaxe!&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Este post foi muito útil para mim, e me ajudou a identificar que minhas tabelas estava com MyISAM e alguns campos estavam marcados como UNSIGNED e outros não...&lt;/p&gt;&lt;p&gt;[]'s&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3425316653492837289?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3425316653492837289/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3425316653492837289&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3425316653492837289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3425316653492837289'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/06/mysql-error-number-1005-cant-create.html' title='MySQL error number 1005 Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150)'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-3966634735118361213</id><published>2008-05-27T19:00:00.000-07:00</published><updated>2011-10-26T15:47:13.395-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>PostSharp</title><content type='html'>&lt;div style="text-align: justify;"&gt;Estou entusiasmado com uma ferramenta chamada PostSharp.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ela trabalha no conceito de programação orientada a aspectos (AOP), e diferente do Spring.NET ou Policy Injection App Block, ela altera o código IL das dll's geradas para inserir o código que faz a interceptação das chamadas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Acho que estou indo rápido demais, rs, mas hoje só vou colocar o link dessa ferramenta. Lá existe um ótimo tutorial de como usá-la &lt;a href="http://www.postsharp.org/"&gt;http://www.postsharp.org/&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Depois eu coloco mais coisas sobre ela, conforme for descobrindo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-3966634735118361213?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/3966634735118361213/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=3966634735118361213&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3966634735118361213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/3966634735118361213'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/05/postsharp.html' title='PostSharp'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-5808197178059173850</id><published>2008-05-07T18:29:00.001-07:00</published><updated>2008-05-07T18:31:48.157-07:00</updated><title type='text'>Hotel Fazenda</title><content type='html'>Passei este últim feriado em um hotel-fazenda bem legal, na região de Curitiba.&lt;br /&gt;&lt;br /&gt;Fica em uma cidade chamada Lapa.&lt;br /&gt;&lt;br /&gt;Gostei bastante, por isso estou comentando aqui no blog. Os chalés são bem limpos e organizados. A comida (4 refeições diárias) é muito boa, caseira mesmo. Recomendo (não estou ganhando nada com a propaganda, rs).&lt;br /&gt;&lt;br /&gt;O site é &lt;a href="http://www.hotelvovonana.com.br/"&gt;http://www.hotelvovonana.com.br/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-5808197178059173850?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/5808197178059173850/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=5808197178059173850&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5808197178059173850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5808197178059173850'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/05/hotel-fazenda.html' title='Hotel Fazenda'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2834823694334177911</id><published>2008-04-30T16:43:00.000-07:00</published><updated>2008-04-30T16:47:06.222-07:00</updated><title type='text'>Artigos "perdidos" na Internet</title><content type='html'>Olá!&lt;br /&gt;&lt;br /&gt;Tive a curiosidade de procurar meu nome no Google. Encontrei algumas coisas "esquecidas": dois artigos que escrevi faz tempo, e que nem lembrava que ainda estavam disponíveis na Internet.&lt;br /&gt;&lt;br /&gt;Um bem básico, quando estava começando a mexer com ASP.NET, que publiquei no site Asp4Developers (do Rubens Farias): &lt;a href="http://rubensfarias.blogspot.com/2004/01/aspnet-user-controls_04.html"&gt;http://rubensfarias.blogspot.com/2004/01/aspnet-user-controls_04.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Outro sobre Generics, quando lançaram no .NET 2.0: &lt;a href="http://www.linhadecodigo.com.br/Artigo.aspx?id=780"&gt;http://www.linhadecodigo.com.br/Artigo.aspx?id=780&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Quem sabe me animo a voltar a escrever mais?&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2834823694334177911?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2834823694334177911/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2834823694334177911&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2834823694334177911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2834823694334177911'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/04/artigos-perdidos-na-internet.html' title='Artigos &quot;perdidos&quot; na Internet'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7310306266720500774</id><published>2008-04-25T15:30:00.001-07:00</published><updated>2008-04-25T15:33:24.062-07:00</updated><title type='text'>Impressão de Etiquetas com Reporting Services</title><content type='html'>Encontrei um artigo muito legal sobre impressão de etiquetas usando o SQL Reporting Services.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://altoonait.com/CS/blogs/lee/archive/2007/12/13/printing-labels-with-sql-server-reporting-services.aspx"&gt;http://altoonait.com/CS/blogs/lee/archive/2007/12/13/printing-labels-with-sql-server-reporting-services.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Um item que usei diferente na minha implementação: no lugar de ter uma coluna no datasource que informa o índice de cada elemento do mesmo, usei a função RowNumber(Nothing), ao invés do que o autor sugeriu (&lt;em&gt;=IIF(Fields!Rank.value mod 3=0,false,true)&lt;/em&gt;).&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7310306266720500774?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7310306266720500774/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7310306266720500774&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7310306266720500774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7310306266720500774'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/04/impresso-de-etiquetas-com-reporting.html' title='Impressão de Etiquetas com Reporting Services'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7803293935754224725</id><published>2008-03-28T18:36:00.000-07:00</published><updated>2010-07-19T18:37:08.194-07:00</updated><title type='text'>ASP.NET AJAX e a data da máquina</title><content type='html'>Primeiramente, PQP!  &lt;br /&gt;  &lt;br /&gt;Pronto, já me revoltei do erro tosco que eu estava tendo.  &lt;br /&gt;  &lt;br /&gt;Bom, estou desenvolvendo uma aplicação ASP.NET, com Visual Studio 2008 e AJAX, quando hoje o meu site começou a dar um erro estranho...  &lt;br /&gt;Ao tentar abrir páginas com controles como TreeView, TabControl, etc, a mesma não era carregada corretamente. Imagens e recursos (como arquivos JavaScript) faltando, o que acabava caindo no erro &amp;quot;&lt;strong&gt;Sys is undefined&lt;/strong&gt;&amp;quot; (basicamente, este erro ocorre porque o browser não consegue carregar alguns scripts através do  &lt;br /&gt;ScriptResource.axd).  &lt;br /&gt;  &lt;br /&gt;Fiquei chateado com o erro (para não dizer pré-desesperado, rs). Para idenficar melhor o que estava acontecendo, peguei uma das urls geradas pelo ScriptResource.axd ou WebResource.axd e testei ela no browser. Apareceu um outro erro: &amp;quot;&lt;strong&gt;Specified argument was out of the range of valid values.Parameter name: utcDate&lt;/strong&gt;&amp;quot;.  &lt;br /&gt;  &lt;br /&gt;Google pra cá, Google prá lá, acabei encontrando algumas pessoas que tiveram esse problema quando a hora da máquina estava atrasada...  &lt;br /&gt;  &lt;br /&gt;Olhei para meu relógio, e a &amp;quot;surpresa&amp;quot; é que ele estava 2 anos atrasado! Arrumei e tudo voltou a funcionar!  &lt;br /&gt;  &lt;br /&gt;Agora porque estava atrasado? É que a bateria do meu computador deve estar zuada, e todo dia tenho que colocar a data e hora, e devo ter me enganado hoje...  &lt;br /&gt;  &lt;br /&gt;Amanhã vou ver de ir comprar uma bateria nova...    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7803293935754224725?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7803293935754224725/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7803293935754224725&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7803293935754224725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7803293935754224725'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/03/aspnet-ajax-e-data-da-mquina.html' title='ASP.NET AJAX e a data da máquina'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-7176297731472078810</id><published>2008-03-18T18:35:00.000-07:00</published><updated>2008-03-18T20:13:04.525-07:00</updated><title type='text'>Permissões para uso do EventLog - Windows 2003</title><content type='html'>Olá, pessoal!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hoje vou falar sobre alguns problemas que tive que passar, a respeito do uso do EventLog, mais especificamente na gravação. São os erros:&lt;br /&gt;&lt;p&gt;&lt;strong&gt;System.Security.SecurityException: Requested registry access is not allowed.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Este erro ocorre quando uma aplicação tenta gravar um registro no EventLog, mas não possui permissões para gravar no registry do Windows. Isso acontece porque o os sources do EventLog ficam armazenados no registry, embaixo da seguinte chave: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application (isso para os sources que ficam na no Application, ainda temos os do Security, System, e outros que você venha a criar). Quando se quer criar um source novo, deve-se escrever no registry.&lt;/p&gt;&lt;p&gt;O importante a notar aqui é que a conta que está tentando escrever no EventLog deve ter permissão de escrita nessas chaves do registry. Ou então esse source já deve estar criado, para que este problema não ocorra.&lt;/p&gt;&lt;p&gt;Obs. Esse problema de permissão pode ser verificado através do Regmon, verificando os erros de ACCESS DENIED que ocorrem.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cannot open log for source {0}. You may not have write access.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Este outro erro foi mais chato de descobrir, e acontecia quando uma conta de usuário tentava gravar em um source já existente no servidor, criado por outro serviço. Mesmo executando o Filemon e o Regmon, não aparecia nada que pudesse indicar onde estava o problema. Primeiro tentei dar permissão ao usuário que tentava gravar tanto nas chaves do registry quanto no arquivo onde ficam armazenados os dados do EventLog (%WINDIR%\system32\config), mas sem sucesso.&lt;/p&gt;&lt;p&gt;Neste caso, o que acontece é que no Windows 2003 Server, a permissão de gravação fica armazenada em uma chave no registry, chamada CustomSD (Custom Security Description). É ela que define quem pode gravar, ler e demais opções, dentro do EvenLog.&lt;/p&gt;&lt;p&gt;Essa chave fica em HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application\CustomSD, e seu valor é uma string a primeira vista muito confusa:&lt;br /&gt;&lt;em&gt;O:BAG:SYD:(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)(A;;0xf0007;;;SY)(A;;0x7;;;BA) (A;;0x7;;;SO)(A;;0x3;;;IU)(A;;0x3;;;SU)(A;;0x3;;;S-1-5-3)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Muita calma nessa hora, o que cada coisa quer dizer? Vamos quebrar essa string por partes, para entender:&lt;/p&gt;&lt;p&gt;&lt;em&gt;O:BA&lt;/em&gt; A letra O indica que se está especificando o owner do objeto, no caso o grupo de administradores da máquina (Built-in Admin - BA).&lt;br /&gt;&lt;em&gt;G:SY&lt;/em&gt; A letra G indica que está sendo especificado o primary group, no caso System (SY).&lt;br /&gt;&lt;em&gt;D:&lt;/em&gt; Indica que é uma DACL, ao inves de uma entrada de auditoria ou SACL.&lt;br /&gt;&lt;em&gt;(D;;0xf0007;;;AN)&lt;/em&gt; Nega o acesso totalmente para o Anonymous (Deny para AN).&lt;br /&gt;&lt;em&gt;(D;;0xf0007;;;BG)&lt;/em&gt; Nega o acesso totalmente ao Built-in Guests (Deny para BG) .&lt;br /&gt;&lt;em&gt;(A;;0xf0005;;;SY)&lt;/em&gt; Permite que o System leia e limpe (incluindo DELETE, READ_CONTROL, WRITE_DAC, e WRITE_OWNER, indicado pelo 0xf0000).&lt;br /&gt;&lt;em&gt;(A;;0x7;;;BA)&lt;/em&gt; Permite READ, WRITE e CLEAR para o Built-in Admin (BA).&lt;br /&gt;&lt;em&gt;(A;;0x7;;;SO)&lt;/em&gt; Permite READ, WRITE e CLEAR para Server Operators (SO).&lt;br /&gt;&lt;em&gt;(A;;0x3;;;IU)&lt;/em&gt; Permite READ e WRITE para Interactive Users (IU).&lt;br /&gt;&lt;em&gt;(A;;0x3;;;SU)&lt;/em&gt; Permite READ e WRITE para Service accounts (SU).&lt;br /&gt;&lt;em&gt;(A;;0x3;;;S-1-5-3)&lt;/em&gt; Permite READ e WRITE para Batch accounts (S-1-5-3).&lt;/p&gt;&lt;p&gt;O valor 0x3 indica que é permitido leitura e escrita, pois ele é composto através da soma de ELF_LOGFILE_READ (0x0001) e ELF_LOGFILE_WRITE (0x0002). Outro valor que pode ser combinado é ELF_LOGFILE_CLEAR (0x0004).&lt;/p&gt;&lt;p&gt;Com isso, podemos dar as permissões necessárias, informando o que cada usuário pode fazer.&lt;/p&gt;&lt;p&gt;No meu caso, esse problema aconteceu quando um web service com impersonate ligado estava tentando gravar no registry. Os usuários autenticados não tinham permissão para gravar, então dava o erro. Foi adicionado o (A;;0x3;;;AU), e o problema foi corrigido!&lt;/p&gt;&lt;p&gt;E se eu quisesse dar permissão para o NETWORK SERVICE, que é a conta que o ASP.NET roda no Windows 2003, colocaria (A;;0x3;;;NS).&lt;/p&gt;&lt;p&gt;Espero que este post seja útil para mim tanto quanto os posts de outros blogs me foram, para resolver este problema (&lt;a href="http://support.microsoft.com/kb/329291"&gt;http://support.microsoft.com/kb/329291&lt;/a&gt;, &lt;a href="http://www.leastprivilege.com/EventLogACLsInWindows2003.aspx"&gt;http://www.leastprivilege.com/EventLogACLsInWindows2003.aspx&lt;/a&gt; e &lt;a href="http://www.jameskovacs.com/blog/PermaLink.aspx?guid=cd6e5f6e-7107-48bc-8563-f5669706fcdc"&gt;http://www.jameskovacs.com/blog/PermaLink.aspx?guid=cd6e5f6e-7107-48bc-8563-f5669706fcdc&lt;/a&gt;). É incrível como, se você perquisar no Google as mensagens de erro, acaba encontrando tantas threads de fóruns que citam este problema, mas não dão a resolução.&lt;/p&gt;&lt;p&gt;[]'s&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-7176297731472078810?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/7176297731472078810/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=7176297731472078810&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7176297731472078810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/7176297731472078810'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/03/permisses-para-uso-do-eventlog-windows.html' title='Permissões para uso do EventLog - Windows 2003'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2291200249093120339</id><published>2008-03-15T12:55:00.000-07:00</published><updated>2008-03-15T13:05:27.113-07:00</updated><title type='text'>Document-Level Templates no VSTO 2005 SE</title><content type='html'>Tenho dois computadores, um que uso durante a semana, e outro que fica na casa dos meus pais que eu uso no final de semana.&lt;br /&gt;&lt;br /&gt;Esse segundo computador, por ser uma configuração menos privilegiada que o primeiro, tem o Windows XP, Office 2003 e Visual Studio 2005 (o outro está com oVista, Office 2007 e Visual Studio 2008).&lt;br /&gt;&lt;br /&gt;Bom, como estou estudando VSTO, decidi instalá-lo neste computador. Baixe o "Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System" em &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86CAB3-6FD6-4955-B979-E1676DB6B3CB&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86CAB3-6FD6-4955-B979-E1676DB6B3CB&amp;amp;displaylang=en&lt;/a&gt;, mas  quando instalei e fui abrir um projeto de documento (estou lendo sobre smart tags e action pane, que estão disponíveis apenas para documentos, e não add-ins), não encontrei nenhum template!&lt;br /&gt;&lt;br /&gt;Ao ler os detalhes do download do VSTO 2005 SE, vi que esses templates não estão disponíveis na versão do Visual Studio que eu tenho instalada (2005 Professional). Apenas para as versões:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Visual Studio 2005 Team Suite&lt;/li&gt;&lt;li&gt;Visual Studio 2005 Team Edition for Software Architects&lt;/li&gt;&lt;li&gt;Visual Studio 2005 Team Edition for Software Developers&lt;/li&gt;&lt;li&gt;Visual Studio 2005 Team Edition for Software Testers&lt;/li&gt;&lt;li&gt;Visual Studio 2005 Tools for the Microsoft Office System&lt;/li&gt;&lt;/ul&gt;Então, o jeito é estudar essas customizações do VSTO apenas no computador que uso durante a semana...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2291200249093120339?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2291200249093120339/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2291200249093120339&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2291200249093120339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2291200249093120339'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/03/document-level-templates-no-vsto-2005.html' title='Document-Level Templates no VSTO 2005 SE'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-5873757483704556641</id><published>2008-03-07T20:31:00.000-08:00</published><updated>2008-03-07T20:44:58.305-08:00</updated><title type='text'>Log do VSTO</title><content type='html'>Nas últimas semanas, estive trabalhando em um projeto que utiliza o VSTO (Visual Studio Tools for Office). Aprendi algumas coisas legais. E como a gente aprende com nossos erros, aqui vai uma coisa que aprendi hoje.&lt;br /&gt;&lt;br /&gt;Criei um addin Excel, que deveria ser carregado toda vez que o Excel é utilizado. Pois bem, isso não estava acontecendo... Quando eu abria o Excel, nada acontecia. Visualizando o addin COM no Excel, vi que o mesmo não estava sendo carregado (dava um erro). Mas o por que ficava vago...&lt;br /&gt;&lt;br /&gt;Procurando na Internet, descobri algumas variáveis de ambiente que precisam ser ajustadas, para que então seja gerado um log dos erros que ocorrem com o VSTO.&lt;br /&gt;&lt;br /&gt;Essas variáveis são:&lt;br /&gt;VSTO_SUPPRESSDISPLAYALERTS (0 ou 1) - define se as mensagens de erro serão exibidas em uma MessageBox. O padrão é 1, indicando que as mesmas não devem ser exibidas. VSTO_LOGALERTS (0 ou 1) - define se os erros serão logados. Caso ligado (valor 1), os erros do VSTO são gravados em disco, com informações relevantes para que seja possível descobrir a causa deles. No caso, os arquivos ficam juntos do arquivo de manifesto da dll do VSTO (bom, vai estar tudo na pasta que você instalou o addin).&lt;br /&gt;&lt;br /&gt;Obs 1. No meu caso, o erro era que a dll não carregava por falta de permissão. O VSTO exige que a segurança do .NET Framework seja configurada para uso (caspol). Minhas dll's não estavam nas configurações, então as coloquei nas configurações de segurança, verificando os assemblies que possuiam determinado strong name.&lt;br /&gt;&lt;br /&gt;Obs 2. Para o meu caso, era um addin Excel 2003. Os itens que a máquina do usuário final necessitam ter são:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Office 2003 Update: Redistributable Primary Interop Assemblies&lt;/li&gt;&lt;li&gt;Microsoft Visual Studio 2005 Tools for Office Second Edition Runtime (build 8.0.50272.940) (x86)&lt;/li&gt;&lt;li&gt;Microsoft .NET Framework Version 2.0 Redistributable Package (x86)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Segue o link onde encontrei informações muito interessantes sobre o deplyment de uma solução VSTO Office 2003: &lt;a href="http://blogs.msdn.com/vsto/archive/2008/02/19/deploying-prerequisites-for-your-visual-studio-tools-for-office-solution.aspx"&gt;http://blogs.msdn.com/vsto/archive/2008/02/19/deploying-prerequisites-for-your-visual-studio-tools-for-office-solution.aspx&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;[]'s&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-5873757483704556641?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/5873757483704556641/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=5873757483704556641&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5873757483704556641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/5873757483704556641'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/03/nas-ltimas-semanas-estive-trabalhando.html' title='Log do VSTO'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5409857123971232912.post-2194540704993699963</id><published>2008-03-06T17:36:00.000-08:00</published><updated>2008-03-08T07:30:46.221-08:00</updated><title type='text'>Finalmente Blog!</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Finalmente estou escrevendo alguma coisa neste blog! Espero que de agora em diante, eu passe por aqui mais vezes...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;A minha idéia em fazer um blog vem da vontade de compartilhar algumas coisas que aprendo no dia-a-dia do trabalho. É como um agradecimento aos vários blogs onde já encontrei coisas interessantes, importantes e que salvaram várias horas do meu tempo e da minha paciência. Coisas que eu poderia estar até agora pesquisando e "batendo cabeça".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Trabalho com desenvolvimento de sistema há algum tempo, e acredito que as coisas que vou descobrindo a cada dia podem ser úteis à outras pessoas. Artigos interessantes, dicas e links farão parte deste diário. E de preferência textos curtos, porque eu me conheço: se for escrever alguma coisa longa, vou acabar desistindo no meio do caminho!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Também vou aproveitar este espaço para falar um pouco dos lugares que conheço, das idéias que tenho, etc.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Enfim, o que todo mundo faz num blog, rs.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Vou ficando por aqui, até breve!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5409857123971232912-2194540704993699963?l=galorebr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://galorebr.blogspot.com/feeds/2194540704993699963/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5409857123971232912&amp;postID=2194540704993699963&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2194540704993699963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5409857123971232912/posts/default/2194540704993699963'/><link rel='alternate' type='text/html' href='http://galorebr.blogspot.com/2008/03/finalmente-blog.html' title='Finalmente Blog!'/><author><name>Fabio Gouw</name><uri>http://www.blogger.com/profile/07046032907934968872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_KsM26_B4S10/Stj_jLJTSxI/AAAAAAAAAVI/cmIQduILJh0/S220/eu2.jpg'/></author><thr:total>0</thr:total></entry></feed>
