<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-34573201</atom:id><lastBuildDate>Wed, 08 May 2013 01:29:58 +0000</lastBuildDate><category>Windows XP</category><category>Visual Studio</category><category>Agenda</category><category>Dicas</category><category>Tefé</category><category>Download</category><category>Windows Form</category><category>Viagens</category><category>Windows Server 2008</category><category>Governo</category><category>Livros</category><category>SQLServer</category><category>Windows</category><category>dublin</category><category>ASP.NET</category><category>Manaus</category><category>JQuery</category><category>WF</category><category>Catastrofes</category><category>Violência</category><category>Servidores</category><category>Desgoverno</category><category>Tecnologia</category><category>Eventos</category><category>EcoTurismo</category><category>Humor</category><category>popFly</category><category>Windows Vista</category><category>CSS</category><category>Javascript</category><category>Rails</category><category>Comportamento</category><category>Jornalismo</category><category>xna</category><category>IIS</category><category>Oslo</category><category>Capitalismo</category><category>Crise</category><category>Internet Explorer</category><category>betas</category><category>Entity Framework</category><category>.NET</category><category>ComentariosBizarros</category><category>Certificação</category><category>Team Foundation Server</category><category>Unity Test</category><category>MVC</category><category>Bizarro</category><category>Windows 8</category><category>Software Livre</category><category>Velocity</category><category>Lost</category><category>Cidadania</category><category>Virtual Earth</category><category>Vb.NET</category><category>Ajax</category><category>HTML 5</category><category>Windows Phone</category><category>Natureza</category><category>Noticias</category><category>Live</category><category>TvSeries</category><category>mix</category><category>internet</category><category>Windows Azure</category><category>Paranoia</category><category>MeioBit</category><category>Windows 7</category><category>DataServices</category><category>Direitos Autorais</category><category>Amazonas</category><category>Conhecimento Coletivo</category><category>Retrospectiva</category><category>Blogosfera</category><category>How to</category><category>Segurança</category><category>ASP</category><category>Turismo</category><category>Educação</category><category>Retorno de Manaus</category><category>Jogos</category><category>ADO.NET</category><category>C#</category><category>Injustiça</category><category>Dia de Limpeza</category><category>Mundo</category><category>Internet Explorer 8</category><category>WCF</category><category>Linq</category><category>PDC</category><category>Musica</category><category>Hardware</category><category>Dynamic Data</category><category>Comparacoes</category><category>WPF</category><category>cinemateca</category><category>Silverlight</category><title>Cidadão Carioca</title><description>As aventuras, humor, observações e revolta de um cidadão carioca viajando pelo país levando oportunidades, educação e tecnologia para todos</description><link>http://cidadaocarioca.blogspot.com/</link><managingEditor>noreply@blogger.com (Dennes)</managingEditor><generator>Blogger</generator><openSearch:totalResults>832</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CidadaoCarioca" /><feedburner:info uri="cidadaocarioca" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>CidadaoCarioca</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-7860362185985867954</guid><pubDate>Wed, 08 May 2013 01:29:00 +0000</pubDate><atom:updated>2013-05-07T22:29:58.714-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>VS 2012 : Code Map</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;O Visual Studio 2012 nos traz um novo recurso muito interessante para o entendimento de códigos complexos : O Code Map.&lt;/p&gt;  &lt;p&gt;Basta clicarmos com o botão direito em nosso código e encontramos as opções referentes ao funcionamento do Code Map. Implementei um pequeno trecho de código em um webform para fazer um teste. &lt;/p&gt;  &lt;p&gt;Veja o código :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button2_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            ListBox1.DataSource = Dados();
            ListBox1.DataBind();
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; Dados()
        {
            List&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; l = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;();
            &lt;span class="kwrd"&gt;for&lt;/span&gt; (var i = 0; i &amp;lt;= 10; i++)
            {
                l.Add(i);
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; l;
        }

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button3_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            ListBox1.DataSource = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            ListBox1.DataBind();
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;O objetivo do Code Map é, claro, lidar com códigos bem mais complexos que esse, porém isso nos ajudará a analisarmos o resultado.&lt;/p&gt;

&lt;p&gt;Com o cursor em Button2_Click, cliquei com o botão direito e selecionei “show on code map”&lt;/p&gt;

&lt;p&gt;O resultado é extremamente simples :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-xipMMTsGNWE/UYmiasDzo6I/AAAAAAAAHDk/QNtdIrHYRtA/s1600-h/SNAG-00183.png"&gt;&lt;img title="SNAG-0018" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0018" src="http://lh4.ggpht.com/-gRKUeZuZnEk/UYmidNwmcnI/AAAAAAAAHDo/JV7pkLtvhGw/SNAG-0018_thumb1.png?imgmax=800" width="437" height="340" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicando em “Show related Itens”&amp;#160; selecionei “Show fields this references”. Como resultado, visualizamos a listbox no Code Map :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-k6LzScl2wGo/UYmigzVFh2I/AAAAAAAAHDw/pQDRUVycm0Y/s1600-h/SNAG-00193.png"&gt;&lt;img title="SNAG-0019" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0019" src="http://lh6.ggpht.com/-pEqSmGUJutg/UYmihszOzPI/AAAAAAAAHD4/x14V6Nl3pSY/SNAG-0019_thumb1.png?imgmax=800" width="515" height="464" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-zJXPGIx1OZo/UYmilV-oR3I/AAAAAAAAHEA/WJ9qlah2E_k/s1600-h/SNAG-00212.png"&gt;&lt;img title="SNAG-0021" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0021" src="http://lh5.ggpht.com/-LJxD5PWtP4A/UYmimA6_mWI/AAAAAAAAHEI/hAtZ1jJZ1Sw/SNAG-0021_thumb.png?imgmax=800" width="182" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Novamente em “Show Related Items”, cliquei em “Show methods this calls”. Como resultado temos o método “Dados” e a indicação “External” (referente ao databind), veja :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-kYldwOdeQNo/UYmim3FuBrI/AAAAAAAAHEQ/hzVNd64t8Ro/s1600-h/SNAG-00222.png"&gt;&lt;img title="SNAG-0022" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0022" src="http://lh4.ggpht.com/-eoELg6pJRPI/UYmjyQmBgAI/AAAAAAAAHEc/Gyxd7LZWY44/SNAG-0022_thumb.png?imgmax=800" width="244" height="108" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ainda no “Show Related Items”, cliquei em “Show containing type”, veja o resultado :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-mDqKWLrW3vY/UYmjzPf7CoI/AAAAAAAAHEg/6-XRC7tjbUg/s1600-h/SNAG-00232.png"&gt;&lt;img title="SNAG-0023" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0023" src="http://lh6.ggpht.com/-NMCZSJx8L7E/UYmj0KdgDlI/AAAAAAAAHEs/HyMIopJHf2I/SNAG-0023_thumb.png?imgmax=800" width="244" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;O click em “Find all references”, ultimo item do “Show Related Items”, não gerou nada novo no gráfico, o que já era esperado. Ocorre que todos os itens estão sendo executados para o objeto circulado de amarelo – o objeto selecionado que é o método click do button2.&lt;/p&gt;

&lt;p&gt;Desta vez selecione a listbox e utilizei “Find all references” do “Show related items”. Temos então o Button3_click adicionado no gráfico :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-hnTuaVO-FKE/UYmj0wyIO1I/AAAAAAAAHEw/6z980YVLh4A/s1600-h/SNAG-00252.png"&gt;&lt;img title="SNAG-0025" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0025" src="http://lh6.ggpht.com/-48npnSR0nMk/UYmj14flXNI/AAAAAAAAHE4/mdij-VvvqbM/SNAG-0025_thumb.png?imgmax=800" width="244" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É importante destacar que o gráfico não é estático : Conforme navegamos no código uma seta aponta para nós exatamente o ponto em que estamos no gráfico.&lt;/p&gt;

&lt;p&gt;O gráfico apenas se completa conforme pedirmos. Por exemplo, não há ainda uma indicação de que o método Dados faz chamada externa. Se utilizarmos o “Show methods this calls” com o Dados selecionado, teremos isso no gráfico.&lt;/p&gt;

&lt;p&gt;Clicando sobre um dos itens, vemos um menu flutuante com mais opções para manipularmos o gráfico. Podemos, por exemplo, criar comentários :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-3yPVVdGpf30/UYmj6I8lZdI/AAAAAAAAHFA/cOzFTgeKCBg/s1600-h/SNAG-00272.png"&gt;&lt;img title="SNAG-0027" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0027" src="http://lh6.ggpht.com/-NhNYUM6fjKg/UYmk6MkgD6I/AAAAAAAAHFM/-o87b3s_V2I/SNAG-0027_thumb.png?imgmax=800" width="244" height="140" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-FW1VyQ2ucAs/UYmmlgZYFRI/AAAAAAAAHFY/hzPoLuGmclM/s1600-h/SNAG-00282.png"&gt;&lt;img title="SNAG-0028" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0028" src="http://lh3.ggpht.com/-LOwFpFg1RPA/UYmqcmWvBBI/AAAAAAAAHFs/Dj8ulieJicQ/SNAG-0028_thumb.png?imgmax=800" width="244" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O agrupamento se mostra útil, mas deve ser utilizado com moderação, já que os relacionamentos para fora do grupo partem do grupo, não dos itens individuais, dificultando a leitura da imagem :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-NwW5io35sJU/UYmqdLOt48I/AAAAAAAAHF0/4ZfHKQr79QA/s1600-h/SNAG-00292.png"&gt;&lt;img title="SNAG-0029" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0029" src="http://lh3.ggpht.com/-JvRATVjiVP8/UYmqeKXVWKI/AAAAAAAAHF8/NlpP8lBkziQ/SNAG-0029_thumb.png?imgmax=800" width="244" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As opções para criação de flags, criação de novos itens e novas associações que não existem no código também podem ser úteis, mas especialmente esses dois últimos devem ser utilizados com moderação.&lt;/p&gt;

&lt;p&gt;Sem dúvida, um excelente novo recurso para o Visual Studio.&lt;/p&gt;

&lt;p&gt;Veja um outro exemplo de gráfico criado sobre o webform do exemplo em …. :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-s351MLZHkQE/UYmqeyhubzI/AAAAAAAAHGE/1M-CeO9tYOw/s1600-h/SNAG-00313.png"&gt;&lt;img title="SNAG-0031" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAG-0031" src="http://lh4.ggpht.com/-LjAWMZj5aLw/UYmqlG2GJRI/AAAAAAAAHGI/Yb8aT8CnjZQ/SNAG-0031_thumb1.png?imgmax=800" width="498" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/LrCUKCsVo6o/vs-2012-code-map.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-gRKUeZuZnEk/UYmidNwmcnI/AAAAAAAAHDo/JV7pkLtvhGw/s72-c/SNAG-0018_thumb1.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/05/vs-2012-code-map.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-1351028005020737925</guid><pubDate>Tue, 02 Apr 2013 03:06:00 +0000</pubDate><atom:updated>2013-04-02T00:07:50.983-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Unity Test</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Onde foi parar o Create Unit Test no Visual Studio 2012 ?</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-AGHc1o7WGWs/UVpLEARNJqI/AAAAAAAAHC4/lrAFXuHO3rA/s1600-h/vs20122.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="vs2012" border="0" alt="vs2012" align="right" src="http://lh4.ggpht.com/-QyN_8vNfx7E/UVpLEr-Lk1I/AAAAAAAAHDA/47SSH47w7Gs/vs2012_thumb.jpg?imgmax=800" width="244" height="52" /&gt;&lt;/a&gt;O Visual Studio 2012 tem muitas novidades em relação a testes unitários, mas nem tudo são flores. A Microsoft está evoluindo o Visual Studio para suportar vários frameworks de teste, tal como NUnit, deixando de estar “preso” apenas com o framework de teste do visual studio.&lt;/p&gt;  &lt;p&gt;Se por um lado isso é bom, deram também um grande passo atrás : eliminaram da interface do Visual Studio 2012 a instrução “Create unit test…” que era acessível pelo menu de contexto dos métodos.&lt;/p&gt;  &lt;p&gt;Isso é muito ruim, pois faz com que os testes unitários tenham que ser criados do zero, algo muito desagradável. &lt;/p&gt;  &lt;p&gt;A instrução, na verdade, ainda existe internamente no Visual Studio, apenas sumiu da interface. Uma alternativa que temos é adicionar novamente a instrução na interface do visual studio.&lt;/p&gt;  &lt;p&gt;Isso pode ser feito com os seguintes passos :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;1) Abra a janela Tools –&amp;gt; Options –&amp;gt; Environment –&amp;gt; KeyBoard&lt;/p&gt;    &lt;p&gt;2) Em “Show Commands Containing” digite “createunit” para localizar facilmente a instrução correta.&lt;/p&gt;    &lt;p&gt;3) Selecione a opção “Text Editor” em “New Shortcut”&lt;/p&gt;    &lt;p&gt;4) Clique na caixa “Press shortcut keys” e pressione a combinação de teclas que deseja.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Em meu VS atribui a instrução ao CTRL+T, assim sendo posso utilizar essa combinação para disparar a criação de um novo unit test.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-T6BPGzbKwq8/UVpLFb8UZOI/AAAAAAAAHDI/DOXt08UFMao/s1600-h/SNAG-00154.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="SNAG-0015" border="0" alt="SNAG-0015" src="http://lh5.ggpht.com/-SF1xcwnzM7k/UVpLF7nneWI/AAAAAAAAHDQ/HEZjcTItabw/SNAG-0015_thumb2.png?imgmax=800" width="538" height="314" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para saber mais sobre as mudanças, veja um WalkThrough sobre Unity Tests no VS 2012 : &lt;a title="http://msdn.microsoft.com/en-us/library/ms182532.aspx" href="http://msdn.microsoft.com/en-us/library/ms182532.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms182532.aspx&lt;/a&gt;&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/ixYj-N7Bydo/onde-foi-parar-o-create-unit-test-no.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-QyN_8vNfx7E/UVpLEr-Lk1I/AAAAAAAAHDA/47SSH47w7Gs/s72-c/vs2012_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/04/onde-foi-parar-o-create-unit-test-no.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-2697978714090141148</guid><pubDate>Tue, 26 Mar 2013 11:37:00 +0000</pubDate><atom:updated>2013-03-26T08:37:33.580-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Unity Test</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Testabilidade em WebForms : Fazendo Mocks de Request</title><description>&lt;p&gt;   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-94yoMVBpHi8/UVGIdC4Ku1I/AAAAAAAAHCQ/8p7PGV8UJTk/s1600-h/aspnet%25255B2%25255D.png"&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="aspnet" border="0" alt="aspnet" align="right" src="http://lh6.ggpht.com/-loJvxR0SvXA/UVGId0TRdTI/AAAAAAAAHCY/V0PXoXnYgyk/aspnet_thumb.png?imgmax=800" width="196" height="71" /&gt;&lt;/a&gt;A classe Page, base para todo webform, possui propriedades Request, Response, Session, Server e Application que são frequentemente utilizadas no ASP.NET para manipularmos a comunicação, sessão e obtermos informações do servidor.&lt;/p&gt;  &lt;p&gt;Para podermos executar testes unitários é absolutamente necessário que possamos fazer mocks dessas propriedades e desta forma rodar os testes sem a necessidade de rodar a página em um servidor.&lt;/p&gt;  &lt;p&gt;Porém essas propriedades devolvem instâncias de tipos sealed, sem interfaces implementadas, impedindo a realização de mocks.&lt;/p&gt;  &lt;p&gt;Para resolver esse problema surgiu no framework .NET a classe HttpContextWrapper e as classes “Base” : HttpRequestBase, HttpResponseBase e outras. Ao contrário das classes originais, essas classes “Base” são abstratar, permitindo facilmente o uso de mocks. &lt;/p&gt;  &lt;p&gt;Devemos então re-implementar as propriedades Request, Response, Session, Server e Application de forma a retornar os novos tipos abstratos e não mais os antigos. Importante notar que não é possível fazer override, pois estaremos alterando o tipo da propriedade, então precisamos utilizar o “new”, que permite esconder uma implementação da classe pai.&lt;/p&gt;  &lt;p&gt;Repare ainda que utilizamos “virtual” na criação das novas propriedades, pois isso as torna “mockaveis”.&lt;/p&gt;  &lt;p&gt;Veja como fica o código :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        HttpContextWrapper cw;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; HttpRequestBase Request
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (cw == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    cw = &lt;span class="kwrd"&gt;new&lt;/span&gt; HttpContextWrapper(Context);
                }
                &lt;span class="kwrd"&gt;return&lt;/span&gt; cw.Request;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; HttpResponseBase Response
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (cw == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    cw = &lt;span class="kwrd"&gt;new&lt;/span&gt; HttpContextWrapper(Context);
                }
                &lt;span class="kwrd"&gt;return&lt;/span&gt; cw.Response;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; HttpApplicationStateBase Application
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (cw == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    cw = &lt;span class="kwrd"&gt;new&lt;/span&gt; HttpContextWrapper(Context);
                }
                &lt;span class="kwrd"&gt;return&lt;/span&gt; cw.Application;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; HttpSessionStateBase Session
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (cw == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    cw = &lt;span class="kwrd"&gt;new&lt;/span&gt; HttpContextWrapper(Context);
                }
                &lt;span class="kwrd"&gt;return&lt;/span&gt; cw.Session;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; HttpServerUtilityBase Server
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (cw == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    cw = &lt;span class="kwrd"&gt;new&lt;/span&gt; HttpContextWrapper(Context);
                }
                &lt;span class="kwrd"&gt;return&lt;/span&gt; cw.Server;
            }
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Como esse código é extenso, o ideal é inserir esse código em uma classe que herde de Page e depois fazer com que todos os webforms herdem dela.&lt;/p&gt;

&lt;p&gt;Veja um exemplo bem simples de código que depende dessa implementação para se tornar testável :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button1_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            Label1.Text = Request.AnonymousID;
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Utilizando o “Create Unit Test” do menu de contexto, geramos um novo projeto de teste para esse método, Button1_Click. Para fazer mock irei utilizar uma biblioteca chamada Moq, que podemos instalar na forma de um pacote Nuget (Manage Nuget packages permite isso).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-7I9psYFp_Ac/UVGIeVkQMXI/AAAAAAAAHCg/8i9wTl-CTDI/s1600-h/SNAG-0017%25255B3%25255D.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="SNAG-0017" border="0" alt="SNAG-0017" src="http://lh5.ggpht.com/-nTX9FLEOiO4/UVGIfA57pSI/AAAAAAAAHCo/qDRIXZU6Q4Y/SNAG-0017_thumb%25255B1%25255D.png?imgmax=800" width="528" height="353" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o Moq instalado, podemos fazer o código do nosso método de teste. Veja como fica :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        [TestMethod()]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button1_ClickTest()
        {
            &lt;span class="rem"&gt;// Mock do RequestBase para controlar o anonymousID&lt;/span&gt;
            &lt;span class="rem"&gt;// Seria impossível sem o requestbase&lt;/span&gt;
            var rb = &lt;span class="kwrd"&gt;new&lt;/span&gt; Mock&amp;lt;HttpRequestBase&amp;gt;();
            rb.Setup&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(x =&amp;gt; x.AnonymousID).Returns(&lt;span class="str"&gt;&amp;quot;Teste&amp;quot;&lt;/span&gt;);

            &lt;span class="rem"&gt;// Webform usa por default um private accessor&lt;/span&gt;
            var wf = &lt;span class="kwrd"&gt;new&lt;/span&gt; Mock&amp;lt;WebForm1&amp;gt;();
            wf.Setup&amp;lt;HttpRequestBase&amp;gt;(x =&amp;gt; x.Request).Returns(rb.Object);
            WebForm1_Accessor target = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebForm1_Accessor(&lt;span class="kwrd"&gt;new&lt;/span&gt; PrivateObject(wf.Object));

            &lt;span class="rem"&gt;//Controlando o label&lt;/span&gt;
            Label lbl = &lt;span class="kwrd"&gt;new&lt;/span&gt; Label();
            target.Label1 = lbl;

            target.Button1_Click(&lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);

            Assert.IsTrue(lbl.Text == &lt;span class="str"&gt;&amp;quot;Teste&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Falhou&amp;quot;&lt;/span&gt;);
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Claro que você, na prática, irá utilizar exemplos bem mais complexos do que esse, mas o principio é o mesmo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante :&lt;/strong&gt; No VS 2012 ocorreram mudanças no sistema de testes, esse exemplo não funcionará exatamente desta forma, funcionando apenas no VS 2010. Publicarei mais sobre o assunto.&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/CtCxjnHIYfY/testabilidade-em-webforms-fazendo-mocks.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-loJvxR0SvXA/UVGId0TRdTI/AAAAAAAAHCY/V0PXoXnYgyk/s72-c/aspnet_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/03/testabilidade-em-webforms-fazendo-mocks.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-1729052639769168476</guid><pubDate>Wed, 13 Mar 2013 02:42:00 +0000</pubDate><atom:updated>2013-03-12T23:42:06.212-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">WCF</category><title>Erro 417 : Expectation Failed–Solução</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;As vezes, quando acessamos alguns servidores utilizando o .NET, recebemos esse erro : Expectation Failed.&lt;/p&gt;  &lt;p&gt;Recentemente tenho recebido muito esse erro no acesso a internet através de alguns servidores de proxy, porém pode acontecer em muitas outras situações.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;O que significa ?&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O .NET faz o envio de dados para os servidores em 2 etapas, implementando um padrão existente no HTTP 1.1. Primeiro envia apenas os headers para o servidor, esperando que o servidor responda se suporta esse envio ou não. Em seguida, com uma resposta positiva do servidor, envia os dados.&lt;/p&gt;    &lt;p&gt;O erro “Expectation Failed” é justamente a resposta negativa do servidor.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Como Resolver&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Simples : Podemos desativar esse envio em duas etapas através de uma configuração no Web.Config, veja :&lt;/p&gt;    &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.net&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;settings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;servicePointManager&lt;/span&gt; &lt;span class="attr"&gt;expect100Continue&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;settings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.net&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/SVhHLjYC350/erro-417-expectation-failedsolucao.html</link><author>noreply@blogger.com (Dennes)</author><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/03/erro-417-expectation-failedsolucao.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-8335747091187091703</guid><pubDate>Thu, 07 Mar 2013 05:58:00 +0000</pubDate><atom:updated>2013-03-31T23:49:38.028-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Team Foundation Server</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>Nuget x TFS : Access Denied to MainCollection</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Instalei um servidor NUGET esses dias em uma empresa e, ao utiliza-lo junto com o TFS tive essa infeliz surpresa : A instalação de pacotes NUGET conflita com o TFS e recebemos a estranha mensagem de Access Denied na MainCollection do TFS.&lt;/p&gt;  &lt;p&gt;A solução acaba sendo simples : É necessário configurar o endereço do TFS nos endereços da intranet local, na configuração de segurança do IE.&lt;/p&gt;  &lt;p&gt;Não importa se você não usa o IE, pois as configurações de segurança que normalmente são feitas no IE valem para todo o ambiente windows, tanto é que no Windows 7 elas podem ser encontradas no control panel, não mais apenas no IE.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-o92EfH9xRp8/UTgsffU9n1I/AAAAAAAAHBo/ttUY3ytucO8/s1600-h/SNAG-00063.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="SNAG-0006" border="0" alt="SNAG-0006" src="http://lh5.ggpht.com/-lSrCgGYw1Lg/UTgsf9PFT7I/AAAAAAAAHBw/dmecbXb1Tv4/SNAG-0006_thumb1.png?imgmax=800" width="528" height="299" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vamos fazer o passo-a-passo pelo IE mesmo, porém fica registrado que existem outras opções.&lt;/p&gt;  &lt;p&gt;1) Abra o IE&lt;/p&gt;  &lt;p&gt;2) Vá em Tools-&amp;gt;Internet Options&lt;/p&gt;  &lt;p&gt;3) Clique em Security e selecione Local Intranet&lt;/p&gt;  &lt;p&gt;4) Clique no botão Sites&lt;/p&gt;  &lt;p&gt;5) Clique em Advanced&lt;/p&gt;  &lt;p&gt;6) Desmarque a opção “Require server verification (https) for all sites in this zone”&lt;/p&gt;  &lt;p&gt;7) Adicione a URL do TFS&lt;/p&gt;  &lt;p&gt;8) Dê Ok em tudo &lt;/p&gt;  &lt;p&gt;9) Tente novamente&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-dlgnAR-dgTE/UTgsgRO6ixI/AAAAAAAAHB4/-GL8xNkHx9c/s1600-h/tfs2.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="tfs" border="0" alt="tfs" src="http://lh6.ggpht.com/-2fOd0Ixr5ic/UTgsg5u-oHI/AAAAAAAAHCA/62WRlNMPgzI/tfs_thumb.png?imgmax=800" width="244" height="199" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;Fonte : &lt;/font&gt;&lt;a title="http://blog.rthand.com/post/2011/08/26/Fixing-combination-of-NuGet-and-Team-Foundation-in-workgroup-configuration-401-Unauthorized.aspx" href="http://blog.rthand.com/post/2011/08/26/Fixing-combination-of-NuGet-and-Team-Foundation-in-workgroup-configuration-401-Unauthorized.aspx"&gt;&lt;font size="1"&gt;http://blog.rthand.com/post/2011/08/26/Fixing-combination-of-NuGet-and-Team-Foundation-in-workgroup-configuration-401-Unauthorized.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/elN2Vatxyqs/nuget-x-tfs-access-denied-to.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-lSrCgGYw1Lg/UTgsf9PFT7I/AAAAAAAAHBw/dmecbXb1Tv4/s72-c/SNAG-0006_thumb1.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/03/nuget-x-tfs-access-denied-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-7941996870382584927</guid><pubDate>Wed, 06 Mar 2013 05:34:00 +0000</pubDate><atom:updated>2013-03-06T02:34:27.919-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">HTML 5</category><title>Validações em HTML 5 : Personalizando as mensagens</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-XmCrLv4F6LE/UTbVYB5HFII/AAAAAAAAHBQ/ZjiJpvik01Y/s1600-h/HTML5%25255B3%25255D.jpg"&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="HTML5" border="0" alt="HTML5" align="right" src="http://lh4.ggpht.com/-ixT_bcspEG8/UTbVYtWbLiI/AAAAAAAAHBY/UxGBVNjXo5w/HTML5_thumb.jpg?imgmax=800" width="244" height="209" /&gt;&lt;/a&gt;Publiquei uma dica sobre como usar o setCustomValidity para &lt;a href="http://www.bufaloinfo.com.br/dicas.aspx?cod=1127" target="_blank"&gt;personalizar a mensagem de validação exibida automaticamente pelo HTML 5&lt;/a&gt; na validação de formulários.&lt;/p&gt;  &lt;p&gt;Isso já é um inicio para a personalização, porém existem situações mais complexas : Podem haver muitas causas para um erro de validação.&lt;/p&gt;  &lt;p&gt;Por exemplo : Em um campo definido como numérico, ele pode estar inválido por não ter sido preenchido, pelo número estar abaixo do limite mínimo ou por estar acima do limite máximo. A mensagem, nesse caso, precisa ser personalizada.&lt;/p&gt;  &lt;p&gt;Vamos considerar o seguinte campo :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;               &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;number&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;txtnome&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;required&lt;/span&gt; &lt;span class="attr"&gt;min&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;max&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;oninvalid&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;javascript:subinvalid(this)&amp;quot;&lt;/span&gt;  &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;Observe que estou utilizando o evento &lt;strong&gt;&lt;em&gt;oninvalid&lt;/em&gt;&lt;/strong&gt; para chamar uma rotina em javascript e passando o próprio campo como parâmetro.&lt;/p&gt;

&lt;p&gt;Veja como fica a rotina para personalizar a mensagem de erro :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &amp;lt;script&amp;gt;

        &lt;span class="kwrd"&gt;function&lt;/span&gt; subinvalid(sender) {
            sender.setCustomValidity(&lt;span class="str"&gt;''&lt;/span&gt;);

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!sender.validity.valid) {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (sender.validity.valueMissing)
                    sender.setCustomValidity(&lt;span class="str"&gt;&amp;quot;Por favor, preencha o valor!&amp;quot;&lt;/span&gt;);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (sender.validity.rangeOverflow)
                    sender.setCustomValidity(&lt;span class="str"&gt;&amp;quot;O valor pode ser no máximo &amp;quot;&lt;/span&gt; + sender.max);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (sender.validity.rangeUnderflow)
                    sender.setcCustomValidity(&lt;span class="str"&gt;&amp;quot;O valor deve ser no mínimo &amp;quot;&lt;/span&gt; + sender.min);
                }
        }
     &amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Através do objeto validity ligado ao próprio campo podemos identificar exatamente que tipo de erro de validação ocorreu e desta forma personalizar a mensagem de acordo com o erro de validação.&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/bkh6A_NSMyo/validacoes-em-html-5-personalizando-as.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-ixT_bcspEG8/UTbVYtWbLiI/AAAAAAAAHBY/UxGBVNjXo5w/s72-c/HTML5_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/03/validacoes-em-html-5-personalizando-as.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-9134923369643472951</guid><pubDate>Mon, 04 Mar 2013 09:24:00 +0000</pubDate><atom:updated>2013-03-04T06:24:15.830-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>Compreendendo os TraceFlags</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;TraceFlag é um mecanismo através do qual podemos alterar o comportamento do servidor SQL Server, habilitando algumas características adicionais do servidor.&lt;/p&gt;  &lt;p&gt;Os traceflags são identificados numericamente, cada traceflag representa uma característica a mais do servidor que podemos habilitar. Existem traceflags documentados e não documentados.&lt;/p&gt;  &lt;p&gt;Existem três tipos de traceflag :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Global :&lt;/strong&gt; Uma vez habilitado, gera efeito em todas as sessões abertas com o servidor de banco&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Sessão :&lt;/strong&gt; Gera efeito apenas na sessão na qual foi habilitado&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Global e Sessão :&lt;/strong&gt; Pode ser utilizado das duas formas&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Cada traceflag envolve funcionalidades complexas do banco que podem ter consequencias consideráveis em especial sobre performance e manutenção, então é importante estudar cuidadosamente os traceflags que deseja utilizar.&lt;/p&gt;  &lt;p&gt;Para habilitar um traceflag de sessão :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;DBCC TraceOn(3205)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Para habilitar um traceflag global :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;DBCC TraceOn(3205,-1)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;(O traceflag 3205 é de sessão e global)&lt;/p&gt;  &lt;p&gt;Mesmo no caso do traceflag global, quando o serviço do SQL Server for reiniciado o traceflag estará desabilitado novamente. Para que isso não ocorra a ativação do traceflag deve se dar na forma de parâmetro do serviço, utilizando o parâmetro –T &amp;lt;traceflag&amp;gt;&lt;/p&gt;  &lt;p&gt;Para isso entramos em “View Local Services” no windows, localizamos o serviço do SQL Server e adicionamos o parâmetro –T conforme a imagem abaixo :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-rvKMpFMOVW0/UTRoO_OUxgI/AAAAAAAAHA4/xUe5c5aXU14/s1600-h/SNAG-00074.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="SNAG-0007" border="0" alt="SNAG-0007" src="http://lh6.ggpht.com/-Tck9xNhwIrM/UTRoPgrzinI/AAAAAAAAHBA/2sPdzaNU5Uk/SNAG-0007_thumb2.png?imgmax=800" width="494" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Descobrir quais estão ativados&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Para descobrir quais traceflags encontram-se ativados utilize a instrução DBCC TRACESTATUS&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/7T8Spghmxr8/compreendendo-os-traceflags.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-Tck9xNhwIrM/UTRoPgrzinI/AAAAAAAAHBA/2sPdzaNU5Uk/s72-c/SNAG-0007_thumb2.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/03/compreendendo-os-traceflags.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-3788099932242610762</guid><pubDate>Tue, 26 Feb 2013 03:47:00 +0000</pubDate><atom:updated>2013-02-26T00:47:54.045-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>SSIS : Rodar pacotes de 32 bits em um ambiente de 64 bits</title><description>&lt;p&gt;   &lt;br /&gt;Eventualmente rodar pacotes SSIS em 32 bits pode ser necessário, mesmo tendo um ambiente de 64 bits. Isso pode acontecer por causa do uso de alguns drivers ISAM que não irão rodar em 64 bits, tal como para troca de dados com excel.&lt;/p&gt;  &lt;p&gt;Garantir que o pacote seja rodado em 32 bits irá depender da forma de execução do pacote, tendo assim diversas variações.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;BIDS&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Para a execução no BIDS, devemos ir nas propriedades da solution, debugging, Run64BitRuntime e marcar essa opção como true.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-Md-shMA0DlY/USwwX15hjbI/AAAAAAAAHAM/jZYKGL9bQ0k/s1600-h/pacoteSSIS3.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="pacoteSSIS" border="0" alt="pacoteSSIS" src="http://lh6.ggpht.com/-2fuGfqgFhnk/USwwYsA_k7I/AAAAAAAAHAU/22vQXj5SqqM/pacoteSSIS_thumb1.png?imgmax=800" width="467" height="309" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Duplo clique no dtsx&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Isso dispara o Package Execution Utility, que já é de 32 bits, portanto não é um problema.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Servidor SSIS&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Vale a configuração do BIDS&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Job do SQL Server Agent (SQL Server 2008)&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Nas propriedades do step, marque a opção “Use 32 bit runtime”&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-HWVWLr4pg70/USwwZLLijGI/AAAAAAAAHAc/bqE0hhN6u_E/s1600-h/agent20084.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="agent2008" border="0" alt="agent2008" src="http://lh6.ggpht.com/-BX9BezaOw64/USwwaAsl6SI/AAAAAAAAHAk/BPlznTEhZn8/agent2008_thumb2.png?imgmax=800" width="482" height="433" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Job do SQL Server Agent (2005)&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Não existe a opção “Use 32 bit runtime”. Neste caso é necessário utilizar o step do tipo cmdexec e montar uma instrução chamando do dtexec da versão que desejamos.&lt;/p&gt;    &lt;p&gt;Uma sugestão para montar a instrução de execução é utilizar o Execute Package Utility.&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/a5L-KbFWQMo/ssis-rodar-pacotes-de-32-bits-em-um.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-2fuGfqgFhnk/USwwYsA_k7I/AAAAAAAAHAU/22vQXj5SqqM/s72-c/pacoteSSIS_thumb1.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/02/ssis-rodar-pacotes-de-32-bits-em-um.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-8224024225213103195</guid><pubDate>Sun, 17 Feb 2013 21:25:00 +0000</pubDate><atom:updated>2013-02-17T18:25:39.884-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><title>Presente da Microsoft : Thank You Gift pelo VS 2012</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-vd9gkXKX0RQ/USFKwW_2IaI/AAAAAAAAG_A/m7D4ZzoRp0w/s1600-h/WP_000586%25255B3%25255D.jpg"&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="WP_000586" border="0" alt="WP_000586" align="right" src="http://lh3.ggpht.com/-l05NpGoEXWE/USFKxOtxuBI/AAAAAAAAG_I/fjQpD6W_Jl0/WP_000586_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;Recebi há alguns dias atrás um presente da Microsoft : Um Thank You Gift por ter auxiliado no processo de criação do VS 2012.&lt;/p&gt;  &lt;p&gt;É um presente simples, mas muito importante pelo que representa. Utilizei o Visual Studio durante o periodo de beta test, fiz sugestões, indiquei bugs, algumas sugestões que fiz foram implementadas (pelo menos de forma próxima ao que sugeri). &lt;/p&gt;  &lt;p&gt;É muito legal ser reconhecido por ter participado do desenvolvimento deste grande produto.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-EPzF9_6ksSg/USFKx7r020I/AAAAAAAAG_Q/JwlBbaBAreE/s1600-h/WP_000585%25255B3%25255D.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="WP_000585" border="0" alt="WP_000585" src="http://lh4.ggpht.com/-XBPDsL-KY5I/USFKyVexVaI/AAAAAAAAG_Y/xJt83XKUypA/WP_000585_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/-iXfjoNdYo68/USFKy6FriEI/AAAAAAAAG_g/zfOVvOnqiAU/s1600-h/WP_000604%25255B3%25255D.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="WP_000604" border="0" alt="WP_000604" src="http://lh6.ggpht.com/-igzvDKcF3tg/USFKzn1CEWI/AAAAAAAAG_o/qf8pQU2ybyQ/WP_000604_thumb.jpg?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-NLDkbagHYjI/USFK0ZubYZI/AAAAAAAAG_w/_SkTFzK678w/s1600-h/WP_000610%25255B3%25255D.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="WP_000610" border="0" alt="WP_000610" src="http://lh3.ggpht.com/-_pcSS6lXIlw/USFK0lpLzJI/AAAAAAAAG_4/fkta5xe8850/WP_000610_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/aFYUocuRsFo/presente-da-microsoft-thank-you-gift.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-l05NpGoEXWE/USFKxOtxuBI/AAAAAAAAG_I/fjQpD6W_Jl0/s72-c/WP_000586_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/02/presente-da-microsoft-thank-you-gift.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-2426896370325291751</guid><pubDate>Fri, 01 Feb 2013 03:18:00 +0000</pubDate><atom:updated>2013-02-01T01:18:48.869-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>Resposta : Desafio de SQL Server</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-BAAtez5eyO4/UQs0E-_Dm6I/AAAAAAAAG-k/1GE4OdES0Rs/s1600-h/sql-server-logo2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="sql-server-logo" border="0" alt="sql-server-logo" align="right" src="http://lh4.ggpht.com/-yyLZqCha7Y4/UQs0F89BYmI/AAAAAAAAG-s/XUO4DzN6lQQ/sql-server-logo_thumb.png?imgmax=800" width="244" height="79" /&gt;&lt;/a&gt;Há algumas semanas propus um desafio de SQL, com um prêmio para quem acertasse a questão. Podem ver a questão original em &lt;a title="http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=1357079492327179156" href="http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=1357079492327179156"&gt;http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=1357079492327179156&lt;/a&gt; . Infelizmente ninguém acertou.&lt;/p&gt;  &lt;p&gt;Então é chegado o momento da verdade : A Resposta !!&lt;/p&gt;  &lt;p&gt;A explicação do problema começa no fato de estarmos utilizando transações distribuidas no framework .NET (transactionScope). Essas transações, devido a uma visão muito conversavadora, elas assumem por default um transaction isolation level como serializable.&lt;/p&gt;  &lt;p&gt;Isso ocorre por uma suposição de que o desenvolvedor não saiba o que são exatamente os transaction isolation levels, então assume-se a opção mais segura para o funcionamento – e mais prejudicial para a performance.&lt;/p&gt;  &lt;p&gt;Essa característica pode ser uma novidade para muitos, mais ainda não explica claramente a situação – por que um único procedimento, ao ser executado por duas pessoas, estava gerando deadlock ?&lt;/p&gt;  &lt;p&gt;O procedimento em si era composto por um select e um update, ambos na mesma tabela. &lt;/p&gt;  &lt;p&gt;A impressão geral seria : quando uma execução pegar um lock, as demais param no mesmo ponto, então nunca daria deadlock, certo ? Errado.&lt;/p&gt;  &lt;p&gt;Assim como todos os isolation levels, o serializable muda o comportamento dos locks sobre os selects. O que ele faz ? É como se ele aplicasse um holdLock no select. Por padrão um select causa lock shared, com o uso de holdlock o lock shared será mantido até o fim da transação.&lt;/p&gt;  &lt;p&gt;Ora, locks shared são compatíveis com locks shared, então várias execuções podem pegar lock shared ao mesmo tempo sobre os mesmos objetos.&lt;/p&gt;  &lt;p&gt;Assim, voltando ao procedimento : As duas execuções simultâneas passariam pelo select sem problema algum, ambas pegariam lock shared na tabela. Porém, ao chegar no update, ficariam esperando que a outra execução liberasse o lock shared para que o update pudesse prosseguir. Temos então duas execuções, uma esperando pela outra. Resultado : Deadlock!!&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/ZOGhph6sJkc/resposta-desafio-de-sql-server.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-yyLZqCha7Y4/UQs0F89BYmI/AAAAAAAAG-s/XUO4DzN6lQQ/s72-c/sql-server-logo_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/02/resposta-desafio-de-sql-server.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-4600311661653209979</guid><pubDate>Thu, 31 Jan 2013 02:29:00 +0000</pubDate><atom:updated>2013-01-31T00:29:17.187-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WPF</category><title>Criando um botão HOME</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Criar um botão HOME é tarefa necessária em aplicações que envolvam navegação por várias telas ou funcionalidades.&lt;/p&gt;  &lt;p&gt;O enum NavigationCommands define um Command chamado BrowseHome, porém o objeto Frame não implementa esse command.&lt;/p&gt;  &lt;p&gt;Podemos fazer uma definição personalizada do command BrowseHome para o objeto Frame. A forma mais prática de fazermos isso é criando um Behavior para o Frame que faça essa definição personalizada.&lt;/p&gt;  &lt;p&gt;Veja como fica o código :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; HomeBehavior : Behavior&amp;lt;Frame&amp;gt;
    {

        &lt;span class="kwrd"&gt;void&lt;/span&gt; BrowseHomeExecuted(&lt;span class="kwrd"&gt;object&lt;/span&gt; target, ExecutedRoutedEventArgs e)
        {
            &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.AssociatedObject.CanGoBack)
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.AssociatedObject.GoBack();
        }
        &lt;span class="kwrd"&gt;void&lt;/span&gt; BrowseHomeCanExecute(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, CanExecuteRoutedEventArgs e)
        {
              e.CanExecute = &lt;span class="kwrd"&gt;this&lt;/span&gt;.AssociatedObject.CanGoBack;
        }

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnAttached()
        {
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnAttached();
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.AssociatedObject.CommandBindings.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; System.Windows.Input.CommandBinding(NavigationCommands.BrowseHome,
                                        BrowseHomeExecuted, BrowseHomeCanExecute));

        }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;Como funciona :&lt;/strong&gt; Através da coleção de CommandBindings adicionamos um novo CommandBinding, que fará com que o frame compreenda o command BrowseHome&lt;/p&gt;

&lt;p&gt;Veja como fazemos para anexar esse behavior no frame :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;       &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Frame&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;_mainFrame&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;NavigationUIVisibility&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Hidden&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;i:Interaction.Behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
               &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;vm:HomeBehavior&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;i:Interaction.Behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Frame&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;É necessário acrescentar na tag Window 2 importações de namespaces, uma para o seu namespace, onde irá criar o HomeBehavior, outra para System.Windows.Interactivity :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;       xmlns:vm=&lt;span class="str"&gt;&amp;quot;clr-namespace:MeuNamespace;assembly=Meuassembly&amp;quot;&lt;/span&gt;
       xmlns:i=&lt;span class="str"&gt;&amp;quot;clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Veja agora como fica um botão Home, inserido na mesma janela onde está o frame :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource estiloHome}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;80&amp;quot;&lt;/span&gt; 
                        &lt;span class="attr"&gt;CommandTarget&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=_mainFrame}&amp;quot;&lt;/span&gt;  &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BrowseHome&amp;quot;&lt;/span&gt; 
                    &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Publicamos recentemente uma dica que mostra &lt;a href="http://www.bufaloinfo.com.br/dicas.aspx?cod=1116" target="_blank"&gt;como vincular o CommandTarget de um botão dentro de uma página ao frame que contém a página&lt;/a&gt;, assim o botão Home poderia também estar dentro de uma página contida no frame.&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/fwZFKK9Jyno/criando-um-botao-home.html</link><author>noreply@blogger.com (Dennes)</author><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/01/criando-um-botao-home.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-4056709612566575248</guid><pubDate>Tue, 29 Jan 2013 02:43:00 +0000</pubDate><atom:updated>2013-01-31T01:32:27.842-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Entity Framework</category><title>Diferença de AsNoTracking e AutoDetectChanges no Entity Framework</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Anteriormente publiquei dicas sobre o uso do AsNoTracking (&lt;a title="http://www.bufaloinfo.com.br/dicas.aspx?cod=1106" href="http://www.bufaloinfo.com.br/dicas.aspx?cod=1106"&gt;http://www.bufaloinfo.com.br/dicas.aspx?cod=1106&lt;/a&gt;) e do AutoDetectChanges (&lt;a title="http://www.bufaloinfo.com.br/dicas.aspx?cod=1115" href="http://www.bufaloinfo.com.br/dicas.aspx?cod=1115"&gt;http://www.bufaloinfo.com.br/dicas.aspx?cod=1115&lt;/a&gt;), ambos úteis para otimizações no entity framework.&lt;/p&gt;  &lt;p&gt;Porém observei que existe uma certa confusão entre o uso dos dois. Quando usar um, quando usar outro. Então vejamos uma descrição um pouco melhor de como isso funciona.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Contexto e Entidades&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Quando buscamos entidades da através do entity framework, este guarda as entidades no contexto, fazendo um processo que é chamado de tracking das entidades. É este tracking, o fato das entidades estarem no contexto, que permite posteriormente que possa ocorrer uma atualização destas entidades.&lt;/p&gt;    &lt;p&gt;Porém o simples tracking não é suficiente para que uma atualização ocorra. No momento em que pedimos que atualizações sejam salvas, o entity framework irá consultar entre as entidades das quais está fazendo tracking quais encontram-se marcadas como alteradas e então sim, enviar as alterações para o servidor.&lt;/p&gt;    &lt;p&gt;Portanto, para que uma gravação ocorra, além do tracking estar sendo realizado, é necessário que a entidade esteja marcada como alterada.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;DetectChanges&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O processo pelo qual mudanças são detectadas é simples : Ao carregarmos entidades, é criada uma cópia delas, um snapshot, em memória. O contexto possui um método chamado DetectChanges que compara as entidades que carregamos com o snapshot guardado em memória. Se forem diferentes, uma mudança ocorreu.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;AutoDetectChanges&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O AutoDetectChanges significa detectar automaticamente a ocorrência de mudanças. Isso significa que, de forma vinculada a alguns eventos, o método DetectChanges será automaticamente chamado, sem precisarmos fazer nada, marcando as entidades como alteradas.&lt;/p&gt;    &lt;p&gt;O problema disso está no fato de que cada vez que chamamos o DetectChanges ele precisa percorrer todas as entidades do contexto. Quanto mais entidades envolvidas, maior o tempo gasto.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;AsNoTracking x AutoDetectChanges&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Utilizar o AsNoTracking significa que as entidades serão lidas da origem de dados mas não serão mantidas no contexto. Com isso não poderão ser atualizadas posteriormente. &lt;/p&gt;    &lt;p&gt;É claro que ao usar o AsNoTracking o AutoDetectChanges também não se aplicará sobre essas entidades, é uma consequencia. Porém o AsNoTracking é uma forma radical de resolver o problema para situações apenas de leitura de dados.&lt;/p&gt;    &lt;p&gt;Exemplo do AsNoTracking :&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;var resultado=(from x &lt;span class="kwrd"&gt;in&lt;/span&gt; ne.Customers
&lt;span class="kwrd"&gt;where&lt;/span&gt; x.CustomerID==cliente
select x).AsNoTracking();&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

  &lt;p&gt;Imagine porém situações em que você precisará fazer muitos inserts ou updates nas entidades. O AsNoTracking não pode ser utilizado, porém por serem muitas entidades o AutoDetectChanges causa uma perda de performance.&amp;#160; Assim podemos otimizar muitos inserts e updates no contexto de uma forma simples :&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;Desliga-se o autodetectchanges &lt;/li&gt;

    &lt;li&gt;Realiza-se as mudanças &lt;/li&gt;

    &lt;li&gt;Chama-se o método detectchanges para fazer a detecção de mudanças &lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Exemplo de AutoDetectChanges :&lt;/p&gt;

  &lt;pre class="csharpcode"&gt; context.Configuration.AutoDetectChangesEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;

&lt;span class="rem"&gt;// Realiza-se as mudanças aqui&lt;/span&gt;

context.ChangeTracker.DetectChanges();&lt;/pre&gt;
  &lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Desta forma otimiza-se consideravelmente o código&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Resumindo&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Veja o quadro abaixo as diferenças entre os dois :&lt;/p&gt;

  &lt;table border="1" cellspacing="0" cellpadding="2" width="498"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td valign="top" width="149"&gt;&amp;#160;&lt;/td&gt;

        &lt;td valign="top" width="51"&gt;Está no Contexto&lt;/td&gt;

        &lt;td valign="top" width="75"&gt;Permite atualizações&lt;/td&gt;

        &lt;td valign="top" width="107"&gt;Identifica Mudanças Automaticamente&lt;/td&gt;

        &lt;td valign="top" width="114"&gt;Quando utilizar&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="149"&gt;AsNoTracking&lt;/td&gt;

        &lt;td valign="top" width="51"&gt;Não&lt;/td&gt;

        &lt;td valign="top" width="75"&gt;Não&lt;/td&gt;

        &lt;td valign="top" width="108"&gt;Não&lt;/td&gt;

        &lt;td valign="top" width="114"&gt;Somente leitura de dados&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="149"&gt;AutoDetectChanges=true&lt;/td&gt;

        &lt;td valign="top" width="51"&gt;Sim&lt;/td&gt;

        &lt;td valign="top" width="75"&gt;Sim&lt;/td&gt;

        &lt;td valign="top" width="107"&gt;Sim&lt;/td&gt;

        &lt;td valign="top" width="114"&gt;Leitura e gravação de registros individuais&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="149"&gt;AutoDetectChanges=false&lt;/td&gt;

        &lt;td valign="top" width="51"&gt;Sim&lt;/td&gt;

        &lt;td valign="top" width="75"&gt;Sim&lt;/td&gt;

        &lt;td valign="top" width="107"&gt;Não&lt;/td&gt;

        &lt;td valign="top" width="114"&gt;Atualizações em lote&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Referência&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a title="http://blog.staticvoid.co.nz/2012/5/7/entityframework_performance_and_autodetectchanges" href="http://blog.staticvoid.co.nz/2012/5/7/entityframework_performance_and_autodetectchanges"&gt;http://blog.staticvoid.co.nz/2012/5/7/entityframework_performance_and_autodetectchanges&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/LFUjGrGj0GE/diferenca-de-asnotracking-e.html</link><author>noreply@blogger.com (Dennes)</author><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/01/diferenca-de-asnotracking-e.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-1357079492327179156</guid><pubDate>Tue, 08 Jan 2013 02:02:00 +0000</pubDate><atom:updated>2013-01-08T00:02:31.493-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>Desafio de SQL : DeadLocks</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Esbarrei com essa questão em um ambiente e quebrei a cabeça nela por alguns minutos até identificar o problema, não é nada óbvio. Então vai como um desafio para vocês. Respondam nos comentários. &lt;/p&gt;  &lt;p&gt;Eis uma motivação :&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;strong&gt;O primeiro que explicar a resposta certa leva 1 mês gratis de acesso na PluralSight&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Introdução da pergunta&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Deadlocks são assuntos conhecidos pelos DBA’s, a causa e resolução, apesar de difícil de achar, é clara : Dois processos, x e y, estão realizando transações com acessos em ordem invertida nos objetos de banco.&lt;/p&gt;    &lt;p&gt;Por exemplo : X acessa a tabela clientes e funcionários, nesta ordem, enquanto que y acessa a tabela funcionários e clientes, nesta ordem. Os dois podem gerar deadlocks entre si.&lt;/p&gt;    &lt;p&gt;O conhecimento geral aceito é que um mesmo processo ( x ) pode lockar a si mesmo quando executado simultaneamente por vários usuários, mas não causar deadlock.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;PERGUNTA&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Em um ambiente com ocorrência de Deadlocks, você utiliza o DeadlockGraph do profiler e se espanta ao analisar o resultado e ver que o deadlock está sendo causado por um único processo e não 2.&lt;/p&gt;    &lt;p&gt;Os processos estão desenvolvidos em .NET utilizando transações distribuidas (System.Transactions).&lt;/p&gt;    &lt;p&gt;Então : O que faz com que um único processo cause deadlock com ele mesmo ? O que está causando deadlock neste cenário ?&lt;/p&gt;    &lt;p&gt;Aguardarei por 15 dias ou umas 10 tentativas de resposta nos comentários, o que vier primeiro, então darei a resposta. &lt;strong&gt;&lt;em&gt;BOA SORTE ! ;-)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/H1DTqnEsbtc/desafio-de-sql-deadlocks.html</link><author>noreply@blogger.com (Dennes)</author><thr:total>3</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2013/01/desafio-de-sql-deadlocks.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-2295930069244239558</guid><pubDate>Sun, 11 Nov 2012 22:29:00 +0000</pubDate><atom:updated>2012-11-11T20:29:41.908-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>Substitua Updates por Bulk Inserts</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-58Nk04NByps/UKAmve1VBhI/AAAAAAAAG98/bTRCjIhdiXc/s1600-h/sql-server-logo2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="sql-server-logo" border="0" alt="sql-server-logo" align="right" src="http://lh3.ggpht.com/-8FlQMj1Psnc/UKAm0QnB9FI/AAAAAAAAG-E/dM0XCBci6b0/sql-server-logo_thumb.png?imgmax=800" width="244" height="79" /&gt;&lt;/a&gt;Esbarrei com essa possibilidade de otimização durante processos de importação de dados. Qualquer processamento em banco, especialmente quando envolvendo tabelas temporárias, pode ter essa possibilidade.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Problema :&lt;/strong&gt; Instruções UPDATE são instruções full-logged, gravadas em detalhes no log de transações. Quando executadas em um grande volume de dados tem um impacto considerável no tempo de execução de um batch.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Solução :&lt;/strong&gt; Substituir instruções UPDATE intermediárias de processamento por SELECT INTO criando tabelas temporárias. SELECT INTO é uma instrução que realiza BULK INSERT e por isso, exceto quando o banco estiver com recovery model full (o que pode ser mudado apenas para execução do batch) será minimamente logada.&lt;/p&gt;  &lt;p&gt;Na sequencia abaixo farei um exemplo com instrução UPDATE e gerando um resultado equivalente com SELECT INTO, podendo comparar o tempo de execução. Utilize um banco de dados de teste com um bom tamanho disponível.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Criar a tabela :&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[tabTeste](&lt;/pre&gt;

    &lt;pre&gt;    [id] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt;(1,1) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;Primary&lt;/span&gt; &lt;span class="kwrd"&gt;Key&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;    [valor1] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](30) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre&gt;    [valor2] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](50) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;    [varlor3] [&lt;span class="kwrd"&gt;varchar&lt;/span&gt;](30) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre&gt;)&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;Preencher com dados :&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tabTeste &lt;span class="kwrd"&gt;values&lt;/span&gt; (&lt;span class="str"&gt;'x'&lt;/span&gt;,&lt;span class="str"&gt;'a'&lt;/span&gt;,&lt;span class="str"&gt;'b'&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tabTeste &lt;span class="kwrd"&gt;values&lt;/span&gt; (&lt;span class="str"&gt;'b'&lt;/span&gt;,&lt;span class="str"&gt;'x'&lt;/span&gt;,&lt;span class="str"&gt;'a'&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre class="alt"&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tabTeste &lt;span class="kwrd"&gt;values&lt;/span&gt; (&lt;span class="str"&gt;'a'&lt;/span&gt;,&lt;span class="str"&gt;'x'&lt;/span&gt;,&lt;span class="str"&gt;'b'&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tabTeste &lt;span class="kwrd"&gt;values&lt;/span&gt; (&lt;span class="str"&gt;'a'&lt;/span&gt;,&lt;span class="str"&gt;'b'&lt;/span&gt;,&lt;span class="str"&gt;'x'&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre class="alt"&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tabTeste &lt;span class="kwrd"&gt;values&lt;/span&gt; (&lt;span class="str"&gt;'b'&lt;/span&gt;,&lt;span class="str"&gt;'a'&lt;/span&gt;,&lt;span class="str"&gt;'x'&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tabTeste &lt;span class="kwrd"&gt;values&lt;/span&gt; (&lt;span class="str"&gt;'x'&lt;/span&gt;,&lt;span class="str"&gt;'b'&lt;/span&gt;,&lt;span class="str"&gt;'a'&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;go&lt;/span&gt; 60000&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;O GO multiplica a execução da instrução, populando a tabela. O número, porém, precisará ser alterado conforme seu servidor para criar um volume relevante.&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Instrução update :&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt; &lt;span class="kwrd"&gt;transaction&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;update&lt;/span&gt; tabteste &lt;span class="kwrd"&gt;set&lt;/span&gt; valor2=&lt;span class="str"&gt;'z'&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Utilize Rollback Transaction para cancelar o update e continuar os testes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Limpar o cache :&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Entre uma execução e outra é importante limpar o cache para garantir a exatidão na medida do tempo de execução&lt;/p&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CHECKPOINT&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;DBCC&lt;/span&gt; DROPCLEANBUFFERS&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instrução Select INTO :&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt; &lt;span class="kwrd"&gt;transaction&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; id, valor1, &lt;span class="str"&gt;'z'&lt;/span&gt; &lt;span class="kwrd"&gt;as&lt;/span&gt; valor2, varlor3 &lt;span class="kwrd"&gt;into&lt;/span&gt; #tabtemp &lt;span class="kwrd"&gt;from&lt;/span&gt; tabteste&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;Resultado&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Em meus testes a execução com update levou 4 seg, enquanto que a execução com select into não chegou a consumir 1 seg., demonstrando assim o quanto é mais rápida.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;A possibilidade de substituir um pelo outro depende do resultado final desejado, em meio a um processamento batch, lidando com tabelas temporárias, isso é bem possível sim.&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/rmi7zR_C3bQ/substitua-updates-por-bulk-inserts.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-8FlQMj1Psnc/UKAm0QnB9FI/AAAAAAAAG-E/dM0XCBci6b0/s72-c/sql-server-logo_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/11/substitua-updates-por-bulk-inserts.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-1854364003430643908</guid><pubDate>Wed, 31 Oct 2012 05:03:00 +0000</pubDate><atom:updated>2012-10-31T03:03:21.239-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Eventos</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>ASP.NET WebForms 4.5–Palestra no BaixadaTech</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-u2jdT--bA0M/UJCxEcZbJxI/AAAAAAAAG9k/fnZMbGBfSSw/s1600-h/baixadaTech%25255B2%25255D.jpg"&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="baixadaTech" border="0" alt="baixadaTech" align="right" src="http://lh3.ggpht.com/-7PHUhUUX2C0/UJCxF2b38wI/AAAAAAAAG9s/BN3YCVme06Q/baixadaTech_thumb.jpg?imgmax=800" width="184" height="184" /&gt;&lt;/a&gt;No dia 20/10 estive em Santos palestrando no BaixadaTech 2012, mais um grande evento organizado pelo Dinart na UniSanta.&lt;/p&gt;  &lt;p&gt;Você pode baixar o &lt;a href="https://skydrive.live.com/redir?resid=9939F08DFB6D1298!1301&amp;amp;authkey=!AIg0CTU1uwyCyvo" target="_blank"&gt;projeto de demonstração e os PPTs aqui&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Os tópicos que apresentei no BaixadaTech irão aos poucos virar pequenos (ou não tão pequenos assim) artigos.&lt;/p&gt;  &lt;p&gt;Vejam alguns que já estou publicando :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=6477130834484811950" target="_blank"&gt;VS 2012 : Configuração Inicial de Projeto&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Neste escrevi algumas recomendações sobre a configuração inicial de uma Empty ASP.NET Application&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=420492031550330433" target="_blank"&gt;Model Binding no Webforms 4.5 com Camadas de Negócio&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Neste mostro como realizar o Model Binding com um componente de negócio ao invés de deixar o código todo no code-behind. Um artigo maior sobre Model Binding está por vir&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Veja como estar atento as novidades&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Mande um e-mail para &lt;a href="mailto:devaspnet-subscribe@yahoogrupos.com.br"&gt;devaspnet-subscribe@yahoogrupos.com.br&lt;/a&gt; para se inscrever na lista de discussão&lt;/p&gt;    &lt;p&gt;Mande um e-mail para &lt;a href="mailto:devSQL-subscribe@yahoogrupos.com.br"&gt;devSQL-subscribe@yahoogrupos.com.br&lt;/a&gt; para se inscrever na lista de discussão&lt;/p&gt;    &lt;p&gt;Acesse &lt;a href="http://www.facebook.com.br/devASPNet"&gt;http://www.facebook.com.br/devASPNet&lt;/a&gt; e curta o grupo para receber sempre as novidades&lt;/p&gt;    &lt;p&gt;Acesse &lt;a href="http://www.facebook.com.br/devSQL"&gt;http://www.facebook.com.br/devSQL&lt;/a&gt; e curta o grupo para receber sempre as novidades&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/OAJrkwMRK1o/aspnet-webforms-45palestra-no.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-7PHUhUUX2C0/UJCxF2b38wI/AAAAAAAAG9s/BN3YCVme06Q/s72-c/baixadaTech_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/10/aspnet-webforms-45palestra-no.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-6477130834484811950</guid><pubDate>Wed, 31 Oct 2012 04:27:00 +0000</pubDate><atom:updated>2012-10-31T02:27:43.675-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>VS 2012 : Configuração inicial de Projeto ASP.NET</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-zuK2VddzAxQ/UJCotzcAFoI/AAAAAAAAG9M/jTULBoiQRvc/s1600-h/vs20122.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="vs2012" border="0" alt="vs2012" align="right" src="http://lh5.ggpht.com/-fceQF8DTYQw/UJCovPCIjrI/AAAAAAAAG9Q/3W9aDz6oMbY/vs2012_thumb.jpg?imgmax=800" width="244" height="52" /&gt;&lt;/a&gt;Os templates de projeto contidos no Visual Studio 2012 já incluem várias configurações e instalações de packages nuget que, iniciando por um projeto em branco, precisamos reproduzir para iniciarmos o desenvolvimento.&lt;/p&gt;  &lt;p&gt;Veja algumas recomendações do que instalar/configurar em uma Empty ASP.NET Application.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Instalação de Packages Nuget&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft.AspNet.Web.Optimization      &lt;ul&gt;       &lt;li&gt;Permite uso de Bundling e Minification &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Microsoft.AspNet.Web.Optimization.WebForms      &lt;ul&gt;       &lt;li&gt;Permite uso de um web control para acessar os bundlings &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;EntityFramework      &lt;ul&gt;       &lt;li&gt;Instala a versão atual do Entity Framework &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Outros Packages&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Muito provavelmente você precisará também dos packages de JQuery e JQuery UI.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Configuração no Web.Config&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O seguinte trecho deve ser inserido dentro da tag &amp;lt;pages&amp;gt; no web.config :&lt;/p&gt;    &lt;p&gt;&amp;lt;namespaces&amp;gt;      &lt;br /&gt;&amp;lt;add namespace=&amp;quot;System.Web.Optimization&amp;quot; /&amp;gt;       &lt;br /&gt;&amp;lt;/namespaces&amp;gt;       &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Essa configuração habilita a chamada dos bundlings na página utilizando Scripts.Render&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/X3t40VkGaeU/vs-2012-configuracao-inicial-de-projeto.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-fceQF8DTYQw/UJCovPCIjrI/AAAAAAAAG9Q/3W9aDz6oMbY/s72-c/vs2012_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/10/vs-2012-configuracao-inicial-de-projeto.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-3959428981947196897</guid><pubDate>Tue, 30 Oct 2012 14:56:00 +0000</pubDate><atom:updated>2012-10-30T12:56:15.604-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Entity Framework</category><title>Entity Framework : Versões e Instalações</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-Kctrx3qw0KM/UI_qdzdCMkI/AAAAAAAAG80/fBlC-D9KiQU/Nuget-600x300%25255B2%25255D.jpg?imgmax=800"&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="Nuget-600x300" border="0" alt="Nuget-600x300" align="right" src="http://lh5.ggpht.com/-AVmC5D29Hoc/UI_qjFCRMAI/AAAAAAAAG88/YgHZU206QyI/Nuget-600x300_thumb.jpg?imgmax=800" width="244" height="65" /&gt;&lt;/a&gt;Com a quase mas não total independência do Entity Framework em relação ao Framework .NET suas versões e formas de instalação ficaram um pouco confusas. Vamos analisar em mais detalhes.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ObjectContext x DBContext&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A principal diferença entre as versões é o uso de ObjectContext ou de DBContext como objeto de contexto de um modelo EDMX. O DBContext surge para substituir totalmente o ObjectContext, com várias vantagens em sua síntaxe simplificada, mas exigindo cuidado na adoção, pois afinal estamos falando de uma síntaxe diferente.&lt;/p&gt;    &lt;p&gt;E.F. Versão 4.x : Utiliza principalmente ObjectContext     &lt;br /&gt;E.F. Versão 5.0 : Utiliza principalmente DBContext&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Code Generation Item&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O EDMX permite que você adicione um Code Generation Item no modelo. O efeito dessa adição é que você substitui a geração de código padrão do Visual Studio para o EDMX pelo uso de um modelo T4 que irá determinar a forma como o código será gerado.&lt;/p&gt;    &lt;p&gt;Assim sendo, tanto na versão 4.x podemos utilizar um Code Generation Item para gerar o DBContext como na versão 5.0 podemos usar um Code Generation Item para gerar o ObjectContext.&lt;/p&gt;    &lt;p&gt;Assim sendo as versões não prendem o uso a um ou a outro, usar DBContext ou usar ObjectContext continua sendo uma escolha.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Visual Studio 2010 x Visual Studio 2012&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A versão 5.0 do E.F. é distribuida como um pacote Nuget e pode ser instalada em ambos os Visual Studios, tanto o VS 2010 como o VS 2012.&lt;/p&gt;    &lt;p&gt;Porém a diferença entre os 2 visual studios está justamente no designer do EDMX, que faz parte do Visual Studio.&lt;/p&gt;    &lt;p&gt;VS 2010 : O Designer gerar ObjectContext por padrão. São necessários Code Generation Itens contidos na Visual Studio Galery para gerar DBContext&lt;/p&gt;    &lt;p&gt;VS 2012 : O designer gera DBContext por padrão usando um template T4. Existe Code Generation Itens já instalados que podem ser usados para gerar ObjectContext&lt;/p&gt;    &lt;p&gt;Veja alguns Code Generation Itens disponíveis para o VS 2010 :&lt;/p&gt;    &lt;p&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/7812b04c-db36-4817-8a84-e73c452410a2"&gt;DBContext Object Generator EF 4.x&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/da740968-02f9-42a9-9ee4-1a9a06d896a2"&gt;DBContext Object Generator EF 5.0&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/32c4660d-7e66-4c3a-b516-584f4f72b838"&gt;DBContext Object Gerator + DataContract&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Framework 4.0 x Framework 4.5&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Uma parte das funcionalidades do Entity Framework encontra-se acoplada ao Framework .NET. Assim sendo, mesmo instalando o E.F. 5.0 no VS 2010, não teremos as funcionalidades completas do E.F. 5.0, apenas uma parte.&lt;/p&gt;    &lt;p&gt;Desta forma o E.F. 5.0 vai realmente se comportar de forma diferente quando estivermos usando o Framework 4.0 (VS 2010) ou quando estivermos usando o Framework 4.5 (VS 2012).&lt;/p&gt;    &lt;p&gt;Exemplo :&lt;/p&gt;    &lt;p&gt;No VS 2010 não é permitido marcar um atributo alterado com modifed false. A mesma funcionalidade é permitida no VS 2012.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Importante :&lt;/strong&gt; O Framework 4.5 ficou famoso por substituir DLL’s do framework 4.0, realizando uma estranha mesclagem em que aplicações feitas para o framework 4.0 estarão usando parte do 4.5. Porém isso não altera essa diferença de funcionalidades no EF 5.0. O Visual Studio utilizado para desenvolver a aplicação determina essas alterações.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Observação :&lt;/strong&gt; Já que o Visual Studio é um componente opcional no desenvolvimento, vale uma pesquisa mais detalhada sobre essas DLL’s do framework x EF. Por enquanto, porém, consideraremos essas afirmações.&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/D7Hw7viwWrA/entity-framework-versoes-e-instalacoes.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-AVmC5D29Hoc/UI_qjFCRMAI/AAAAAAAAG88/YgHZU206QyI/s72-c/Nuget-600x300_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/10/entity-framework-versoes-e-instalacoes.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-420492031550330433</guid><pubDate>Mon, 29 Oct 2012 04:04:00 +0000</pubDate><atom:updated>2012-10-29T02:04:53.512-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>ModelBinding no WebForms 4.5 com Camada de Negócios</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-9cVMSm1etXQ/UI4AXIRe0mI/AAAAAAAAG8c/6PiGuCs9qTs/s1600-h/aspnet%25255B2%25255D.png"&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="aspnet" border="0" alt="aspnet" align="right" src="http://lh4.ggpht.com/-BTU_p1q27rY/UI4AYusj4dI/AAAAAAAAG8k/bsWMM3_syDs/aspnet_thumb.png?imgmax=800" width="196" height="71" /&gt;&lt;/a&gt;A utilização de ModelBinding com os WebForms é uma das grandes novidades do ASP.NET 4.5, porém todos os exemplos que encontramos na web atualmente mostram o código inserido dentro do code-behind da página. &lt;/p&gt;  &lt;p&gt;Porém inserir lógica de negócios no code-behind da página nunca é uma boa idéia. Normalmente desejamos que a lógica fique em uma camada de negócios, uma classe e eventualmente até projeto separado.&lt;/p&gt;  &lt;p&gt;Para podermos fazer isso basta programarmos um evento nos webcontrols que irão consumir os dados : OnCallingDataMethods&lt;/p&gt;  &lt;p&gt;Veja um exemplo :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FormView1_CallingDataMethods(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, CallingDataMethodsEventArgs e)
        {
            e.DataMethodsObject = &lt;span class="kwrd"&gt;new&lt;/span&gt; libBLL.ClientesBLL();
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Neste exemplo temos uma classe ClientesBLL que possui os métodos para acesso aos dados.&lt;/p&gt;

&lt;p&gt;Existe ainda uma alternativa : Os métodos contidos no objeto poderiam ser do tipo &lt;strong&gt;&lt;em&gt;static&lt;/em&gt;&lt;/strong&gt;. Neste caso o código que devemos aplicar no evento será um pouco diferente :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FormView1_CallingDataMethods(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, CallingDataMethodsEventArgs e)
        {
            e.DataMethodsType = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(libBLL.ClientesBLL);
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;Model Validation&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Criando os métodos de acesso dentro de uma class library não poderemos ter acesso ao ModelState para verificar a validade.&lt;/p&gt;

  &lt;p&gt;Porém podemos utilizar outros métodos para garantir que o model esteja válido. Independente de não usarmos o ModelState na class library, um validator summary consegue exibir as mensagem de erro de ModelState normalmente, só precisamos garantir que a class library não execute tarefas quando o modelo não estiver válido.&lt;/p&gt;

  &lt;p&gt;Veja como checar isso com o entity framework :&lt;/p&gt;

  &lt;pre class="csharpcode"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (ne.GetValidationErrors().Count() != 0)
                &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
  &lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

  &lt;p&gt;Utilizando o método GetValidationErrors podemos identificar que existem erros de validação no modelo e desta forma impedir que a camada de negócios execute as operações, como atualização de dados. A camada de interface se encarregará de mostrar os erros de ModelState através, por exemplo, de um ValidationSummary.&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/F_jMBO8rlc0/modelbinding-no-webforms-45-com-camada.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-BTU_p1q27rY/UI4AYusj4dI/AAAAAAAAG8k/bsWMM3_syDs/s72-c/aspnet_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/10/modelbinding-no-webforms-45-com-camada.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-2886339936526837478</guid><pubDate>Tue, 17 Jul 2012 02:20:00 +0000</pubDate><atom:updated>2012-07-16T23:20:58.150-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>SQL Server Repair falhando</title><description>&lt;p&gt;   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-Malj_hmjjcA/UATMBNYE9FI/AAAAAAAAG7c/jsYbN083p6g/s1600-h/sql_server1%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 17px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="sql_server1" border="0" alt="sql_server1" align="right" src="http://lh3.ggpht.com/-Tg9HporskWw/UATMCHYiz9I/AAAAAAAAG7k/V1_zq-IIQ5g/sql_server1_thumb%25255B2%25255D.jpg?imgmax=800" width="134" height="114" /&gt;&lt;/a&gt;Mais um problema no mínimo curioso&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Problema&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A realização de um repair na instância do SQL Server falha com a seguinte mensagem de erro :&lt;/p&gt;    &lt;p&gt;“Error 1316.A network error occurred while attempting to read from the file      &lt;br /&gt;G:\1033_ENU_LP\x64\setup\SSCERuntime_x86-enu.msi”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Causa&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Parece ser um bug no processo de repair do SQL Server, esse bug está devidamente registrado no connect em &lt;a title="http://connect.microsoft.com/SQLServer/feedback/details/588703/senior-developer" href="http://connect.microsoft.com/SQLServer/feedback/details/588703/senior-developer"&gt;http://connect.microsoft.com/SQLServer/feedback/details/588703/senior-developer&lt;/a&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ocorre que o repair está buscando um arquivo que não existe no DVD, até porque está buscando com o nome errado – busca o arquivo x86 para fazer um repair de ambiente x64.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Solução&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Copie todo o conteúdo do DVD para uma pasta no HD&lt;/p&gt;    &lt;p&gt;Troque o nome do arquivo G:\1033_ENU_LP\x64\setup\SSCERuntime.msi para SSCERuntime_x86-enu.msi&lt;/p&gt;    &lt;p&gt;Rode o rapair a partir da pasta no HD&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/RaIDqyZckz8/sql-server-repair-falhando.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-Tg9HporskWw/UATMCHYiz9I/AAAAAAAAG7k/V1_zq-IIQ5g/s72-c/sql_server1_thumb%25255B2%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/07/sql-server-repair-falhando.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-4805456769179050555</guid><pubDate>Tue, 26 Jun 2012 05:13:00 +0000</pubDate><atom:updated>2012-06-26T02:13:15.396-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>ASP.NET Universal Providers</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-oe9Zh-u-EHc/T-lE2bkChLI/AAAAAAAAG64/vIVTex8Mqmo/s1600-h/aspnet2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="aspnet" border="0" alt="aspnet" align="right" src="http://lh4.ggpht.com/-ljfU0l35MR0/T-lE3NNy_FI/AAAAAAAAG7A/IR2JQS_V9XQ/aspnet_thumb.png?imgmax=800" width="244" height="88" /&gt;&lt;/a&gt;Os recursos básicos do asp.net, tal como membership, rolemanager, session e outros, baseados em providers, estão disponíveis independente do formato de interface (MVC ou WebForms), porém os providers padrões que acompanham o framework são dedicados ao SQL Server.&lt;/p&gt;  &lt;p&gt;Com a popularidade do SQL Azure e SQL Compact, foram criados os Universal Providers. Com um único provider podemos fazer conexão a um SQL Server, ao SQL Server Compact ou ao SQL Azure.&lt;/p&gt;  &lt;p&gt;Espera-se que os Universal Providers sejam incluidos por padrão no Visual Studio 2012, mas isso ainda não está confirmado.&lt;/p&gt;  &lt;p&gt;Veja um comparativo de providers padrões do framework e os universal providers :&lt;/p&gt;  &lt;table border="2" cellspacing="0" cellpadding="2" width="527"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="269"&gt;&lt;strong&gt;Classes de Provider SQL&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="254"&gt;&lt;strong&gt;Classes do Universal Provider&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="269"&gt;&lt;code&gt;System.Web.Security.SqlMembershipProvider&lt;/code&gt;&lt;/td&gt;        &lt;td valign="top" width="254"&gt;&lt;code&gt;System.Web.Providers.DefaultMembershipProvider&lt;/code&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="269"&gt;&lt;code&gt;System.Web.Profile.SqlProfileProvider&lt;/code&gt;&lt;/td&gt;        &lt;td valign="top" width="254"&gt;&lt;code&gt;System.Web.Providers.DefaultProfileProvider&lt;/code&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="269"&gt;&lt;code&gt;System.Web.Security.SqlRoleProvider&lt;/code&gt;&lt;/td&gt;        &lt;td valign="top" width="254"&gt;&lt;code&gt;System.Web.Providers.DefaultRoleProvider&lt;/code&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Instalação com o package manager no VS 2010 :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-Omcu1bU1ZJ0/T-lE4i-RJTI/AAAAAAAAG7I/9s0586Lyz6M/s1600-h/SNAG-00114.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="SNAG-0011" border="0" alt="SNAG-0011" src="http://lh6.ggpht.com/-xR0VxoeCvNI/T-lE6ffz2XI/AAAAAAAAG7Q/Xf9prexd5Sk/SNAG-0011_thumb2.png?imgmax=800" width="545" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/udNFme088nY/aspnet-universal-providers.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-ljfU0l35MR0/T-lE3NNy_FI/AAAAAAAAG7A/IR2JQS_V9XQ/s72-c/aspnet_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/06/aspnet-universal-providers.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-8171958404003229136</guid><pubDate>Tue, 19 Jun 2012 06:04:00 +0000</pubDate><atom:updated>2012-06-19T03:04:03.759-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>Passei nas Provas de SQL Server 2012 !</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Fazer provas beta é sempre um desafio : Quase ninguém fez aquela prova antes, não existem comentários ou detalhes sobre o conteúdo.&lt;/p&gt;  &lt;p&gt;Quando foram disponibilizadas as provas beta de SQL Server 2012, tive basicamente 2 semanas para realiza-las e isso em meio aos preparativos do SQL Saturday no Rio (que foi um grande sucesso!)&lt;/p&gt;  &lt;p&gt;Esperava ganhar experiência com as provas, passar em 2, quando muito 3. Eis então minha grande surpesa quando, nos últimos dias, descobri que passei em todas as 7 provas de SQL Server !!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-NTbMzo1Evfc/T-AWS7jHqcI/AAAAAAAAG6g/i_zUmZqILbs/s1600-h/SNAG-0028%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 17px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAG-0028" border="0" alt="SNAG-0028" src="http://lh3.ggpht.com/-O8gJgq29VCU/T-AWUSH59CI/AAAAAAAAG6o/j3Z2IROL-P0/SNAG-0028_thumb%25255B1%25255D.png?imgmax=800" width="384" height="328" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Com isso me torno MCSA e MCSE, tanto em Data Platform como Bussiness Inteligence.&lt;/p&gt;  &lt;p&gt;Escrevi um pouco sobre as &lt;a href="http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=8411263970850500102" target="_blank"&gt;novas certificações em SQL Server 2012&lt;/a&gt;&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/KdGQlpNVRVI/passei-nas-provas-de-sql-server-2012.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-O8gJgq29VCU/T-AWUSH59CI/AAAAAAAAG6o/j3Z2IROL-P0/s72-c/SNAG-0028_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/06/passei-nas-provas-de-sql-server-2012.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-8411263970850500102</guid><pubDate>Tue, 19 Jun 2012 05:36:00 +0000</pubDate><atom:updated>2012-06-19T02:36:53.843-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>Novas Certificações de SQL Server</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;O SQL Server 2012, lançado em março deste ano, trouxe com ele novas provas de certificações. Muito mudou nas certificações de SQL Server. Veja as principais mudanças :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ao todo, são 7 provas de certificação&lt;/li&gt;    &lt;li&gt;As provas se dividem em 2 áreas : Data Plataform e Bussiness Intelligence&lt;/li&gt;    &lt;li&gt;As certificações possuem 2 níveis : &lt;strong&gt;MCSA&lt;/strong&gt; e &lt;strong&gt;MCSE&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Ao contrário do antigo System Enginneer, MCSE significa Microsoft Certified Solution Expert&lt;/li&gt;    &lt;li&gt;MCSA, por sua vez, significa Solution Associate&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Provas para obter o MCSA&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;461 – &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-461" target="_blank"&gt;Queryng Microsoft SQL Server 2012&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;462 – &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-462" target="_blank"&gt;Administering Microsoft SQL Server 2012&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;462 – &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-463" target="_blank"&gt;Implementing Data Warehouse com Microsoft SQL Server 2012&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Provas para obter o MCSE&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="199"&gt;&lt;strong&gt;Data Plataform&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="199"&gt;&lt;strong&gt;Bussiness Intelligence&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="199"&gt;Possuir o MCSA&lt;/td&gt;          &lt;td valign="top" width="199"&gt;Possuir o MCSA&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="199"&gt;464 – &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-464" target="_blank"&gt;Developing Microsoft SQL Server Databases&lt;/a&gt;&lt;/td&gt;          &lt;td valign="top" width="199"&gt;466 – &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-466" target="_blank"&gt;Implementing Data Models and Reports with Microsoft SQL Server 2012&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="199"&gt;465 – &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-465" target="_blank"&gt;Design Database Solutions for Microsoft SQL Server 2012&lt;/a&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;467 – &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-467" target="_blank"&gt;Design Bussiness Intelligence Solutions With Microsoft SQL Server 2012&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Destaques e pontos polêmicos&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MCSA e MCSE são siglas que estão sendo re-utilizadas e irão confundir departamentos de RH em todo o mundo&lt;/li&gt;    &lt;li&gt;A certificação mais básica (MCSA) foca em administração e já possui uma prova de data warehouse&lt;/li&gt;    &lt;li&gt;A certificação é mais voltada para generalistas do que para especialistas&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.bufaloinfo.com.br/cursos/cursosbanco.aspx" target="_blank"&gt;Conheça os treinamentos de SQL Server 2012 da Búfalo Informática&lt;/a&gt;&lt;/p&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/bTFnT_uM2lM/novas-certificacoes-de-sql-server.html</link><author>noreply@blogger.com (Dennes)</author><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/06/novas-certificacoes-de-sql-server.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-2083127879688313149</guid><pubDate>Mon, 18 Jun 2012 07:36:00 +0000</pubDate><atom:updated>2012-06-18T04:36:27.797-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JQuery</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>JQuery e a GridView</title><description>&lt;p&gt;Implementar pequenos exemplos com seletores jQuery pode parecer simples, mas implementa-los em aplicações web reais junto a tecnologias de servidor pode envolver muitos truques.&lt;/p&gt;  &lt;p&gt;Vamos então nesse pequeno post fazer um passo-a-passo que demonstre os problemas pelos quais esbarrará ao fazer uma aplicação de um efeito simples em linhas de uma GridView.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Problema&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Implementar um efeito de mouseover sobre as linhas do corpo de uma GridView.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;A Página&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A página que usuaremos para demonstração do problema terá duas GridViews, cada uma com cabeçalho, paginador e rodapé&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;A Solução Trivial&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A solução trivial para o problema seria implementar o seguinte código :&lt;/p&gt;    &lt;p&gt;$(document).ready( function () { $(“tr”).hover(function () { $(this).addclass(“overclass”) },&lt;/p&gt;    &lt;p&gt;function () { $(this).removeclass(“overclass”) })&lt;/p&gt;    &lt;p&gt;})&lt;/p&gt;    &lt;p&gt;Porém o resultado trará vários problemas :&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Ambas as gridviews serão afetadas &lt;/li&gt;      &lt;li&gt;Linhas de rodapé e cabeçalho serão afetadas &lt;/li&gt;      &lt;li&gt;Se houvesse outras tabelas meramente para layout, seriam afetadas &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Afetando apenas uma GridView&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Existem duas alternativas para selecionar apenas uma gridview :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Selecionar pelo ID da GridView &lt;/li&gt;    &lt;li&gt;Selecionar por uma classe aplicada apenas naquela GridView &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Selecionar pelo ID da GridView&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O ID da GridView é preenchido no servidor, porém no client ele pode mudar devido as formas de nomenclatura de objetos no client.&lt;/p&gt;    &lt;p&gt;As alternativas são as seguintes :&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;No .NET 4.0 em diante, alterar o clientIDMode da gridview para static para que o clientID fique fixo. &lt;/li&gt;      &lt;li&gt;Passar o ClientID do servidor para o client, para o código jQuery. Você pode ler sobre como isso é feito em …. &lt;/li&gt;      &lt;li&gt;Filtrar por parte do ID, já que o ClientID é formato pelo ID do servidor e mais alguns trechos montados pelo ASP.NET. O seletor ficaria &lt;em&gt;$(“table[id*=’iddoservidor’]”)&lt;/em&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Selecionar por uma Classe&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A GridView possui a propriedade CSSClass. Basta preencher com um nome de classe. De fato, a classe não precisa nem ao menos existir, ela funcionará como um “marcador” que permitirá ao jQuery selecionar a tabela.&lt;/p&gt;    &lt;p&gt;Assim o selector fica &lt;em&gt;$(“table.classe”)&lt;/em&gt; ou até mesmo &lt;em&gt;$(“.classe”)&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Resolvendo o primeiro problema&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Opção 1 : $(“table.classe tr”)&lt;/p&gt;    &lt;p&gt;Opção 2 : $(“table[id*=’iddoservidor’] tr”)&lt;/p&gt;    &lt;p&gt;Essas são as opções mais simples.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Cabeçalho e Rodapé ainda serão afetados&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Ambos são linhas dentro da tabela, serão naturalmente afetados. Uma solução trivial seria a seguinte :&lt;/p&gt;    &lt;p&gt;&lt;em&gt;$(“table.classe tr:not(tr:first,tr:last)”)&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;ou &lt;/p&gt;    &lt;p&gt;&lt;em&gt;$(“table[id*=’iddoservidor’] tr:not(tr:first,tr:last)”)&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;Porém essa não é uma solução versátil : Uma gridview pode ter além do rodapé um paginador inferior, assim como também pode possuir um paginador superior. Duas linhas em cada extremidade da grid que não deveriam ser afetadas.&lt;/p&gt;    &lt;p&gt;Para resolver esse problema podemos utilizar tags que indiquem a função das linhas na gridView : thead, tbody e tfoot. É necessário uma pequena configuração da gridview para que ela gere essas tags, vejam detalhes no artigo em &lt;a title="http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=722178718388262359" href="http://www.bufaloinfo.com.br/ExibeNoticias.aspx?entryid=722178718388262359"&gt;TFOOT, THEAD e TBODY com a GridView&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Com a gridview gerando essas tags, naturalmente mudamos o seletor do jquery para :&lt;/p&gt;    &lt;p&gt;&lt;em&gt;$(“table[id*=’iddoservidor’] tbody tr”)&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;Porém não teremos o efeito desejado : O paginador ainda será afetado.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Solucionando o problema do paginador&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Ocorre que o paginador da gridview é formado por uma 2a tabela que é criada dentro da linha do paginador. Mesmo não existindo uma tag TBODY explicita, o browser considera a presença de um tbody implicita e seleciona o TR da 2a tabela.&lt;/p&gt;    &lt;p&gt;A questão é que ao utilizar “table[id*=’iddoservidor’] tbody tr” no seletor estamos pedindo TR’s que estejam dentro de um TBODY que esteja dentro da nossa grid. O TBODY do paginador está dentro da nossa grid, com isso ele também é afetado.&lt;/p&gt;    &lt;p&gt;Solução : Indicar que desejamos apenas o TBODY que está no nível imediatamente abaixo da nossa tabela.&lt;/p&gt;    &lt;p&gt;O seletor fica : &lt;em&gt;“table[id*=’iddoservidor’] &amp;gt; tbody tr”&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;Como o TBODY do paginador não está imediatamente abaixo da nossa tabela – está em uma 2a tabela dentro de uma linha do rodapé da nossa tabela – ele deixa de ser afetado por esse novo seletor que finalmente atinge o objetivo.&lt;/p&gt;    &lt;p&gt;A seleção por classe também pode ser utilizada :&amp;#160; &lt;em&gt;“table.classe &amp;gt; tbody tr”&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/rdFXysmVi-k/jquery-e-gridview.html</link><author>noreply@blogger.com (Dennes)</author><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/06/jquery-e-gridview.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-4954335512792444313</guid><pubDate>Sat, 19 May 2012 17:45:00 +0000</pubDate><atom:updated>2012-05-19T14:45:21.914-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><title>SQL Server, APPCompat e sqlenginedbstartconfigaction_install_configrc_Cpu64</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-BtqXmsY9FCA/T7fcLCJge1I/AAAAAAAAG2U/HAs8bCeOUSs/s1600-h/sqlserver_sql_server_2008_logo%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 17px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="sqlserver_sql_server_2008_logo" border="0" alt="sqlserver_sql_server_2008_logo" align="right" src="http://lh5.ggpht.com/-14h7RVDia9k/T7fcMGbppBI/AAAAAAAAG2c/v3iGuaZtr9s/sqlserver_sql_server_2008_logo_thumb%25255B1%25255D.png?imgmax=800" width="190" height="160" /&gt;&lt;/a&gt;Eis a solução de um problema no mínimo estranho.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ambiente&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SQL Server instalado no Windows 7&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Sintomas&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Não é possível conectar ao SQL Server. A conexão pelo SSMS simplesmente não responde, sem nenhuma mensagem de erro, permanece tentando conectar, sem gerar resposta.&lt;/p&gt;    &lt;p&gt;Nenhuma mensagem significativa no event viewer.&lt;/p&gt;    &lt;p&gt;Tentantivas de instalar ou desinstalar o SQL Server travam o processo de instalação no momento em que o setup processa o sqlenginedbstartconfigaction_install_configrc_Cpu64&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Causa&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O SQL Server possui problemas de compatibilidade com o Windows 7, é necessária uma chave de registry específica para que a conexão seja possível, do contrário esse erro ocorrerá.&lt;/p&gt;    &lt;p&gt;Não está muito claro o que pode fazer com que a chave em questão fique com valor errado.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Solução&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Utilizando o regEdit, abra o seguinte caminho no registry :&lt;/p&gt;    &lt;p&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat&lt;/p&gt;    &lt;p&gt;Defina o valor SbEnable para 1&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/fGFgwVx7bK8/sql-server-appcompat-e.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-14h7RVDia9k/T7fcMGbppBI/AAAAAAAAG2c/v3iGuaZtr9s/s72-c/sqlserver_sql_server_2008_logo_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/05/sql-server-appcompat-e.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-34573201.post-8037742683670938276</guid><pubDate>Tue, 15 May 2012 00:34:00 +0000</pubDate><atom:updated>2012-05-14T21:45:02.372-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WPF</category><category domain="http://www.blogger.com/atom/ns#">Windows 8</category><title>Windows 8–Primeiras Impressões</title><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-UO2xjB2t65A/T7Gkix5EmrI/AAAAAAAAG0Y/o5b2gReTrT4/s1600-h/Windows-8-logo-14.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 17px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Windows-8-logo-1" border="0" alt="Windows-8-logo-1" align="right" src="http://lh5.ggpht.com/-ZVCnvRTD2Jk/T7GkkFxjzgI/AAAAAAAAG0g/c7QjXurhAuQ/Windows-8-logo-1_thumb1.jpg?imgmax=800" width="189" height="169" /&gt;&lt;/a&gt;Nesta última semana tive a oportunidade de participar de um treinamento de um dia para desenvolvedores sobre o Metro Style no Windows 8 e gostaria de compartilhar aqui as primeiras impressões.&lt;/p&gt;  &lt;p&gt;Importante notar que foi apenas um dia e voltado a desenvolvimento, então algumas informações podem ter ficado mal entendidas/interpretadas. Corrigirei conforme novidades surgirem.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A Interface&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A interface do Windows 8 é tão diferente que no primeiro impacto você se perde, não sabe como encontrar as coisas : Até mesmo abrir o notepad fica complicado.&lt;/p&gt;    &lt;p&gt;O Windows levou muitos anos para criar uma interface consistente na qual todos conseguem se encontrar. Essa mudança irá gerar um impacto radical e impactará na adoção dele nas empresas.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Desenvolvimento&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O desenvolvimento no sistema pode ser feito em duas vertentes : HTML5/Javascript ou XAML/C#. Outra mudança radical, já que o XAML, apesar de presente no mercado desde 2006, ainda não conquistou o espaço que merece.&lt;/p&gt;    &lt;p&gt;Forçar o desenvolvimento nesse formato em uma nova versão do windows vai ser muito impactante, por isso mesmo os treinamentos para desenvolvedores tem sido realizados o quanto antes.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Modelo de Execução de Aplicações&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;O modelo de execução de aplicações está sendo levado do Windows Phone para o Windows 8, ou seja, do mobile para o desktop. É um modelo rígido ao qual os desenvolvedores desktop não estão totalmente adaptados.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Aplicações em Background&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Eventualmente faço uma aplicação para processar alguma coisa, deixo rodando enquanto digito algum documento do word ou acesso a internet. No Windows 8 isso seria um perigo : O Windows 8 pode derrubar uma aplicação em background sem nenhum aviso.&lt;/p&gt;    &lt;p&gt;Tarefas para rodarem em background precisam ser criadas especialmente na forma de uma background task, do contrário serão desativas/derrubadas pelo SO.&lt;/p&gt;    &lt;p&gt;Isso é compreensível para um tablet ou celular, porém para uma máquina desktop significa um impacto absurdamente alto na compatibilidade com aplicações. Ainda busco mais confirmações sobre essa característica.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Instalação de Aplicações&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A instalação de aplicações será feita através da Windows APP Store e apenas através da Windows APP Store. &lt;/p&gt;    &lt;p&gt;No caso de distribuição de aplicações dentro da empresa, haverão recursos para criar uma private store onde a empresa poderá centralizar suas aplicações para distribuição sem depender de um meio externo.&lt;/p&gt;    &lt;p&gt;Então significa que simplesmente copiar a aplicação para a máquina não permitirá que a aplicação rode ? Fim da pirataria ?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Conclusões&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Essas foram as informações passadas durante o treinamento, porém são tão radicais que ainda estou cético sobre se isso valerá para as máquinas desktop (apesar de terem afirmado que sim). &lt;/p&gt;    &lt;p&gt;Se estiver tudo correto, quantos anos levará para o Windows 8 conquistar um pequeno espaço de mercado nas empresas ? 3 anos ? 5 anos ?&lt;/p&gt;    &lt;p&gt;A Microsoft parece estar apostando no fim das máquinas desktop, mas essa é uma mudança que poderá levar meia década para ocorrer e se a tecnologia for demasiadamente apressada pode resultar em uma perda de espaço do próprio Windows no mercado.&lt;/p&gt;    &lt;p&gt;Afinal, não é a toa que o Windows XP ainda é o sistema mais usado do mercado e a MS parece ter dificuldade em mudar isso.&lt;/p&gt;&lt;/blockquote&gt;  </description><link>http://feedproxy.google.com/~r/CidadaoCarioca/~3/06wEDdCtkWg/windows-8primeiras-impressoes.html</link><author>noreply@blogger.com (Dennes)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-ZVCnvRTD2Jk/T7GkkFxjzgI/AAAAAAAAG0g/c7QjXurhAuQ/s72-c/Windows-8-logo-1_thumb1.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://cidadaocarioca.blogspot.com/2012/05/windows-8primeiras-impressoes.html</feedburner:origLink></item></channel></rss>
