<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>:: Carlos Alessandro Ribeiro ::</title>
	<atom:link href="http://blog.carlosalessandroribeiro.com.br/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.carlosalessandroribeiro.com.br</link>
	<description>Tudo é possível... Devemos apenas descobrir como fazer...</description>
	<lastBuildDate>Mon, 26 Sep 2011 00:27:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>[iOS] &#8211; Adicionar dias a uma data &#8211; NSDate</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2011/09/25/ios-adicionar-dias-a-uma-data-nsdate/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2011/09/25/ios-adicionar-dias-a-uma-data-nsdate/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 00:27:42 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[NSCalendar]]></category>
		<category><![CDATA[NSDate]]></category>
		<category><![CDATA[NSDateComponents]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=583</guid>
		<description><![CDATA[Esses dias precisei pegar um número de dias informado pelo sistema e incluir esses dias em uma data (NSDate) já existente. Utilizando o NSTimeInterval, por algum motivo estranho, em algumas situações ele gerava a data errada, dai comecei a pesquisar (sempre no Google) e encontrei uma outra forma de fazer isso, é utilizando NSDateComponents, exemplo: [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias precisei pegar um número de dias informado pelo sistema e incluir esses dias em uma data (NSDate) já existente. Utilizando o NSTimeInterval, por algum motivo estranho, em algumas situações ele gerava a data errada, dai comecei a pesquisar (sempre no Google) e encontrei uma outra forma de fazer isso, é utilizando NSDateComponents, exemplo:</p>
<pre class="brush:csharp">
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = days;

NSDate *date = [gregorian dateByAddingComponents:components toDate:dateBase options:0];
[components release];
</pre>
<p>Espero que ajude quem precisar disso, demorei muito para encontrar isso&#8230;<br />
No C# (.NET) é muito mais fácil fazer essas coisas&#8230; :p</p>
<p>[]s</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2011/09/25/ios-adicionar-dias-a-uma-data-nsdate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS] &#8211; PagBoleto 1.0 aprovado pela Apple</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2011/02/10/ios-pagboleto-1-0-aprovado-pela-apple/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2011/02/10/ios-pagboleto-1-0-aprovado-pela-apple/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 14:41:36 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Barcode]]></category>
		<category><![CDATA[Boleto]]></category>
		<category><![CDATA[Código de Barras]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[PagBoleto]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=580</guid>
		<description><![CDATA[A Apple aprovou essa semana o nosso aplicativo para iPhone (3GS e 4) para leitura de código de barras, chamado PagBoleto. Baixe agora mesmo pelo seu iPhone ou pelo iTunes.]]></description>
			<content:encoded><![CDATA[<p>A Apple aprovou essa semana o nosso aplicativo para iPhone (3GS e 4) para leitura de código de barras, chamado <a href="http://www.pagboleto.com.br/" target="_blank">PagBoleto</a>.</p>
<p>Baixe agora mesmo pelo seu iPhone ou pelo <a href="http://itunes.apple.com/us/app/pagboleto/id416812044?mt=8&amp;amp;ls=1" target="_blank">iTunes</a>.</p>
<p><br class="spacer_" /></p>
<p style="text-align: center;"><a href="http://itunes.apple.com/us/app/pagboleto/id416812044?mt=8&amp;ls=1" target="_blank"><img class="size-full wp-image-133 aligncenter" title="App Store" src="http://www.pagboleto.com.br/wp-content/uploads/2011/01/appstore.png" alt="" width="122" height="40" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2011/02/10/ios-pagboleto-1-0-aprovado-pela-apple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS] &#8211; Várias dicas sobre desenvolvimento iOS</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/29/ios-varias-dicas-sobre-desenvolvimento-ios/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/29/ios-varias-dicas-sobre-desenvolvimento-ios/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 02:44:53 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=576</guid>
		<description><![CDATA[Achei um link bem interessante sobre dicas de classes a serem usadas no desenvolvimento para aplicações iOS. http://zaldzbugz.wordpress.com/2010/07/14/objective-c-notes/ Até a próxima.. []s]]></description>
			<content:encoded><![CDATA[<p>Achei um link bem interessante sobre dicas de classes a serem usadas no desenvolvimento para aplicações iOS.</p>
<p><a href="http://zaldzbugz.wordpress.com/2010/07/14/objective-c-notes/">http://zaldzbugz.wordpress.com/2010/07/14/objective-c-notes/</a></p>
<p>Até a próxima..<br />
[]s</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/29/ios-varias-dicas-sobre-desenvolvimento-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Dica] &#8211; IndexOutOfRangeException na classe CurrencyManager</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/20/dica-indexoutofrangeexception-na-classe-currencymanager/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/20/dica-indexoutofrangeexception-na-classe-currencymanager/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 17:28:46 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Windows Application]]></category>
		<category><![CDATA[BindingSource]]></category>
		<category><![CDATA[CurrencyManager]]></category>
		<category><![CDATA[IndexOutOfRangeException]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=571</guid>
		<description><![CDATA[Peguei um problema essa semana um pouco estranha. Criei um Windows Forms e nele adicionei um DataGridView e para fazer o DataSource do mesmo usei um List&#60;MinhaClasse&#62;. Até ai perfeito, o DataGridView populava os dados na tela e conseguia manipulá-los normalmente, porém, quando alguma célula ou linha era mudada de foco, era apresentado uma exception: [...]]]></description>
			<content:encoded><![CDATA[<p>Peguei um problema essa semana um pouco estranha. Criei um Windows Forms e nele adicionei um DataGridView e para fazer o DataSource do mesmo usei um List&lt;MinhaClasse&gt;. Até ai perfeito, o DataGridView populava os dados na tela e conseguia manipulá-los normalmente, porém, quando alguma célula ou linha era mudada de foco, era apresentado uma exception:</p>
<blockquote><p>System.IndexOutOfRangeException was unhandled. Index -1 does not have a value.</p></blockquote>
<p>Para resolver esse problema, após algumas consultas no Google, foi indicado a trocar o DataSource do DataGridView, ao invés de usar o List&lt;MinhaClasse&gt; usar o <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx" target="_blank">BindingSource</a>.</p>
<p>Primeiro você arrasta o componente para o seu Windows Forms (Toolbox &gt; Data &gt; BindingSource) e o código ficou assim:</p>
<pre class="brush:csharp">
meuDataSource.DataSource = minhaListaGenerica;
meuDataGridView.DataSource = meuDataSource;
meuDataSource.ResetBindings(true);
</pre>
<p>Não aconteceu mais a exception.</p>
<p>Espero que possa ajudar&#8230;</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/20/dica-indexoutofrangeexception-na-classe-currencymanager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Dica] &#8211; Simular digitação do teclado ou clique do mouse</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/12/dica-simular-digitacao-do-teclado-ou-clique-do-mouse/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/12/dica-simular-digitacao-do-teclado-ou-clique-do-mouse/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 18:06:19 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows Application]]></category>
		<category><![CDATA[Input Simulator]]></category>
		<category><![CDATA[Simulação teclado]]></category>
		<category><![CDATA[Windows Input]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=569</guid>
		<description><![CDATA[Estava procurando na internet (google para variar) alguma forma de simular a digitação do teclado e encontrei no Codeplex esse projeto: http://inputsimulator.codeplex.com/ Bem interessante e vale a pena conferir. Até a próxima&#8230;]]></description>
			<content:encoded><![CDATA[<p>Estava procurando na internet (google para variar) alguma forma de simular a digitação do teclado e encontrei no Codeplex esse projeto: <a href="http://inputsimulator.codeplex.com/" target="_blank">http://inputsimulator.codeplex.com/</a></p>
<p>Bem interessante e vale a pena conferir.</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2011/01/12/dica-simular-digitacao-do-teclado-ou-clique-do-mouse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Dica] &#8211; Arquivos bloqueados no Mac OS</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/12/28/dica-arquivos-bloqueados-no-mac-os/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/12/28/dica-arquivos-bloqueados-no-mac-os/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 14:26:52 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[bloqueado]]></category>
		<category><![CDATA[Locked]]></category>
		<category><![CDATA[Mac OS]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=564</guid>
		<description><![CDATA[Recentemente adquiri um iMac para poder desenvolver melhor para iOS. E após algumas semanas brincando com o novo brinquedo e com o mundo totalmente diferente do Windows que estou acostumado, me deparei com um problema: Arquivos ou pastas bloqueadas. Isso não sei como aconteceu (ainda), mas o Mac OS não te permite deletar os arquivos [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente adquiri um iMac para poder desenvolver melhor para iOS. E após algumas semanas brincando com o novo brinquedo e com o mundo totalmente diferente do Windows que estou acostumado, me deparei com um problema: Arquivos ou pastas bloqueadas.</p>
<p>Isso não sei como aconteceu (ainda), mas o Mac OS não te permite deletar os arquivos enquanto eles estiverem bloqueados. Bom, como sempre, fui no google e comecei a procurar, fiquei umas 2 horas procurando que nem um louco e nada. 99% das coisas que achei eram scripts para serem executados via Terminal (igual o MS-DOS do Windows). Após algumas horas, encontrei um que finalmente me resolveu: <code>chflags -R nouchg *</code></p>
<p>Esse comando deve ser executado via Terminal após você acessar a pasta desejada que possui os arquivos bloqueados.</p>
<p>Comigo funcionou. :-p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/12/28/dica-arquivos-bloqueados-no-mac-os/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS] &#8211; Tela de inicio do aplicativo &#8211; Splash Screen</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/10/02/ios-tela-de-inicio-do-aplicativo-splash-screen/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/10/02/ios-tela-de-inicio-do-aplicativo-splash-screen/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 22:57:58 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=561</guid>
		<description><![CDATA[Ao criar um aplicativo para iOS (antigo iPhone OS), gostamos de colocar pelo menos uma imagem ou alguma coisa para que o usuário que tocar no ícone do seu aplicativo e informá-lo que já está iniciando. Para isso a Apple deixou como padrão, ao iniciar todos os aplicativos, ela tenta identificar um arquivo chamado Default.png. [...]]]></description>
			<content:encoded><![CDATA[<p>Ao criar um aplicativo para iOS (antigo iPhone OS), gostamos de colocar pelo menos uma imagem ou alguma coisa para que o usuário que tocar no ícone do seu aplicativo e informá-lo que já está iniciando.</p>
<p>Para isso a Apple deixou como padrão, ao iniciar todos os aplicativos, ela tenta identificar um arquivo chamado Default.png. Se você adicionar qualquer imagem com o nome Default.png dentro da pasta Resources do seu aplicativo e ao dar &#8216;Build and Run&#8217; no xCode, você já irá ver funcionando esse &#8220;truque&#8221;.</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/10/02/ios-tela-de-inicio-do-aplicativo-splash-screen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Carregar um arquivo JS dinamicamente com jQuery</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/10/01/dica-carregar-um-arquivo-js-dinamicamente-com-jquery/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/10/01/dica-carregar-um-arquivo-js-dinamicamente-com-jquery/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 02:15:26 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[getScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=559</guid>
		<description><![CDATA[Hoje precisei carregar dinamicamente um arquivo JS e usar as funções disponíveis nele. Imaginei que nas bibliotecas do jQuery tivessem algo, fui direto para o site de documentação dele. Lá encontrei uma função chamada getScript, veja um exemplo abaixo: $.getScript('scripts/funcoes.js'); Após fazer isso, o arquivo JS é carregado para que você possa usar as funções [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje precisei carregar dinamicamente um arquivo JS e usar as funções disponíveis nele. Imaginei que nas bibliotecas do jQuery tivessem algo, fui direto para o site de <a href="http://docs.jquery.com/" target="_blank">documentação </a>dele.</p>
<p>Lá encontrei uma função chamada <a href="http://api.jquery.com/jQuery.getScript/" target="_blank">getScript</a>, veja um exemplo abaixo:</p>
<pre class="brush:javascript">$.getScript('scripts/funcoes.js');</pre>
<p>Após fazer isso, o arquivo JS é carregado para que você possa usar as funções disponíveis nele.<br />
Muito bom isso para quando for necessário efetuar algum tipo de validação dinâmica sem a necessidade de ir no servidor para processar isso.</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/10/01/dica-carregar-um-arquivo-js-dinamicamente-com-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Dica]: Substituir todas as referências via Javascrip &#8211; Replace</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/27/dica-substituir-todas-as-referencias-via-javascrip-replace/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/27/dica-substituir-todas-as-referencias-via-javascrip-replace/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 22:10:04 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[Regular Expression]]></category>
		<category><![CDATA[Replace]]></category>
		<category><![CDATA[Replace all]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=557</guid>
		<description><![CDATA[Para fazer um replace simples no javascript: var str = 'Ola NOME. Voce deseja abrir essa janela NOME?'; str = str.replace("NOME", "Carlos"); alert(str); O motor do javascript não entende que ele deve trocar todas as referências de NOME por Carlos e efetua a troca apenas do primeiro NOME. Para efetuar o replace de todas as [...]]]></description>
			<content:encoded><![CDATA[<p>Para fazer um replace simples no javascript:</p>
<pre class="brush:csharp">var str = 'Ola NOME. Voce deseja abrir essa janela NOME?';
str = str.replace("NOME", "Carlos");

alert(str);
</pre>
<p>O motor do javascript não entende que ele deve trocar todas as referências de NOME por Carlos e efetua a troca apenas do primeiro NOME.</p>
<p>Para efetuar o replace de todas as referências, basta usar Regular Expression que o método replace do javascript aceita nativamente:</p>
<pre class="brush:csharp">var str = 'Ola NOME. Voce deseja abrir essa janela NOME?';
str = str.replace(/NOME/g, "Carlos");

alert(str);
</pre>
<p>Espero que possa ajudar&#8230; pois isso me ajuda muito. :-p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/27/dica-substituir-todas-as-referencias-via-javascrip-replace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iPhone] &#8211; Assinatura iPhone Developer</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/18/iphone-assinatura-iphone-developer/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/18/iphone-assinatura-iphone-developer/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 01:05:26 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone Dev Center]]></category>
		<category><![CDATA[iPhone Developer]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=548</guid>
		<description><![CDATA[Hoje fui fazer minha inscrição na assinatura paga de $ 99,00 doletas no programa para desenvolvimento de aplicativos iPhone e claro poder submeter aplicativos para App Store e poder também testar no meu iPhone. O processo de cadastro é rápido e na última tela (confirmação do pagamento) a surpresa: o Brasil não tem iTunes Store [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje fui fazer minha inscrição na <a href="http://developer.apple.com/" target="_blank">assinatura </a>paga de $ 99,00 doletas no programa para desenvolvimento de aplicativos <strong>iPhone </strong>e claro poder submeter aplicativos para <strong>App Store</strong> e poder também testar no meu iPhone. O processo de cadastro é rápido e na última tela (confirmação do pagamento) a surpresa: o Brasil não tem iTunes Store e por isso não é possível fazer o todo o cadastro online e efetuando o pagamento por cartão de crédito.</p>
<p>Mas fica a dúvida. Como é feita a inscrição então?<br />
Não sei o porque, mas a Apple, para minha decepção, força para países que não possuem o tal iTunes Store a enviar um <strong>FAX</strong>, isso mesmo um <strong>FAX </strong>com os seus dados: Nome completo, endereço de cobrança e número do cartão. E o mesmo formulário já vem com o número do telefone para envio do FAX lá nos EUA sede da queria Apple.</p>
<p>Sinceramente fiquei bem decepcionado com essa atitude e principalmente pelo que andei lendo que o processo de aprovação de cadastros por FAX podem durar em média 3 (TRÊS) meses. Ou seja, você (diga-se eu) que gastou dinheiro em curso, perdeu tempo se esforçando para poder brincar com aplicativos no iPhone e possívelmente mais pra frente oferecer na App Store vai ter que sofrer mais ainda.</p>
<p>Espero que essa minha decepção acabe logo para que eu não &#8220;perca&#8221; o dinheiro e tempo investido para essa plataforma que, na minha opinião é muito boa e abre várias opções. Só espero que a Apple que o slogan diz &#8220;Queremos fazer nossos clientes felizes&#8221; não caia mais em contradição pois não fiquei nada feliz com esse tipo de &#8220;burocracia&#8221;.</p>
<p>Até o próximo post&#8230; <img src='http://blog.carlosalessandroribeiro.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>[ATULIZADO]:</strong> Enviei o FAX ontem a noite (22/07/2010) e a Apple hoje aproximadamente as 13:00 já havia me confirmado como desenvolvedor. Então o papo dos 3 meses de espera não é fato.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/18/iphone-assinatura-iphone-developer/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>[iPhone] &#8211; Desenvolvendo aplicativos para iPhone &#8211; Parte I</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/18/iphone-desenvolvendo-aplicativos-para-iphone-parte-i/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/18/iphone-desenvolvendo-aplicativos-para-iphone-parte-i/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 05:36:17 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone OS]]></category>
		<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=541</guid>
		<description><![CDATA[Semana passada fiz um curso para desenvolvimento de aplicativos para iPhone (iOS) e o curso foi muito além das minhas expectativas. Eu havia comprado um livro para desenvolvimento de aplicativos para iPhone, porém, quando comecei a ver a sintaxe de desenvolvimento da linguagem Objective-C (linguagem nativa para desenvolvimento para Mac), confesso que fiquei um pouco [...]]]></description>
			<content:encoded><![CDATA[<p>Semana passada fiz um curso para desenvolvimento de aplicativos para iPhone (iOS) e o curso foi muito além das minhas expectativas. Eu havia comprado um livro para desenvolvimento de aplicativos para iPhone, porém, quando comecei a ver a sintaxe de desenvolvimento da linguagem Objective-C (linguagem nativa para desenvolvimento para Mac), confesso que fiquei um pouco assustado com a tamanha diferença do que estamos acostumados no dia-a-dia com o .NET e até mesmo Java, C, C++. Mesmo o VB.NET sendo tão diferente em sintaxe do C#, a linguagem segue os mesmos &#8220;conceitos&#8221;, no entanto, Objective-C segue uma linha diferente, mas depois de alguns exemplos e praticando claro, acabei pegando o jeito da coisa.</p>
<p>Segue um exemplo de como exibir um Alert na tela do iPhone:</p>
<pre class="brush:csharp">[[[[UIAlertView alloc] initWithTitle:@"Atenção"
  message:@"Esse é um alerta de exemplo..." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease] show];
</pre>
<p>Vamos ver se consigo explicar.<br />
Para começar, a primeira perguta que se vem a cabeça é: Pra que tantos &#8216;[&#8216; (colchetes)?<br />
O colchetes em Objective-C serve igual ao o &#8216;.&#8217; (ponto) no C#, Java, VB.NET, etc. Veja como seria essa mesma chamada em C#:</p>
<pre class="brush:csharp">new UIAlertView().InitWithTitle("Atenção", "Esse é um alerta de exemplo...", null, "OK", null).Show();
</pre>
<p>E outro detalhe, todo o desenvolvimento das aplicações é baseada em MVC. No próximo post tentarei dar mais detalhes sobre como criar a primeira aplicação em iPhone OS, o famoso &#8220;Hello World&#8221;.</p>
<p>E para ficar a dica, o curso foi realizado na escola <a href="http://iai.art.br/" target="_blank">iAi &#8211; Instituto de Artes Interativas</a>.</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/07/18/iphone-desenvolvendo-aplicativos-para-iphone-parte-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Problema com serialização IList e WCF</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/06/12/dica-problema-com-serializacao-ilist-e-wcf/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/06/12/dica-problema-com-serializacao-ilist-e-wcf/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 17:17:15 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Collection was of a fixed size]]></category>
		<category><![CDATA[ExecutionEngineException]]></category>
		<category><![CDATA[OnDeserializedAttribute]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=524</guid>
		<description><![CDATA[Quando você estiver trabalhando com WCF e em seus dados de contrato (Classes DataContract) precisar retornar uma lista de objetos e usar o IList&#60;T&#62;, você pode se deparar com a seguite exception: ExecutionEngineException. Esse erro é causado pois existe um bug no .NET Framework para tratar IList&#60;T&#62; entre as camadas e por algum motivo o [...]]]></description>
			<content:encoded><![CDATA[<p>Quando você estiver trabalhando com WCF e em seus dados de contrato (Classes DataContract) precisar retornar uma lista de objetos e usar o IList&lt;T&gt;, você pode se deparar com a seguite exception: <strong>ExecutionEngineException</strong>.</p>
<p>Esse erro é causado pois existe um bug no .NET Framework para tratar IList&lt;T&gt; entre as camadas e por algum motivo o WCF interpreta o IList&lt;T&gt; que normalmente usamos o List&lt;T&gt; como classe principal para definir as informações como array de T[]. Isso pode lhe causar problemas de serialização, vide a exception ou simplesmente causar um problema de você retornar uma lista de objetos, tentar modificá-la adicionando mais um item e simplesmente o WCF retornar um erro dizendo que o Array é de tamanho fixo: <strong>Collection was of a fixed size</strong>.</p>
<p>Para solucionar esse problema, encontrei em um <a href="http://yanivh.wordpress.com/2008/11/21/datacontractserializer-and-generic-lists/" target="_blank">blog de um desenvolvedor</a> a seguinte correção:</p>
<pre class="brush:csharp">[OnDeserialized]
internal void DeserializedMethod(StreamingContext context)
{
	if (this.SuaLista != null) this.SuaLista = this.SuaLista.ToList();
}
</pre>
<p>Basta colocar esse método com esse atributo nas suas classes e pronto.<br />
Esse atributo <strong>OnDeserializedAttribute </strong>faz com que o método implementado (exatamente com essa assinatura) seja acionado assim que a serialização for concluída.</p>
<p>Espero que possa ajudar.. pois perdi 2 dias para corrigir esse problema no projeto que estou participando. :-s</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/06/12/dica-problema-com-serializacao-ilist-e-wcf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Diminuindo o tamanho do seu Javascript e CSS para publicação</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/30/dica-diminuindo-o-tamanho-do-seu-javascript-e-css-para-publicacao/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/30/dica-diminuindo-o-tamanho-do-seu-javascript-e-css-para-publicacao/#comments</comments>
		<pubDate>Sun, 30 May 2010 14:57:59 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS Minifier]]></category>
		<category><![CDATA[Javascript Minifier]]></category>
		<category><![CDATA[Minifier]]></category>
		<category><![CDATA[Stylesheet Minifier]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=494</guid>
		<description><![CDATA[A Microsoft desenvolveu uma ferramenta muito boa para minimizar o tamanho do seu Javascript e CSS para que ele possa ficar muito mais rápido de ser carregado quando a página for executada. Chama-se: Microsoft Ajax Minifier E o melhor de tudo, ao instalar ele vem com uma DLL chamada AjaxMin.dll que você poderá adicionar em [...]]]></description>
			<content:encoded><![CDATA[<p>A Microsoft desenvolveu uma ferramenta muito boa para minimizar o tamanho do seu Javascript e CSS para que ele possa ficar muito mais rápido de ser carregado quando a página for executada.</p>
<p>Chama-se: <a href="http://aspnet.codeplex.com/releases/view/40584" target="_blank">Microsoft Ajax Minifier</a></p>
<p>E o melhor de tudo, ao instalar ele vem com uma DLL chamada AjaxMin.dll que você poderá adicionar em algum projeto seu e customizar alguma ferramenta para fazer esse trabalho para você. Muito interessante.</p>
<p>A localização da DLL fica em:<br />
%ProgramFiles%\MSBuild\Microsoft\MicrosoftAjax<br />
ou<br />
%ProgramFiles(X86)%\MSBuild\Microsoft\MicrosoftAjax (Windows 64 bits)</p>
<p>Veja um trecho de código de como você poderia usar a API:</p>
<pre class="brush:csharp">FileInfo[] files = new DirectoryInfo(Server.MapPath("~/js")).GetFiles().Where(f =&gt; f.Extension == ".js").ToArray();

foreach (var file in files)
{
	Minifier mini = new Minifier();
	var resultJS = mini.MinifyJavaScript(File.ReadAllText(file.FullName), new CodeSettings()
	{
		MacSafariQuirks = true,
		OutputMode = OutputMode.SingleLine,
		PreserveFunctionNames = true,
		RemoveUnneededCode = true
	});

	File.WriteAllText(file.FullName, resultJS);
}
</pre>
<p>Até mais&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/30/dica-diminuindo-o-tamanho-do-seu-javascript-e-css-para-publicacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Desabilitando um Validator na página via Javascript</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/19/dica-desabilitando-um-validator-na-pagina-via-javascript/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/19/dica-desabilitando-um-validator-na-pagina-via-javascript/#comments</comments>
		<pubDate>Wed, 19 May 2010 19:33:45 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Client-side asp.net]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Validator]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=492</guid>
		<description><![CDATA[Hoje um amigo me fez uma pergunta em como ele poderia desabilitar um validator em determinadas situações pelo Javascript. Eu já havia feito isso mas não lembrava como, ao pesquisar no google uma maneira simples de fazer, descobri um método das APIs de javascript do ASP.NET que faz esse trabalho para nós: ValidatorEnable(control, true&#124;false). Esse [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje um amigo me fez uma pergunta em como ele poderia desabilitar um validator em determinadas situações pelo Javascript. Eu já havia feito isso mas não lembrava como, ao pesquisar no google uma maneira simples de fazer, descobri um método das APIs de javascript do ASP.NET que faz esse trabalho para nós: ValidatorEnable(control, true|false).</p>
<p>Esse cara pode ser usado assim:</p>
<pre class="brush:javascript">if (condicaoParaValidarNome == true)
{
	ValidatorEnable($get('rfvNome'), false);
}
else
{
	ValidatorEnable($get('rfvNome'), true);
}
</pre>
<p>Espero que possa ajudar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/19/dica-desabilitando-um-validator-na-pagina-via-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autenticação de usuários no AD (Active Directory)</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/11/autenticacao-de-usuarios-no-ad-active-directory/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/11/autenticacao-de-usuarios-no-ad-active-directory/#comments</comments>
		<pubDate>Wed, 12 May 2010 01:33:48 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[AD]]></category>
		<category><![CDATA[System.DirectoryServices.AccountManagement]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=487</guid>
		<description><![CDATA[Para quem usa .NET 3.5 e precisar algum dia fazer autenticação de usuários via AD, pode ficar mais tranquilo que vai ser um pouco mais fácil. Ao procurar no Google sobre autenticação AD para .NET, existem várias pessoas falando sobre System.DirectoryServices do .NET que fornece várias classes para auxiliar a obter informações do AD, porém, [...]]]></description>
			<content:encoded><![CDATA[<p>Para quem usa .NET 3.5 e precisar algum dia fazer autenticação de usuários via AD, pode ficar mais tranquilo que vai ser um pouco mais fácil. Ao procurar no Google sobre autenticação AD para .NET, existem várias pessoas falando sobre System.DirectoryServices do .NET que fornece várias classes para auxiliar a obter informações do AD, porém, essas classes normalmente são bem grandes e chatas de serem implementadas. Hoje eu descobri uma classe ninja que faz todo o trabalho sujo para nós e o melhor é do .NET Framework 3.5.</p>
<p>A classe em questão chama-se PrincipalContext e fica dentro do namespace System.DirectoryServices.AccountManagement. Com apenas 2 linhas de código você consegue saber se aquele usuário é válido no AD:</p>
<pre class="brush:csharp">
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "DOMINIO");

if (!principalContext.ValidateCredentials("usuario", "senha"))
{
       //...faz algum tratamento para usuários inválidos
}
</pre>
<p>Bem simples, não?</p>
<p>Espero que possa ajudar a quem precisar disso um dia&#8230;<br />
[]s</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/11/autenticacao-de-usuarios-no-ad-active-directory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursividade de classes no Nhibernate</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/09/recursividade-de-classes-no-nhibernate/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/09/recursividade-de-classes-no-nhibernate/#comments</comments>
		<pubDate>Mon, 10 May 2010 02:13:04 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[Recursividade]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=448</guid>
		<description><![CDATA[Ao criar classes mapeando-as para NHibernate, tome muito cuidado com a recursividade das classes, que pode lhe causar muita dor de cabeça. Entrei em um projeto onde estavam utilizando NHibernate e ActiveRecord (mapeamento com Attributes, sem usar arquivos XML) e em algumas classes fizeram o mapeamento parecida com a ilustração abaixo: public class Cliente { [...]]]></description>
			<content:encoded><![CDATA[<p>Ao criar classes mapeando-as para NHibernate, tome muito cuidado com a recursividade das classes, que pode lhe causar muita dor de cabeça. Entrei em um projeto onde estavam utilizando NHibernate e <a href="http://www.castleproject.org/" target="_blank">ActiveRecord</a> (mapeamento com Attributes, sem usar arquivos XML) e em algumas classes fizeram o mapeamento parecida com a ilustração abaixo:</p>
<pre class="brush:csharp">public class Cliente
{
	public Cliente()
	{
	}

	public string Nome { get; set; }
	public string Email { get; set; }
	public string Endereco { get; set; }
	public List&lt;Produto&gt; ProdutosDesejados { get; set; }
}

public class Produto
{
	public Pedido() { }

	public int ID { get; set; }
	public int PrecoTotal { get; set; }
	public List&lt;Cliente&gt; Clientes { get; set; }
}
</pre>
<p>Na ilustração acima, parece bem simples, porém, pode causar um baita problema para a sua aplicação na hora que o NHibernate for obter os dados do banco de dados. Quando o Nhibernate trouxer todos os dados do banco e atribuí-las para suas propriedades e classes filhas (conforme exemplo de Produto e Cliente), o objeto entrará numa recursividade absurda. O Nhibernate sabe se virar nessas horas, porém, o tamanho do seu objeto poderá ficar enorme.</p>
<p>Para cada cliente carregado, será retornado a lista de produtos desejados daquele cliente e para cada produto irão ser carregados todos os clientes que desejam aquele Produto, ou seja, é muita informação para ser trafegada para uma aplicação baseada em serviços por exemplo.</p>
<p>Então, ao mapear suas classes utilizando qualquer API de O/R Mapper (NHibernate, Entity Framework, etc), tome cuidado com esses detalhes e evite dores de cabeça que poderão fazer com que você tenha um retrabalho enorme.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/09/recursividade-de-classes-no-nhibernate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF e mais de um Host Header no IIS</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/04/wcf-e-mais-de-um-host-header-no-iis/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/04/wcf-e-mais-de-um-host-header-no-iis/#comments</comments>
		<pubDate>Tue, 04 May 2010 16:28:04 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Host Header]]></category>
		<category><![CDATA[ServiceHostFactory]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=470</guid>
		<description><![CDATA[Se você estiver desenvolvendo alguma coisa utilizando WCF e na hora do Deploy em produção ou algum outro ambiente que esteja configurado mais de um Host Header no IIS você irá se deparar com o seguinte erro: This collection already contains an address with scheme http. There can be at most one address per scheme [...]]]></description>
			<content:encoded><![CDATA[<p>Se você estiver desenvolvendo alguma coisa utilizando WCF e na hora do Deploy em produção ou algum outro ambiente que esteja configurado mais de um Host Header no IIS você irá se deparar com o seguinte erro:</p>
<p><em><strong>This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.<br />
</strong></em></p>
<p>Caso isso ocorra, você terá duas opções (pelo menos as que eu encontrei até o momento):<br />
1º &#8211; Configurar seu web.config dos serviços WCF fixando uma URL para os mesmos.</p>
<p style="padding-left: 30px;">- Essa opção é um pouco chata, pois te força a configurar vários itens no web.config e dificulta um pouco a sua manutenção em ambientes (produção) com muitos servidores.</p>
<p>2º &#8211; Criar uma classe customizada herdando de <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx" target="_blank">ServiceHostFactory</a>.</p>
<p style="padding-left: 30px;">- Esse é a maneira mais interessante que eu vi, pois você consegue customizar como o WCF irá instanciar seus serviços e tudo mais. Exemplo simples:</p>
<pre class="brush:csharp">public class WcfCustomFactory : ServiceHostFactory
{
	public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
	{
		return base.CreateServiceHost(constructorString, FilterUrls(baseAddresses));
	}

	protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
	{
		return base.CreateServiceHost(serviceType, FilterUrls(baseAddresses));
	}

	private Uri[] FilterUrls(Uri[] baseAddresses)
	{
		List&lt;Uri&gt; urls = new List&lt;Uri&gt;();

		string newUrl = "http://localhost";

		baseAddresses.FirstOrDefault().Segments.ToList()
			.ForEach(item =&gt; newUrl = string.Concat(newUrl, item));

		urls.Add(new Uri(newUrl));
		urls.Add(new Uri(newUrl.Replace("http://", "https://")));

		return urls.ToArray();
	}
}
</pre>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 382px; width: 1px; height: 1px; overflow: hidden;">private Uri[] FilterUrls(Uri[] baseAddresses)<br />
{<br />
List&lt;Uri&gt; urls = new List&lt;Uri&gt;();</p>
<p>string newUrl = &#8220;http://{0}&#8221;.StringFormat(Configuracoes.HostIP);</p>
<p>baseAddresses.FirstOrDefault().Segments.ToList()<br />
.ForEach(item =&gt; newUrl = string.Concat(newUrl, item));</p>
<p>urls.Add(new Uri(newUrl));<br />
urls.Add(new Uri(newUrl.Replace(&#8220;http://&#8221;, &#8220;https://&#8221;)));</p>
<p>return urls.ToArray();<br />
}</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/05/04/wcf-e-mais-de-um-host-header-no-iis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Esquema de cores para Visual Studio</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/04/30/dica-esquema-de-cores-para-visual-studio/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/04/30/dica-esquema-de-cores-para-visual-studio/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 13:53:20 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=474</guid>
		<description><![CDATA[Vendo os blogs de outros desenvolvedores, deram a dica de um site com vários esquemas de cores para Visual Studio, basta baixar e usar. Fonte: http://weblogs.asp.net/scottgu/archive/2010/04/29/download-and-share-visual-studio-color-schemes.aspx Link: http://studiostyles.info/]]></description>
			<content:encoded><![CDATA[<p>Vendo os blogs de outros desenvolvedores, deram a dica de um site com vários esquemas de cores para Visual Studio, basta baixar e usar.</p>
<p>Fonte: <a href="http://weblogs.asp.net/scottgu/archive/2010/04/29/download-and-share-visual-studio-color-schemes.aspx" target="_blank">http://weblogs.asp.net/scottgu/archive/2010/04/29/download-and-share-visual-studio-color-schemes.aspx</a></p>
<p>Link: <a href="http://studiostyles.info/" target="_blank">http://studiostyles.info/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/04/30/dica-esquema-de-cores-para-visual-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabalhando com datas e valores numéricos &#8211; Culture e UICulture</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/02/06/trabalhando-com-datas-e-valores-numericos-culture-e-uiculture/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/02/06/trabalhando-com-datas-e-valores-numericos-culture-e-uiculture/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 11:52:40 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=464</guid>
		<description><![CDATA[É muito comum em qualquer sistema que vamos desenvolver trabalhar com Datas e números. Uma coisa que acabamos não nos preocupando é o fato de que quando formos efetuar o Deploy em outro ambiente que não seja a nossa máquina de desenvolvimento, nos deparamos com alguns problemas com as conversões desses valores. Imagine o seguinte: [...]]]></description>
			<content:encoded><![CDATA[<p>É muito comum em qualquer sistema que vamos desenvolver trabalhar com Datas e números. Uma coisa que acabamos não nos preocupando é o fato de que quando formos efetuar o Deploy em outro ambiente que não seja a nossa máquina de desenvolvimento, nos deparamos com alguns problemas com as conversões desses valores.</p>
<p>Imagine o seguinte:</p>
<p>- O usuário digita no campo de texto a data de nascimento: 05/02/1984.</p>
<p style="padding-left: 30px;">- Você na sua página vai efetuar a conversão da string para um DateTime, por exemplo, assim: Convert.ToDateTime(txtDataNascimento.Text);</p>
<p>Fazendo isso, o seu sistema irá converter perfeitamente a data, caso o ambiente esteja configurado para pt-BR (cultura brasileira). Mas o que aconteceria se no servidor estiver configurado para en-US (cultura americana)?</p>
<p>O <a href="http://msdn.microsoft.com/en-us/library/system.convert.todatetime.aspx" target="_blank">Convert.ToDateTime</a> irá converter a sua data para 02/05/1984.</p>
<p>Resumindo, a sua aplicação estará errada e pode ser que você só repare isso depois que seu cliente reclamar.</p>
<p>Para resolver isso, você pode fazer as seguintes coisas:</p>
<p>- Colocar a tag &lt;globalization&gt; no seu web.config;</p>
<p>- Mudar em tempo de execução no método InitializeCulture (override) da classe Page a Thread:</p>
<pre class="brush: csharp">Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("pt-BR");</pre>
<p>- Convertendo para o formato desejado na sobrecarga de método da classe Convert:</p>
<pre class="brush: csharp">
DateTime data = Convert.ToDateTime("05/02/1984", new CultureInfo("pt-BR"));</pre>
<p>Espero que possa ajudar&#8230;  <img src='http://blog.carlosalessandroribeiro.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/02/06/trabalhando-com-datas-e-valores-numericos-culture-e-uiculture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Carro do Google Street View em São Paulo</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/19/carro-do-google-street-view-em-sao-paulo/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/19/carro-do-google-street-view-em-sao-paulo/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 11:38:01 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Google Street View]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=456</guid>
		<description><![CDATA[Sábado a tarde estava passando pela região da Mooca e com o que eu me deparei? Aguardem, logo logo estaremos vendo as nossas ruas pela Internet! :-p]]></description>
			<content:encoded><![CDATA[<p>Sábado a tarde estava passando pela região da Mooca e com o que eu me deparei?</p>
<p style="text-align: center;"><a href="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2010/01/IMG_0048.jpg"><img class="size-medium wp-image-457  aligncenter" title="Carro - Google Street View" src="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2010/01/IMG_0048-225x300.jpg" alt="Carro - Google Street View" width="225" height="300" /></a></p>
<p style="text-align: left;">Aguardem, logo logo estaremos vendo as nossas ruas pela Internet! :-p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/19/carro-do-google-street-view-em-sao-paulo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dicas interessantes para te ajudar no dia-a-dia</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/17/dicas-interessantes-para-te-ajudar-no-dia-a-dia/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/17/dicas-interessantes-para-te-ajudar-no-dia-a-dia/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 15:00:42 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=452</guid>
		<description><![CDATA[Encontrei um post de um blog em que eu assino o RSS do mesmo e achei bem interessante e gostaria de compartilhar. São dicas muito úteis para o nosso dia-a-dia, em que perdemos horas com detalhes bobos, porém, o .NET já nos oferece uma variedade de facilidades. Segue o link: http://www.ironshay.com/post/Use-NET-Built-in-Methods-to-Save-Time-and-Headaches.aspx Espero que possa ajudá-los&#8230;..]]></description>
			<content:encoded><![CDATA[<p>Encontrei um <a href="http://www.ironshay.com/post/Use-NET-Built-in-Methods-to-Save-Time-and-Headaches.aspx" target="_blank">post </a>de um blog em que eu assino o RSS do mesmo e achei bem interessante e gostaria de compartilhar. São dicas muito úteis para o nosso dia-a-dia, em que perdemos horas com detalhes bobos, porém, o .NET já nos oferece uma variedade de facilidades.</p>
<p>Segue o link:</p>
<p><a href="http://www.ironshay.com/post/Use-NET-Built-in-Methods-to-Save-Time-and-Headaches.aspx" target="_blank">http://www.ironshay.com/post/Use-NET-Built-in-Methods-to-Save-Time-and-Headaches.aspx</a></p>
<p>Espero que possa ajudá-los&#8230;..</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/17/dicas-interessantes-para-te-ajudar-no-dia-a-dia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuidado com Windsor (IoC) e WCF</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/16/cuidado-com-windsor-ioc-e-wcf/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/16/cuidado-com-windsor-ioc-e-wcf/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 14:06:29 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Castle Project]]></category>
		<category><![CDATA[Injeção de Dependência]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[WcfIntegration]]></category>
		<category><![CDATA[Windsor]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=450</guid>
		<description><![CDATA[Existe uma API para Injeção de Dependência chamada Windsor da Castle Project e com ela vem uma outra API para fazer integração com WCF, denominada WcfIntegration (é um Facility das APIs da Castle). Tive um problema enorme com essa API, que foi utilizada em um projeto que estou participando para integração com o WCF que [...]]]></description>
			<content:encoded><![CDATA[<p>Existe uma API para Injeção de Dependência chamada <a href="http://www.castleproject.org/"><strong>Windsor</strong></a> da Castle Project e com ela vem uma outra API para fazer integração com WCF, denominada WcfIntegration (é um Facility das APIs da Castle). Tive um problema enorme com essa API, que foi utilizada em um projeto que estou participando para integração com o WCF que simplesmente as configurações de Binding (tamanho de mensagem, timeout e algumas outras configurações) ele simplesmente ignora ao gerenciar a instância da classe do WCF (Serviço). Tive que remover essa integração, pois para ajudar, não existe nenhuma informação na internet (google) para ajudar.</p>
<p>Então fica ai a dica, não use essa API para integrar com o WCF, senão muito provável que você tenha dores de cabeça caso a mensagem ultrapasse o valor padrão de 65KB.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2010/01/16/cuidado-com-windsor-ioc-e-wcf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: SQL Server com instância nomeada</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/08/30/dica-sql-server-com-instancia-nomeada/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/08/30/dica-sql-server-com-instancia-nomeada/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 14:53:01 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Instância nomeada]]></category>
		<category><![CDATA[Porta TCP]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=437</guid>
		<description><![CDATA[Quando fazemos a instalação padrão de um SQL Server padrão, ele te dá a opção de efetuar uma instalação com instancia Default ou Nomeada. Caso você escolha a instância nomeada, ele não fixa no serviço que roda essa instância a porta padrão 1433 que o SQL Server usa. Toda vez que o SQL Server é [...]]]></description>
			<content:encoded><![CDATA[<p>Quando fazemos a instalação padrão de um SQL Server padrão, ele te dá a opção de efetuar uma instalação com instancia Default ou Nomeada. Caso você escolha a instância nomeada, ele não fixa no serviço que roda essa instância a porta padrão 1433 que o SQL Server usa. Toda vez que o SQL Server é reiniciado, ele verifica uma porta livre para ser usada, ou seja, nem sempre será a mesma porta que ele irá utilizar.</p>
<p>Para conseguir deixar uma porta padrão para ser usada sempre, siga os seguintes passos:</p>
<p>Passo 1: Abra o programa &#8220;SQL Server Configuration Manager&#8221;</p>
<p><a href="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2009/08/Passo1.jpg"><img class="size-medium wp-image-438" title="Passo 1" src="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2009/08/Passo1-300x247.jpg" alt="Passo 1" width="300" height="247" /></a></p>
<p>Passo 2: Selecione no Configuration Manager o nome da instância definida e clique duas vezes no protocolo TCP/IP.</p>
<p><a href="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2009/08/Passo2.jpg"><img class="size-medium wp-image-439" title="Passo 2" src="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2009/08/Passo2-300x176.jpg" alt="Passo 2" width="300" height="176" /></a></p>
<p>Passo 3: Encontre a opção &#8220;IPAll&#8221; e na propriedade Porta TCP defina a porta desejada.</p>
<p><a href="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2009/08/Passo3.jpg"><img class="size-medium wp-image-440" title="Passo 3" src="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2009/08/Passo3-300x203.jpg" alt="Passo 3" width="300" height="203" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/08/30/dica-sql-server-com-instancia-nomeada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Servidor para gerenciar build</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/08/16/dica-servidor-para-gerenciar-build/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/08/16/dica-servidor-para-gerenciar-build/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 03:44:30 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[gerenciamento de build]]></category>
		<category><![CDATA[MSBuild]]></category>
		<category><![CDATA[NAnt]]></category>
		<category><![CDATA[TeamCity]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=435</guid>
		<description><![CDATA[A empresa que faz o plugin do Visual Studio ReSharper tem um software muito bom para gerenciamento de build. Ele integra com o Subversion, Team Foundation Server entre outros e com NAnt, MsBuild e vários outros também que são arquivos de configuração de builds. É muito bom e como sempre, tem a versão Free para [...]]]></description>
			<content:encoded><![CDATA[<p>A empresa que faz o plugin do Visual Studio <strong>ReSharper </strong>tem um software muito bom para gerenciamento de build. Ele integra com o <strong>Subversion</strong>, <strong>Team Foundation Server</strong> entre outros e com <a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fnant.sourceforge.net%2F&amp;ei=I4CHSoX_B6Gltgf_kODnDA&amp;usg=AFQjCNFwX2HWcVNI4hTpfAzpL-NpdDyKZw&amp;sig2=yL59ypQBo_UI9R3jpNdh-w" target="_blank">NAnt</a>, <a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=2&amp;url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2F0k6kkbsd.aspx&amp;ei=KYCHSvXJDYaMtgfGhtTnDA&amp;usg=AFQjCNGaAEF0Kd50-YxY-4T53QuFlVHo3Q&amp;sig2=jZulC51_7GadWl8dRI9ugw" target="_blank">MsBuild</a> e vários outros também que são arquivos de configuração de builds. É muito bom e como sempre, tem a versão <a href="http://www.jetbrains.com/teamcity/buy/buy.jsp#professional" target="_blank">Free</a> para até 20 usuários usarem, 20 configurações de builds e 3 agentes de build. O nome do software é TeamCity.</p>
<p>Confira esse software <a href="http://www.jetbrains.com/teamcity/index.html" target="_blank">clicando aqui</a>.</p>
<p>Fica ai a dica para quem quer automatizar seus processos de builds.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/08/16/dica-servidor-para-gerenciar-build/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Como pegar o número da linha que ocorreu Exception</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/19/dica-como-pegar-o-numero-da-linha-que-ocorreu-exception/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/19/dica-como-pegar-o-numero-da-linha-que-ocorreu-exception/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 16:02:03 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Exception]]></category>
		<category><![CDATA[ParameterInfo]]></category>
		<category><![CDATA[StackTrace]]></category>
		<category><![CDATA[try catch finally]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=427</guid>
		<description><![CDATA[Encontrei uma coisa bem interessante para tratamento de erros nas aplicações .NET. É como pegar o número da linha, o arquivo que deu o erro e o nome do método durante a Exception. Pode ajudar muita gente durante o debug de alguma aplicação para encontrar o erro exatamente e efetuar logging mais completo. O código [...]]]></description>
			<content:encoded><![CDATA[<p>Encontrei uma coisa bem interessante para tratamento de erros nas aplicações .NET. É como pegar o número da linha, o arquivo que deu o erro e o nome do método durante a Exception. Pode ajudar muita gente durante o debug de alguma aplicação para encontrar o erro exatamente e efetuar logging mais completo.</p>
<p>O código para pegar essas informações é:</p>
<pre class="brush:csharp">
StackTrace stackTrace = new StackTrace(ex, true);

if (stackTrace.FrameCount > 0)
{
	int line = stackTrace.GetFrame(0).GetFileLineNumber();
	int column = stackTrace.GetFrame(0).GetFileColumnNumber();
	string method = stackTrace.GetFrame(0).GetMethod().Name;

	List&lt;ParameterInfo&gt; parameters = new List&lt;ParameterInfo&gt;();
	foreach (ParameterInfo prm in stackTrace.GetFrame(0).GetMethod().GetParameters())
		parameters.Add(prm.Name);
}
</pre>
<p>Bem interessante, não?</p>
<p>Fica ai mais uma dica&#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/19/dica-como-pegar-o-numero-da-linha-que-ocorreu-exception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UpdateProgress com jQuery</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/19/updateprogress-com-jquery/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/19/updateprogress-com-jquery/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 05:54:35 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[beginRequest]]></category>
		<category><![CDATA[endRequest]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Microsoft Ajax]]></category>
		<category><![CDATA[Thickbox]]></category>
		<category><![CDATA[UpdateProgress]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=423</guid>
		<description><![CDATA[Para criar uma mensagem de &#8220;Processando&#8230;&#8221;, &#8220;Aguarde&#8230;&#8221;, etc. O Ajax da Microsoft (já embutido no .NET Framework a partir da versão 3.5) nos fornece 2 eventos para que possamos trabalhar com a hora que é feita uma requisição ao servidor via Ajax e a hora que é retornada essa requisição, são elas respectivamente: - Sys.WebForms.PageRequestManager.getInstance().add_beginRequest [...]]]></description>
			<content:encoded><![CDATA[<p>Para criar uma mensagem de &#8220;Processando&#8230;&#8221;, &#8220;Aguarde&#8230;&#8221;, etc. O Ajax da Microsoft (já embutido no .NET Framework a partir da versão 3.5) nos fornece 2 eventos para que possamos trabalhar com a hora que é feita uma requisição ao servidor via Ajax e a hora que é retornada essa requisição, são elas respectivamente:</p>
<p>- Sys.WebForms.PageRequestManager.getInstance().add_beginRequest<br />
- Sys.WebForms.PageRequestManager.getInstance().add_endRequest</p>
<p>Bom, para criar esse exemplo, eu usei as seguintes bibliotecas JavaScript:<br />
- jQuery v1.3.2<br />
- Thickbox 3.1</p>
<p>Vamos ao exemplo.</p>
<p>1 &#8211; Crie uma página ou MasterPage e em algum lugar dentro do Body adicione essa DIV:</p>
<pre class="brush:html">&lt;div id="updateProgress" style="display:none;"&gt;
	&lt;center&gt;
 		&lt;strong&gt;Processando... Aguarde...&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;
 		&lt;asp:Image ID="imgWaiting" runat="server" ImageUrl="~/_img/waiting.gif" /&gt;
 	&lt;/center&gt;
&lt;/div&gt;</pre>
<p>2 &#8211; Adicione no final da página, antes da TAG &lt;/body&gt; o JavaScript:</p>
<pre class="brush:js">&lt;script type="text/javascript"&gt;
	Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(showUpdateProgress);
	Sys.WebForms.PageRequestManager.getInstance().add_endRequest(hideUpdateProgress);
&lt;/script&gt;</pre>
<p>3 &#8211; Agora crie as funções JS que executarão o exibir/ocultar mensagem e coloque dentro da tag &lt;head&gt;:</p>
<pre class="brush:js">&lt;script type="text/javascript"&gt;
function showUpdateProgress()
{
	tb_show('Aguarde...', '#TB_inline?height=60&amp;width=150&amp;inlineId=updateProgress&amp;modal=true', null);
}

function hideUpdateProgress()
{
	setTimeout(tb_remove, 700);
}
&lt;/script&gt;</pre>
<p>Bem simples, não?</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/19/updateprogress-com-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dica: Request.Form x MasterPage</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/15/dica-request-form-x-masterpage/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/15/dica-request-form-x-masterpage/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 17:12:25 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MasterPage]]></category>
		<category><![CDATA[Request.Form]]></category>
		<category><![CDATA[UniqueID]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=421</guid>
		<description><![CDATA[Quando estamos desenvolvendo aplicações em que temos que desativar o Viewstate e temos que fazer uso do Request.Form para recuperar as informações (estilo ASPão clássico.. rsrs..), tomamos tilt quando usamos a MasterPage, pois todos os campos recebem uns IDs (nomes também) diferentes. Se você usar o Request.Form["idCampo"], não irá funcionar, pois no Request na página [...]]]></description>
			<content:encoded><![CDATA[<p>Quando estamos desenvolvendo aplicações em que temos que desativar o Viewstate e temos que fazer uso do Request.Form para recuperar as informações (estilo ASPão clássico.. rsrs..), tomamos tilt quando usamos a MasterPage, pois todos os campos recebem uns IDs (nomes também) diferentes.</p>
<p>Se você usar o Request.Form["idCampo"], não irá funcionar, pois no Request na página o campo irá vir mais ou menos assim: ctl00$idContentPlaceHolder$idCampo.</p>
<p>Como resolver isso? Use o UniqueID do webcontrol.</p>
<p>Ficará assim: Request.Form[txtNome.UniqueID];</p>
<p>E veja que tudo volta a funcionar&#8230; :-p</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/15/dica-request-form-x-masterpage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dica: Custom HttpHandler x Session</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/07/dica-customhttphandler-session/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/07/dica-customhttphandler-session/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 17:49:26 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[HttpHandler]]></category>
		<category><![CDATA[IRequiresSessionState]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=416</guid>
		<description><![CDATA[Eu estava desenvolvendo um Custom HttpHandler e nele eu acessava o HttpContext.Current.Session e para minha surpresa a Session minha nula. Como sempre, fui atrás de uma solução e tentar entender o por que que isso acontecia. O que eu encontrei foi que quando criamos um Custom HttpHandler para que o ASP.NET entenda que nele terá [...]]]></description>
			<content:encoded><![CDATA[<p>Eu estava desenvolvendo um <a href="http://msdn.microsoft.com/en-us/library/ms228090.aspx" target="_blank"><strong>Custom HttpHandler</strong></a> e nele eu acessava o HttpContext.Current.Session e para minha surpresa a Session minha nula. Como sempre, fui atrás de uma solução e tentar entender o por que que isso acontecia. O que eu encontrei foi que quando criamos um Custom HttpHandler para que o ASP.NET entenda que nele terá acesso a Session, vc deverá herdar a interface <strong><a href="http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx" target="_blank">IRequiresSessionState</a></strong>.</p>
<p>Fica mais ou menos assim:</p>
<pre class="brush:csharp;">public class MeuHandler : IHttpHandler, IRequiresSessionState
{
	public void ProcessRequest(HttpContext context)
	{
		//Seu código aqui...
	}
}</pre>
<p>Simples não?</p>
<p>Espero que possa ajudar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/07/07/dica-customhttphandler-session/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Thickbox (jQuery) com ASP.NET &#8211; Perdendo informações PostBack</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/30/dica-thickbox-jquery-com-asp-net-perdendo-informacoes-postback/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/30/dica-thickbox-jquery-com-asp-net-perdendo-informacoes-postback/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 11:26:49 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Modal Popup]]></category>
		<category><![CDATA[Plugin jQuery]]></category>
		<category><![CDATA[Thickbox]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=409</guid>
		<description><![CDATA[Estava fazendo uma tela na sexta-feira e estava usando o Thickbox, plugin para o jQuery para abrir modal pop-up. Componente muito fácil de usar e deixa muito interativa a página. Porém, para variar, tive problemas ao executar a página. Eu havia criado uma página onde ao clicar em um determinado botão da tela, iria aparecer [...]]]></description>
			<content:encoded><![CDATA[<p>Estava fazendo uma tela na sexta-feira e estava usando o <a href="http://jquery.com/demo/thickbox/" target="_blank">Thickbox</a>, plugin para o <a href="http://jquery.com/" target="_blank">jQuery</a> para abrir modal pop-up. Componente muito fácil de usar e deixa muito interativa a página. Porém, para variar, tive problemas ao executar a página.</p>
<p>Eu havia criado uma página onde ao clicar em um determinado botão da tela, iria aparecer uma modal pop-up e o usuário iria preencher um Textbox (Textarea) e dar um postback na página para efetuar algumas validações. Simples, não?</p>
<p>Pois bem, ao efetuar o postback na tela o danado do campo Textbox não vinha preenchido, nem dando Request.Form[nomeTextBox.UniqueID] funfava. Mexe daqui, mexe dali e nada. Depois de muitas buscas no google e tentativas frustadas, fui analisar o código do thickbox para saber o que exatamente ele estava fazendo e o que estava me ferrando. Ao analisar o seguinte trecho (aproximadamente linha 219):</p>
<pre class="brush:javascript;">
if(url.indexOf('TB_inline') != -1){
	$("#TB_ajaxContent").append($('#' + params['inlineId']).children());
	$("#TB_window").unload(function () {
		$('#' + params['inlineId']).append( $("#TB_ajaxContent").children() ); // move elements back when you're finished
	});
	tb_position();
	$("#TB_load").remove();
	$("#TB_window").css({display:"block"});
}
</pre>
<p>Verificando esse código (corrijam-me se eu estiver errado) eu entendi que ele faz o que, ele recupera o HTML do parâmetro &#8216;inlineId&#8217; que é informado para abrir a modal e faz um append (insere esse conteúdo) numa DIV criada dinamicamente durante a criação da modal. Ao efetuar isso, eu entendi que ele remove o conteúdo de uma DIV e joga para a outra e logo em seguida ele no método unload da DIV principal da modal, ele faz o contrário, devolvendo o HTML para a DIV de origem.</p>
<p>Ao ver isso imaginei que era realmente isso que estava causando o meu problema, então fiz logo o uso do método tb_remove() para fechar a modal e acionar o evento unload e assim minha vida continuar seguindo, mas ainda nada, ai resolvi fazer um último teste, ao chamar o método tb_remove, antes de executar o método de postback, eu defini um timeout de 300 milisegundos após o tb_remove para acionar o postback e pronto! Minha vida voltou ao normal, veja como ficou:</p>
<pre class="brush:javascript;">
function MeuMetodo()
{
	tb_remove();
	setTimeout('__doPostBack(\'<%=btnMeuBotao.UniqueID %>\', \'\')', 300);
}
</pre>
<p>Espero possa ajudar alguém que tenha passado por isso ou irá passar&#8230;</p>
<p>:-p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/30/dica-thickbox-jquery-com-asp-net-perdendo-informacoes-postback/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica: Usando o __doPostBack</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/25/dica-usando-o-__dopostback/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/25/dica-usando-o-__dopostback/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 18:43:53 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[EventArgument]]></category>
		<category><![CDATA[EventTarget]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PostBack]]></category>
		<category><![CDATA[WebForms]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=404</guid>
		<description><![CDATA[Bom, não é todo mundo que sabe como usar o método javascript que já vem embutido no .NET chamado __doPostBack. Esse método javascript recebe dois parâmetros: eventTarget e eventArgument. O eventTarget nada mais é que o Unique ID gerado pelo controle ASP.NET para disparar o evento no servidor e o eventArgument é algum parâmetro que [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, não é todo mundo que sabe como usar o método javascript que já vem embutido no .NET chamado <a href="http://www.microsoft.com/brasil/msdn/Tecnologias/aspnet/PgAspNet.mspx"><strong>__doPostBack</strong></a>.</p>
<p>Esse método javascript recebe dois parâmetros: eventTarget e eventArgument. O eventTarget nada mais é que o Unique ID gerado pelo controle ASP.NET para disparar o evento no servidor e o eventArgument é algum parâmetro que você gostaria de passar para o servidor, por exemplo, ID de algum registro.</p>
<p>Como usá-lo? Veja um exemplo abaixo:</p>
<pre class="brush:html;">&lt;script type="text/javascript"&gt;
&lt;!--
	function EnviarParaServidor()
	{
		__doPostBack('&lt;%=btnBotao.UniqueID %&gt;', '1');
	}
--&gt;
&lt;/script&gt;</pre>
<p>E no CS da página:</p>
<pre class="brush:csharp;">protected void btnBotao_Click(object sender, EventArgs e)
{
         //Fazer alguma coisa aqui...
}</pre>
<p>Fica ai a dica&#8230; <img src='http://blog.carlosalessandroribeiro.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/25/dica-usando-o-__dopostback/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica: API para compactar e descompactar arquivos</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/19/dica-api-para-compactar-e-descompactar-arquivos/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/19/dica-api-para-compactar-e-descompactar-arquivos/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 20:29:05 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CodePlex]]></category>
		<category><![CDATA[Compactação de arquivos]]></category>
		<category><![CDATA[Zip]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=398</guid>
		<description><![CDATA[Existe uma API open-source no CodePlex muito boa e simples de se usar: http://www.codeplex.com/DotNetZip Fica a dica para quem precisa trabalhar com compactação de arquivos em .NET.]]></description>
			<content:encoded><![CDATA[<p>Existe uma API open-source no CodePlex muito boa e simples de se usar:</p>
<p><a href="http://www.codeplex.com/DotNetZip" target="_blank">http://www.codeplex.com/DotNetZip</a></p>
<p>Fica a dica para quem precisa trabalhar com compactação de arquivos em .NET.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/19/dica-api-para-compactar-e-descompactar-arquivos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: OracleParameter com Oracle.DataAccess.Client propriedade Size</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/17/dica-oracleparameter-com-oracle-dataaccess-client-propriedade-size/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/17/dica-oracleparameter-com-oracle-dataaccess-client-propriedade-size/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 00:52:44 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Data Provider]]></category>
		<category><![CDATA[ODP.NET]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=395</guid>
		<description><![CDATA[Estou usando o ODP.NET (Oracle Data Provider para .NET) em projeto e tive um pequeno problema, porém, que tomou um tempo para eu descobrir o erro. Ao executar um SELECT  usando o OracleCommand do provider fornecido pela Oracle, você tem a opção de trabalhar com os OracleParameter, porém, se você criar um parameter para uma [...]]]></description>
			<content:encoded><![CDATA[<p>Estou usando o ODP.NET (Oracle Data Provider para .NET) em projeto e tive um pequeno problema, porém, que tomou um tempo para eu descobrir o erro.</p>
<p>Ao executar um SELECT  usando o OracleCommand do provider fornecido pela Oracle, você tem a opção de trabalhar com os OracleParameter, porém, se você criar um parameter para uma coluna do tipo char(1) (que foi meu caso) e não definir a propriedade Size do parameter, sua query não será executada com sucesso, no meu caso ele simplesmente não encontrava nada. E o mais engraçado, se eu usar o System.Data.OracleClient que a Microsoft desenvolveu, funciona, pois internamente ele define o Size para você, dando mais flexibilidade para o desenvolvedor.</p>
<p>Fica ai a dica&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/17/dica-oracleparameter-com-oracle-dataaccess-client-propriedade-size/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Método ResolveClientUrl</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/16/dica-metodo-resolveclienturl/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/16/dica-metodo-resolveclienturl/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 10:43:45 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Caminho relativo]]></category>
		<category><![CDATA[ResolveClientUrl]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com.br/?p=390</guid>
		<description><![CDATA[Existe um método chamado ResolveClientUrl que é fornecido por qualquer objeto do tipo Control e tem o papel de &#8220;mapear&#8221; a Url do cliente a partir de uma url relativa, vamos simular uma situação: 1 &#8211; Seu site é acessado a partir da seguinte Url: http://www.seusite.com.br/Aplicacao/Default.aspx 2 &#8211; Suas imagens ficam dentro da pasta &#8220;Imagens&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Existe um método chamado <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.control.resolveclienturl.aspx" target="_blank"><strong>ResolveClientUrl</strong></a> que é fornecido por qualquer objeto do tipo Control e tem o papel de &#8220;mapear&#8221; a Url do cliente a partir de uma url relativa, vamos simular uma situação:</p>
<p>1 &#8211; Seu site é acessado a partir da seguinte Url: http://www.seusite.com.br/Aplicacao/Default.aspx<br />
2 &#8211; Suas imagens ficam dentro da pasta &#8220;Imagens&#8221;<br />
3 &#8211; Existem outras páginas que ficam dentro de outras pastas na estrutura citada no primeiro item<br />
4 &#8211; Você está usando MasterPage para simplificar a sua vida</p>
<p>Em alguns momentos quando desenvolvemos, precisamos dinamicamente definir imagens na execução da página, mas como comentado, existem várias páginas dentro de várias outras pastas, como resolver isso?</p>
<p>Se você trabalhar sempre com caminho relativo &#8220;~/Pasta/Arquivo.*&#8221; e usar o método ResolveClientUrl, seu problema será sanado, pois esse método mapea em tempo de execução qual o caminho para acessar o arquivo, ou seja, se você acessar a página &#8220;http://www.seusite.com.br/Aplicacao/Pasta/Pagina1.aspx&#8221; e na MasterPage que essa página herda tiver uma imagem que está sendo definida dinamicamente para o caminho relativo &#8220;~/Imagens/Arquivo.jpg&#8221;, o método irá resolver o caminho como &#8220;../Imagens/Arquivo.jpg&#8221;.</p>
<p>Para ilustrar melhor fiz um exemplo simples, <a href="http://blog.carlosalessandroribeiro.com.br/wp-content/uploads/2009/06/WebSiteResolveClientUrl.zip" target="_blank">clique aqui</a> para baixá-lo.</p>
<p>Espero que possa ajudar&#8230; até a próxima..</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/16/dica-metodo-resolveclienturl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adicionando conteúdo dinamicamente aos ContentPlaceHolders</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/08/adicionando-conteudo-dinamicamente-contentplaceholders/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/08/adicionando-conteudo-dinamicamente-contentplaceholders/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 11:40:37 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[ContentPlaceHolder]]></category>
		<category><![CDATA[MasterPage]]></category>
		<category><![CDATA[Sistema Gerenciador de Conteúdo]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com/?p=378</guid>
		<description><![CDATA[Precisei esses dias adicionar conteúdo dinamicamente aos ContentPlaceHolders de uma MasterPage, eu simplesmente passava um Array de conteúdos (HTML) e os adicionava nos Contents da MasterPage. Ficou mais ou menos assim: public void CarregarConteudos(List&#60;string&#62; conteudos) { for (int i = 0; i &#60; conteudos.Count; i++) { ContentPlaceHolder contentTemplate = (ContentPlaceHolder)this.FindControl(this.ContentPlaceHolders[i].ToString()); contentTemplate.Controls.Clear(); contentTemplate.Controls.Add(new LiteralControl(conteudos[i])); } } [...]]]></description>
			<content:encoded><![CDATA[<p>Precisei esses dias adicionar conteúdo dinamicamente aos ContentPlaceHolders de uma MasterPage, eu simplesmente passava um Array de conteúdos (HTML) e os adicionava nos Contents da MasterPage.</p>
<p>Ficou mais ou menos assim:</p>
<pre class="brush:csharp;">
public void CarregarConteudos(List&lt;string&gt; conteudos)
{
	for (int i = 0; i &lt; conteudos.Count; i++)
	{
		ContentPlaceHolder contentTemplate = (ContentPlaceHolder)this.FindControl(this.ContentPlaceHolders[i].ToString());

		contentTemplate.Controls.Clear();
		contentTemplate.Controls.Add(new LiteralControl(conteudos[i]));
	}
}
</pre>
<p>A propriedade ContentPlaceHolders é uma lista (ArrayList) com os IDs das áreas editáveis (ContentPlaceHolder), onde você poderá percorrer e encontrar o objeto (FindControl) e usá-lo conforme eu fiz no método acima.</p>
<p>Esse exemplo é bem básico, mas dá para ver como fica fácil trabalharmos dinamicamente com MasterPages.</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/06/08/adicionando-conteudo-dinamicamente-contentplaceholders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Versionamento (Subversion) de fonte online &#8211; Free</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/05/27/dica-versionamento-subversion-de-fonte-online-free/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/05/27/dica-versionamento-subversion-de-fonte-online-free/#comments</comments>
		<pubDate>Thu, 28 May 2009 02:10:54 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Versionamento de fonte]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com/?p=375</guid>
		<description><![CDATA[Encontrei um provedor que fornece hospedagem de controle de versão pelo Subversion! E o melhor, eles tem um plano inicial que é gratuito: - 500MB de disco - 2 usuários - Work Items - Entre outras coisas É muito bacana, testei no meu computador e funcionou perfeitamente. http://www.codespaces.com/ Até a próxima&#8230;]]></description>
			<content:encoded><![CDATA[<p>Encontrei um provedor que fornece hospedagem de controle de versão pelo Subversion! E o melhor, eles tem um plano inicial que é gratuito:</p>
<p>- 500MB de disco<br />
- 2 usuários<br />
- Work Items<br />
- Entre outras coisas</p>
<p>É muito bacana, testei no meu computador e funcionou perfeitamente.</p>
<p><a href="http://www.codespaces.com/" target="_blank">http://www.codespaces.com/</a></p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/05/27/dica-versionamento-subversion-de-fonte-online-free/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dica: Site de extensões (Extensions) para .NET 3.5</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/05/25/dica-site-de-extensoes-extensions-para-net-35/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/05/25/dica-site-de-extensoes-extensions-para-net-35/#comments</comments>
		<pubDate>Mon, 25 May 2009 20:15:09 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extensions]]></category>

		<guid isPermaLink="false">http://blog.carlosalessandroribeiro.com/?p=373</guid>
		<description><![CDATA[Encontrei um site bem interessante esses dias com várias extensões (Extensions) para usar com .NET 3.5. http://www.extensionmethod.net/ Espero que possa ajudar&#8230;]]></description>
			<content:encoded><![CDATA[<p>Encontrei um site bem interessante esses dias com várias extensões (Extensions) para usar com .NET 3.5.</p>
<p><a href="http://www.extensionmethod.net/Default.aspx" target="_blank">http://www.extensionmethod.net/</a></p>
<p>Espero que possa ajudar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/05/25/dica-site-de-extensoes-extensions-para-net-35/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Certificação, em busca do MCPD Web Developer!</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/04/11/certificacao-em-busca-do-mcpd-web-developer/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/04/11/certificacao-em-busca-do-mcpd-web-developer/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 14:51:14 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Certificação]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[MCPD]]></category>
		<category><![CDATA[MCTS]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=364</guid>
		<description><![CDATA[Bom galera, consegui passar nessa quinta-feira que passou (09/04/2009) no exame da Microsoft 70-528, foi minha primeira prova de certificação que fiz e estou em busca da certificação MCPD Web Developer. Para quem busca a certificação, recomendo dar uma boa estudada e treinar bastante, pois cai muita coisa que as vezes não mexemos no dia-a-dia. [...]]]></description>
			<content:encoded><![CDATA[<p>Bom galera, consegui passar nessa quinta-feira que passou (09/04/2009) no exame da Microsoft <strong>70-528</strong>, foi minha primeira prova de certificação que fiz e estou em busca da certificação <a href="http://www.microsoft.com/learning/mcp/mcpd/webdev/default.mspx" target="_blank"><strong>MCPD Web Developer</strong></a>.</p>
<p>Para quem busca a certificação, recomendo dar uma boa estudada e treinar bastante, pois cai muita coisa que as vezes não mexemos no dia-a-dia. Algumas pegadinhas que pode nos deixar na dúvida entre uma resposta e outra!</p>
<p>Para estudar, acabei optando em fazer 3 cursos oficiais na Brás &amp; Figueiredo que dão base para a certificação e estudei o livro do exame &#8220;<a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=1414525&amp;sid=89181068111314685162451525&amp;k5=19F85E88&amp;uid=" target="_blank">MCTS SELF-PACED TRAINING KIT EXAM 70-528</a>&#8220;, esse livro é muito bom e ainda vem com um CD com os simulados da prova e um voucher de 15%, vale a pena o investimento!</p>
<p>Assuntos que caem bastante na prova:</p>
<p>- XML<br />
- ADO.NET<br />
- Deployment (Copy Website, Publish, aspnet_compiler.exe)<br />
- Configuration<br />
- Security (Membership)<br />
- Custom Controls (WebControl, TemplateControl, CompositeControl, UserControl)<br />
- Mobile</p>
<p>Próximos exames que irei prestar:<br />
70-536<br />
70-547</p>
<p>Espero que possa ajudar quem estiver começando os estudos e boa sorte a quem for fazer a prova!</p>
<p>Abs&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/04/11/certificacao-em-busca-do-mcpd-web-developer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WCF: KnownTypeAttribute e ServiceKnownTypeAttribute</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/04/08/wcf-knowntypeattribute-e-serviceknowntypeattribute/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/04/08/wcf-knowntypeattribute-e-serviceknowntypeattribute/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 11:09:25 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[KnownTypeAttribute]]></category>
		<category><![CDATA[ServiceKnownTypeAttribute]]></category>
		<category><![CDATA[Windows Communication Foundation]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=353</guid>
		<description><![CDATA[Bom, estou iniciando meus estudos em WCF e me deparei com um problema que ao passar uma lista de objetos (List&#60;object&#62;) para um método de um serviço criado e não tipá-los, o WCF muitas vezes não consegue reconhecer o tipo que está dentro dele e retorna a seguinte exception: Type 'SeuNamespace.SuaClasse' with data contract name... [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, estou iniciando meus estudos em WCF e me deparei com um problema que ao passar uma lista de objetos (List&lt;object&gt;) para um método de um serviço criado e não tipá-los, o WCF muitas vezes não consegue reconhecer o tipo que está dentro dele e retorna a seguinte exception:</p>
<pre>Type 'SeuNamespace.SuaClasse' with data contract name... is not expected.
Add any types not known statically to the list of known types - for example,
by using the KnownTypeAttribute attribute or by adding them to the list of known
types passed to DataContractSerializer.</pre>
<p>Para resolver esse problema tive que fazer uso dos atributos <a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.knowntypeattribute.aspx" target="_blank">KnownTypeAttribute</a> e <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute.aspx" target="_blank">ServiceKnownTypeAttribute</a>.</p>
<p>Espero que possa ajudá-los&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/04/08/wcf-knowntypeattribute-e-serviceknowntypeattribute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Útil: Gerador de SQL com Parameters</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/26/util-gerador-de-sql-com-parameters/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/26/util-gerador-de-sql-com-parameters/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 01:07:32 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DbConnection]]></category>
		<category><![CDATA[DbParameter]]></category>
		<category><![CDATA[DbTransaction]]></category>
		<category><![CDATA[SqlConnection]]></category>
		<category><![CDATA[SqlParameter]]></category>
		<category><![CDATA[SqlTransaction]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=197</guid>
		<description><![CDATA[Desde que iniciei em .NET sempre vejo artigos falando sobre as vantagens de Parameters (SqlParameter, DbParameter, etc), porém, vejo que muitos desenvolvedores por algum motivo não os usam. Criei uma classe simples, porém, bem funcional que me gera um SELECT já com parâmetros (Parameters). Eu acabei criando 2 enums para melhorar a manipulação na classe: [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que iniciei em .NET sempre vejo artigos falando sobre as vantagens de Parameters (SqlParameter, DbParameter, etc), porém, vejo que muitos desenvolvedores por algum motivo não os usam. Criei uma classe simples, porém, bem funcional que me gera um SELECT já com parâmetros (Parameters).</p>
<p>Eu acabei criando 2 enums para melhorar a manipulação na classe:</p>
<p><strong>Comparador:</strong></p>
<pre class="brush:csharp;">public enum Comparador
{
	///
	/// Like
	///
	Contem,
	///
	/// NotLike
	///
	NaoContem,
	///
	/// StartsWith
	///
	IniciaCom,
	///
	/// NotStartsWith
	///
	NaoIniciaCom,
	///
	/// Equals
	///
	Igual,
	///
	/// NotEquals
	///
	Diferente,
	///
	/// Between
	///
	Entre,
	///
	/// NotBetween
	///
	NaoEntre,
	///
	/// GreaterOrEquals
	///
	MaiorOuIgual,
	///
	/// LessOrEquals
	///
	MenorOuIgual,
	///
	/// GreaterThan
	///
	Maior,
	///
	/// LessThan
	///
	Menor,
	///
	/// In
	///
	DentroDoIntervalo,
	///
	/// NotIn
	///
	ForaDoIntervalo
}</pre>
<p><strong>Operador:</strong></p>
<pre class="brush:csharp;">public enum Operador
{
	Nenhum,
	And,
	Or
}</pre>
<p><strong>SqlBuilder, classe que gerará os Selects com os parameters:</strong></p>
<pre class="brush:csharp;">using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Text;
using System.Data.SqlClient;

public class SqlBuilder
{
	#region [ +Campos privados ]

	private StringBuilder _sqlString;
	private List&lt;SqlParameter&gt; _parametros;
	private const string _nomeParametro = "@Param{0}";
	private bool _possuiWhere = false;

	#endregion

	#region [ +Construtores ]

	public SqlBuilder()
	{
		_parametros = new List&lt;SqlParameter&gt;();
		_sqlString = new StringBuilder();
	}

	public SqlBuilder(string sql) :
		this()
	{
		_sqlString.Append(sql);
	}

	#endregion

	#region [ +Métodos privados ]

	#region [ GerarCondicao ]

	private string GerarCondicao(bool possuiParametro, string nomeCampo, Operador operador, Comparador comparador, string nomeParametro1, string nomeParametro2)
	{
		string operadorConsulta = operador.ToString();

		if (!possuiParametro)
			operadorConsulta = string.Empty;

		StringBuilder sbValor = new StringBuilder();

		if (comparador == Comparador.Contem)
			sbValor.AppendFormat(" {0} {1} LIKE {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.NaoContem)
			sbValor.AppendFormat(" {0} {1} NOT LIKE {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.DentroDoIntervalo)
			sbValor.AppendFormat(" {0} {1} IN ({2}) ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.ForaDoIntervalo)
			sbValor.AppendFormat(" {0} {1} NOT IN ({2}) ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.Diferente)
			sbValor.AppendFormat(" {0} {1} != {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.Igual)
			sbValor.AppendFormat(" {0} {1} = {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.Entre)
			sbValor.AppendFormat(" {0} {1} BETWEEN {2} AND {3} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1, nomeParametro2);

		else if (comparador == Comparador.NaoEntre)
			sbValor.AppendFormat(" {0} {1} NOT BETWEEN {2} AND {3} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1, nomeParametro2);

		else if (comparador == Comparador.IniciaCom)
			sbValor.AppendFormat(" {0} {1} LIKE {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.NaoIniciaCom)
			sbValor.AppendFormat(" {0} {1} NOT LIKE {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.Maior)
			sbValor.AppendFormat(" {0} {1} > {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.MaiorOuIgual)
			sbValor.AppendFormat(" {0} {1} >= {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.Menor)
			sbValor.AppendFormat(" {0} {1} < {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.MenorOuIgual)
			sbValor.AppendFormat(" {0} {1} <= {2} ", operadorConsulta.ToUpper(), nomeCampo, nomeParametro1);

		else if (comparador == Comparador.ENulo)
			sbValor.AppendFormat(" {0} {1} IS NULL ", operadorConsulta.ToUpper(), nomeCampo);

		else if (comparador == Comparador.NaoNulo)
			sbValor.AppendFormat(" {0} {1} IS NOT NULL ", operadorConsulta.ToUpper(), nomeCampo);

		possuiParametro = true;
		return sbValor.ToString();
	}

	#endregion

	#region [ FormatarValorCondicao ]

	private object FormatarValorCondicao(object valor, Comparador comparador)
	{
		if (comparador == Comparador.Contem || comparador == Comparador.NaoContem)
			return string.Format("%{0}%", valor);
		else if (comparador == Comparador.IniciaCom || comparador == Comparador.NaoIniciaCom)
			return string.Format("{0}%", valor);
		else
			return valor;
	}

	#endregion

	#endregion

	#region [ +Métodos públicos ]

	#region [ Append ]
	public void Append(string sql)
	{
		_sqlString.Append(sql);
	}
	#endregion

	#region [ AppendFormat ]
	public void AppendFormat(string sql, params object[] parametros)
	{
		_sqlString.AppendFormat(sql, parametros);
	}
	#endregion

	#region [ AppendParameter ]

	public void AppendParameter(string sql, string nomeParametro, object valor)
	{
		if (_parametros == null)
			_parametros = new List&lt;SqlParameter&gt;();

		_sqlString.Append(sql);
		_parametros.Add(new SqlParameter(nomeParametro, valor));
	}

	#endregion

	#region [ InserirParametro ]

	public void InserirParametro(string nomeCampo, Comparador comparador, object valor)
	{
		this.InserirParametro(nomeCampo, Operador.And, comparador, valor, null);
	}

	#endregion

	#region [ InserirParametro ]

	public void InserirParametro(string nomeCampo, Operador operador, Comparador comparador, object valor)
	{
		this.InserirParametro(nomeCampo, operador, comparador, valor, null);
	}

	#endregion

	#region [ InserirParametro ]

	public void InserirParametro(string nomeCampo, Operador operador, Comparador comparador, object valor, object valor2)
	{
		if (!_possuiWhere)
			this.Where();

		string nomeParametro = string.Format(_nomeParametro, _parametros.Count);
		string nomeParametro2 = string.Format(_nomeParametro, _parametros.Count + 1);

		if (comparador != Comparador.NaoNulo &#038;&#038; comparador != Comparador.ENulo)
			_parametros.Add(new SqlParameter(nomeParametro, FormatarValorCondicao(valor, comparador)));

		if (comparador == Comparador.Entre || comparador == Comparador.NaoEntre)
			_parametros.Add(new SqlParameter(nomeParametro2, FormatarValorCondicao(valor2, comparador)));

		_sqlString.Append(GerarCondicao((_parametros.Count > 1 || (_parametros.Count > 0 &#038;&#038; (comparador == Comparador.ENulo || comparador == Comparador.NaoNulo))), nomeCampo, operador, comparador, nomeParametro, nomeParametro2));
	}

	#endregion

	#region [ Where ]

	public void Where()
	{
		_possuiWhere = true;

		this._sqlString.Append(" WHERE ");
	}

	#endregion

	#region [ ToCommand ]

	public SqlCommand ToCommand()
	{
		SqlCommand cmd = new SqlCommand(_sqlString.ToString());

		foreach (SqlParameter prm in _parametros)
			cmd.Parameters.Add(prm);

		return cmd;
	}

	#endregion

	#endregion
}</pre>
<p>Veja como é simples usá-la:</p>
<pre class="brush:csharp;">
SqlBuilder sbSql = new SqlBuilder();
sbSql.Append("SELECT * FROM T_Clientes ");
sbSql.InserirParametro("CodigoCliente", Comparador.Igual, "1");

SqlCommand cmd = sbSql.ToCommand();
</pre>
<p>Como podem ver é uma classe bem simples, porém, nos ajuda bastante na hora de criar Queries no banco de dados.</p>
<p>Espero que possa ajudar..</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/26/util-gerador-de-sql-com-parameters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Patterns: Abstract Factory</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/24/design-patterns-abstract-factory/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/24/design-patterns-abstract-factory/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 20:23:54 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Abstract Factory]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Padrão de Projetos]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=288</guid>
		<description><![CDATA[Nesse post vou mostrar na prática como é o Padrão de Projeto (Design Pattern) &#8216;Abstract Factory&#8216;. Normalmente quando vamos procurar alguma coisa sobre como implementar algum Design Pattern, os exemplos são sempre básicos e normalmente não vejo tanta aplicabilidade do mesmo, mas vou procurar ser mais objetivo e mostrar realmente como poderia ser implementado esse [...]]]></description>
			<content:encoded><![CDATA[<p>Nesse post vou mostrar na prática como é o <strong>Padrão de Projeto</strong> (<strong>Design Pattern</strong>) &#8216;<strong><a href="http://pt.wikipedia.org/wiki/Abstract_Factory">Abstract Factory</a></strong>&#8216;.</p>
<p>Normalmente quando vamos procurar alguma coisa sobre como implementar algum Design Pattern, os exemplos são sempre básicos e normalmente não vejo tanta aplicabilidade do mesmo, mas vou procurar ser mais objetivo e mostrar realmente como poderia ser implementado esse padrão.</p>
<p>Imagine o seguinte cenário: Você está definindo a arquitetura de uma aplicação e uma das premissas é que o sistema terá uma chave na configuração que determinará se ele irá acessar SQL Server ou Oracle. Como você montaria isso?</p>
<p>O conceito de <strong>Abstract Factory</strong> torna isso um pouco mais simples para nós. Veja como ficaria um exemplo da estrutura de classes:</p>
<p style="text-align: center;">
<p><a href="http://blog.caixaazul.com/wp-content/uploads/2009/02/estrutura.jpg" target="_blank"><img class="aligncenter size-medium wp-image-303" title="estrutura" src="http://blog.caixaazul.com/wp-content/uploads/2009/02/estrutura-300x88.jpg" alt="estrutura" width="300" height="88" /></a></p>
<p style="text-align: left;">Como você pode ver, existirão 2 classes com o mesmo nome, em Assemblies diferentes, nada impede de você criar outros providers e aumentar as possibilidades, por exemplo de: MySql, Postgree, etc. Mas ai vem a pergunta, como irei saber qual instanciar? Existirá uma classe que irá efetuar o papel de instanciar (Via reflection) qual o provider que está configurado (chave no web.config), que nesse caso eu chamei de <strong>FactoryResolver</strong>.</p>
<p style="text-align: left;">Veja abaixo como ficaria um exemplo instanciando os 2 providers:</p>
<pre class="brush: csharp;">using System.Web.UI.WebControls;
using DesignPatterns.Factory.DAL;
using DesignPatterns.Factory.Common;
using DesignPatterns.Factory.Entities;

namespace DesignPatterns.Factory.Web
{
	public partial class _Default : System.Web.UI.Page
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			ProductFactory productFactorySqlServer =
				FactoryResolver.CreateInstance&lt;ProductFactory&gt;("DesignPatterns.Factory.DAL.SqlServer");
			ProductFactory productFactoryOracle =
					FactoryResolver.CreateInstance&lt;ProductFactory&gt;("DesignPatterns.Factory.DAL.Oracle");

			List&lt;Product&gt; productListSqlServer = productFactorySqlServer.FindAll();
			List&lt;Product&gt; productListOracle = productFactoryOracle.FindAll();

			// preenche os grids com as listas de produtos retornados...
			gridSql.DataSource = productListSqlServer;
			gridSql.DataBind();

			gridOracle.DataSource = productListOracle;
			gridOracle.DataBind();
		}
	}
}</pre>
<p>Criei um exemplo simples para demonstrar como funciona. Nada melhor do que ver funcionando, não é mesmo? :-p</p>
<p>O exemplo não está 100% implementado, criei apenas para demonstrar como ficaria genérico o acesso a dados da sua aplicação sem você necessariamente conhecer o que está implementado por trás de tudo. Com o tempo vou criando mais exemplos e aperfeiçoando esse.</p>
<p><a href="http://blog.caixaazul.com/wp-content/uploads/2009/02/designpatternsfactory.zip" target="_blank">Clique aqui</a> para baixar a solução com o exemplo.</p>
<p>Até a próxima&#8230;</p>
<p>PS: Essa foi uma das maneiras que eu implementei esse padrão, claro que existem outras maneiras, invente a sua.. :-p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/24/design-patterns-abstract-factory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compactando (Zipando) um Stream sem salvar em disco</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/20/compactando-zipando-um-stream-sem-salvar-em-disco/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/20/compactando-zipando-um-stream-sem-salvar-em-disco/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 11:44:42 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[FileUpload]]></category>
		<category><![CDATA[GZip]]></category>
		<category><![CDATA[MemoryStream]]></category>
		<category><![CDATA[Stream]]></category>
		<category><![CDATA[Zip]]></category>
		<category><![CDATA[Zipando bytes]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=283</guid>
		<description><![CDATA[Fiz uma classe esses dias para poder compactar o Stream de um arquivo enviado pelo FileUpload e já poder gravar em banco de dados o binário e sem a necessidade de gravar o arquivo em disco. Espero que possa ajudar alguém que um dia precise passar por isso! :-p using System.IO; using System.IO.Compression; public class [...]]]></description>
			<content:encoded><![CDATA[<p>Fiz uma classe esses dias para poder compactar o Stream de um arquivo enviado pelo FileUpload e já poder gravar em banco de dados o binário e sem a necessidade de gravar o arquivo em disco. Espero que possa ajudar alguém que um dia precise passar por isso! :-p</p>
<pre class="brush: csharp;">
using System.IO;
using System.IO.Compression;

public class ZipStream
{
	public ZipStream()
	{ }

	#region [ CompactarStream ]
	public static byte[] CompactarStream(Stream stream)
	{
		int intDocLen = (int)stream.Length;

		byte[] docBuffer = new byte[intDocLen];
		byte[] compressedBuffer;

		Stream objStream = stream;
		objStream.Read(docBuffer, 0, intDocLen);

		using (MemoryStream objMemory = new MemoryStream())
		{
			using (GZipStream gzip = new GZipStream(objMemory, CompressionMode.Compress))
			{
				gzip.Write(docBuffer, 0, docBuffer.Length);
				gzip.Close();
			}

			compressedBuffer = objMemory.ToArray();

			objMemory.Close();
		}

		return compressedBuffer;
	}
	#endregion

	#region [ DescompactarBytes ]
	public static byte[] DescompactarBytes(byte[] bytes)
	{
		MemoryStream ms = new MemoryStream();

		ms.Write(bytes, 0, bytes.Length);
		ms.Position = 0;

		GZipStream stream = new GZipStream(ms, CompressionMode.Decompress);
		MemoryStream temp = new MemoryStream();

		byte[] buffer = new byte[(int)bytes.Length];
		while (true)
		{
			int read = stream.Read(buffer, 0, buffer.Length);
			if (read <= 0)
				break;
			else
				temp.Write(buffer, 0, buffer.Length);
		}

		stream.Close();
		return temp.ToArray();
	}
	#endregion
}
</pre>
<p>Para utilizar a classe basta fazer como no exemplo abaixo:</p>
<pre class="brush: csharp;">
byte[] compactado = ZipStream.CompactarStream(FileUpload1.PostedFile.InputStream);
byte[] descompactado = ZipStream.DescompactarBytes(compactado);
</pre>
<p>Até a próxima...</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/20/compactando-zipando-um-stream-sem-salvar-em-disco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Paginação no SQL Server 2005</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/10/dica-paginacao-no-sql-server-2005/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/10/dica-paginacao-no-sql-server-2005/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 23:54:18 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Paginação]]></category>
		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=278</guid>
		<description><![CDATA[Implementei um método simples que me retorna um DataReader paginado diretamente do banco SQL Server 2005. public virtual DbDataReader BuscarPaginacao(DbCommand cmd, string orderBy, int quantidePorPagina, int pagina) { int inicio = 0; int fim = quantidePorPagina; if (pagina > 1) { fim = (quantidePorPagina * pagina); inicio = fim - quantidePorPagina; } StringBuilder sbSqlPaginado = [...]]]></description>
			<content:encoded><![CDATA[<p>Implementei um método simples que me retorna um DataReader paginado diretamente do banco SQL Server 2005.</p>
<pre class="brush: csharp;">
public virtual DbDataReader BuscarPaginacao(DbCommand cmd, string orderBy,
								int quantidePorPagina, int pagina)
{
	int inicio = 0;
	int fim = quantidePorPagina;

	if (pagina > 1)
	{
		fim = (quantidePorPagina * pagina);
		inicio = fim - quantidePorPagina;
	}

	StringBuilder sbSqlPaginado = new StringBuilder();
	sbSqlPaginado.Append("WITH BuscaPaginada AS ( ");
	sbSqlPaginado.Append(cmd.CommandText);
	sbSqlPaginado.Append(") ");
	sbSqlPaginado.AppendFormat("SELECT TOP {0} * ", quantidePorPagina);
	sbSqlPaginado.Append("FROM (SELECT ROW_NUMBER() ");
	sbSqlPaginado.AppendFormat(" OVER (ORDER BY {0}) AS Linha ", orderBy);
	sbSqlPaginado.Append(", (SELECT COUNT(*) FROM BuscaPaginada) ");
	sbSqlPaginado.Append(" AS TotalRegistros ");
	sbSqlPaginado.Append(", * FROM BuscaPaginada) AS BuscaPaginada ");
	sbSqlPaginado.AppendFormat("WHERE Linha > {0} AND Linha <= {1} ", inicio, fim);

	cmd.CommandText = sbSqlPaginado.ToString();

	return cmd.ExecuteReader();
}
</pre>
<p>Fica ai mais uma dica simples, porém, muito útil!</p>
<p>Até a próxima...</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/10/dica-paginacao-no-sql-server-2005/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Viewstate em Session</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/09/viewstate-em-session/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/09/viewstate-em-session/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 00:00:42 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[GZip]]></category>
		<category><![CDATA[MemoryStream]]></category>
		<category><![CDATA[Serialize]]></category>
		<category><![CDATA[Session]]></category>
		<category><![CDATA[System.Web.UI.LosFormatter]]></category>
		<category><![CDATA[ViewState]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=260</guid>
		<description><![CDATA[Uma vez em um projeto que não teria tantos acessos simultâneos, porém, o tamanho da página era enorme (poderia chegar a mais de 1MB), precisávamos do Viewstate ativado para facilitar por causa da complexidade da página. Como não haveriam tantos acessos simultâneos comecei a procurar alternativas de manter o Viewstate ativado, porém, não gostaria que [...]]]></description>
			<content:encoded><![CDATA[<p>Uma vez em um projeto que não teria tantos acessos simultâneos, porém, o tamanho da página era enorme (poderia chegar a mais de 1MB), precisávamos do Viewstate ativado para facilitar por causa da complexidade da página.</p>
<p>Como não haveriam tantos acessos simultâneos comecei a procurar alternativas de manter o Viewstate ativado, porém, não gostaria que fosse enviado aquele monte de HTML gerado no hidden <strong>__VIEWSTATE</strong> para o cliente, diminuindo assim o peso da mesma, pois como comentei a página estava muito pesada por ser um tanto quanto complexa e continha muitos controles e user controls.</p>
<p>Daí, encontrei uma opção que consistia em salvar o viewstate em memória.</p>
<p><strong>Veja como seria um exemplo:</strong></p>
<pre class="brush: csharp;">public partial class PaginaSemViewStateNoHtml : Page
{
	System.IO.StringWriter stringWriter = null;
	System.Web.UI.LosFormatter los = null;
	System.Collections.Hashtable hst = null;
	string nomePagina = null;

	protected override void SavePageStateToPersistenceMedium(object state)
	{
		this.nomePagina = Page.ToString();

		this.stringWriter = new System.IO.StringWriter();
		this.los = new System.Web.UI.LosFormatter();

		//Serializa o ViewState e armazena num StringWriter
		//que depois será salvo na Session
		this.los.Serialize(this.stringWriter, state);

		//Caso seja a primeira execução, instancia o
		//HashTable, armazena o ViewState serializado no
		//Hashtable e salva na Session
		if (Session["vw_state"] == null)
		{
			this.hst = new System.Collections.Hashtable();
			this.hst.Add(this.nomePagina,
			  this.stringWriter.ToString());
			Session["vw_state"] = this.hst;
		}
		else
		{
			//Caso já tenha salvo o Hashtable na Session,
			//retorna o Hashtable e verifica se o ViewState
			//da página já foi salvo, caso tenha sido,
			//substitui pelo valor atualizado
			this.hst = (System.Collections.Hashtable)Session["vw_state"];

			if (this.hst != null)
			{
				if (this.hst.ContainsKey(this.nomePagina))
				{
					this.hst[this.nomePagina] =
					  this.stringWriter.ToString();
				}
				else
				{
					this.hst.Add(this.nomePagina,
					  this.stringWriter.ToString());
				}
			}
			else
			{
				throw new Exception("Não foi possível obter o ViewState");
			}
		}

		//Destrói os objetos
		if (this.stringWriter != null)
		{
			this.stringWriter.Close();
			this.stringWriter.Dispose();
			this.stringWriter = null;
		}

		this.los = null;
		this.hst = null;
	}

	protected override object LoadPageStateFromPersistenceMedium()
	{
		this.nomePagina = Page.ToString();
		object viewState = null;

		//Obtém o Hashtable que foi armazenado na Session,
		//caso não consiga, gera uma excessão
		if (Session["vw_state"] != null)
		{
			this.hst = (System.Collections.Hashtable)Session["vw_state"];

			if (this.hst != null)
			{
				this.los = new System.Web.UI.LosFormatter();
				viewState = this.los.Deserialize(this.hst[this.nomePagina].ToString());
			}
			else
				throw new Exception("Não foi possível deserializar o ViewState");
		}
		else
			throw new Exception("Não foi possível obter o ViewState armazenado na sessão");

		return viewState;
	}
}</pre>
<p>
<strong>Veja um print screen de uma tela simples com um GridView buscando os dados no banco:</strong></p>
<div id="attachment_267" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.caixaazul.com/wp-content/uploads/2009/02/exemplo_sem_session.jpg" target="_blank"><img class="size-medium wp-image-267" title="Exemplo sem session" src="http://blog.caixaazul.com/wp-content/uploads/2009/02/exemplo_sem_session-300x187.jpg" alt="Exemplo sem session" width="300" height="187" /></a><p class="wp-caption-text">Exemplo sem session</p></div>
<p><strong>Agora veja o resultado usando a Session:</strong></p>
<div id="attachment_268" class="wp-caption alignnone" style="width: 310px"><a target="_blank" href="http://blog.caixaazul.com/wp-content/uploads/2009/02/exemplo_com_session.jpg"><img class="size-medium wp-image-268" title="Exemplo com Session" src="http://blog.caixaazul.com/wp-content/uploads/2009/02/exemplo_com_session-300x187.jpg" alt="Exemplo com Session" width="300" height="187" /></a><p class="wp-caption-text">Exemplo com Session</p></div>
<p>Espero que possa ajudar&#8230; como me ajudou muito nessa situação que passei.. rs.. :-p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/09/viewstate-em-session/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Extensões &#8211; .NET Framework 3.5</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/01/extensoes-net-framework-35/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/01/extensoes-net-framework-35/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 21:38:15 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[Extensões]]></category>
		<category><![CDATA[Extensions]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=254</guid>
		<description><![CDATA[Extensões como o nome próprio já diz, são implementações que você poderá fazer em uma classe já existente para extendê-la. Como funciona? Vamos imaginar que você gostaria que todas as variáveis do tipo DECIMAL tivessem um método que convertesse automanticamente para você para formato Moeda, exemplo: decimal valor = 250.00; string valorFormatoMoeda = valor.ToMoeda(); //Resultado [...]]]></description>
			<content:encoded><![CDATA[<p>Extensões como o nome próprio já diz, são implementações que você poderá fazer em uma classe já existente para extendê-la. Como funciona?</p>
<p>Vamos imaginar que você gostaria que todas as variáveis do tipo <strong>DECIMAL</strong> tivessem um método que convertesse automanticamente para você para formato Moeda, exemplo:</p>
<pre class="brush: csharp;">
decimal valor = 250.00;

string valorFormatoMoeda = valor.ToMoeda();
//Resultado seria: R$ 250,00
</pre>
<p><strong>Como faríamos isso? Simples, basta criar uma classe estática como no exemplo abaixo:</strong></p>
<pre class="brush: csharp;">
public static class Extensoes
{
	/// &lt;summary&gt;
	/// Retorna uma string de um valor Decimal em formato de Moeda.
	/// Exemplo: 20.00 = R$ 20,00
	/// &lt;/summary&gt;
	/// &lt;param name="valor"&gt;&lt;/param&gt;
	/// &lt;returns&gt;&lt;/returns&gt;
	public static string ToMoeda(this decimal valor)
	{
		return valor.ToString("C2");
	}
}
</pre>
<p>Reparem que o método também deverá ser estático (static) e no método existe um &#8220;parâmetro&#8221; <strong>this</strong>, que ao compilar e você for utilizar esse método, o .NET se encarregará de passar como parâmetro o objeto que você estiver manipulando naquele momento. </p>
<p>Você poderá definir várias extensões para classes já existentes dando mais flexibilidade e facilidade no desenvolvimento, lembrando que você também poderá passar parâmetros para esses métodos de extensão. Basta usar a imaginação&#8230;</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/02/01/extensoes-net-framework-35/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Controles para gerar Gráficos &#8211; Chart Controls .NET</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/31/dica-controles-para-gera-graficos-chart-controls-net/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/31/dica-controles-para-gera-graficos-chart-controls-net/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 09:09:15 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows Application]]></category>
		<category><![CDATA[Chart Controls]]></category>
		<category><![CDATA[Componentes]]></category>
		<category><![CDATA[Gráficos]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=242</guid>
		<description><![CDATA[A Microsoft lançou recentemente um componente ótimo para gerar Gráficos e ser utilizado com ASP.NET e Windows Application. E o melhor de tudo é que é gratuíto. Segue o link abaixo para mais informações: http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx Links relacionados: Download the free Microsoft Chart Controls Download the VS 2008 Tool Support for the Chart Controls Download the [...]]]></description>
			<content:encoded><![CDATA[<p>A Microsoft lançou recentemente um componente ótimo para gerar Gráficos e ser utilizado com ASP.NET e Windows Application. E o melhor de tudo é que é gratuíto.</p>
<p>Segue o link abaixo para mais informações:</p>
<p><a href="http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx" target="_blank">http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx</a></p>
<p><strong>Links relacionados:</strong></p>
<ul>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&amp;DisplayLang=en" target="_blank">Download the free Microsoft Chart Controls</a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=1D69CE13-E1E5-4315-825C-F14D33A303E9&amp;displaylang=en" target="_blank">Download the VS 2008 Tool Support for the Chart Controls</a></li>
<li><a href="http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=1591" target="_blank">Download the Microsoft Chart Controls Samples</a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=EE8F6F35-B087-4324-9DBA-6DD5E844FD9F&amp;displaylang=en" target="_blank">Download the Microsoft Chart Controls Documentation</a></li>
<li><a href="http://social.msdn.microsoft.com/Forums/en-US/MSWinWebChart/threads/" target="_blank">Visit the Microsoft Chart Control Forum</a></li>
<li><a href="http://blogs.msdn.com/alexgor/" target="_blank">Blog referente ao componente</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/31/dica-controles-para-gera-graficos-chart-controls-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Componente para reescrever a URL &#8211; UrlRewrite</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/27/componente-para-reescrever-a-url-urlrewrite/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/27/componente-para-reescrever-a-url-urlrewrite/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 20:25:08 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Search Engine Optimization]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[UrlRewrite]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=234</guid>
		<description><![CDATA[Existe um componente em .NET muito bom para fazer esse tipo de trabalho e o melhor: FREE! Chama-se UrlRewritingNet.UrlRewrite. Esse componente é bem simples de ser utilizado, basta seguir os exemplos da documentação que ele disponibiliza e você também pode baixar um site de exemplo usando o mesmo. Para que serve isso? Reescrever a url [...]]]></description>
			<content:encoded><![CDATA[<p>Existe um componente em .NET muito bom para fazer esse tipo de trabalho e o melhor: FREE!</p>
<p>Chama-se <strong><a href="http://www.urlrewriting.net/149/en/home.html">UrlRewritingNet.UrlRewrite</a></strong>. Esse componente é bem simples de ser utilizado, basta seguir os exemplos da documentação que ele disponibiliza e você também pode baixar um site de exemplo usando o mesmo.</p>
<p><strong><br />
Para que serve isso?</strong></p>
<p>Reescrever a url é utilizado para você poder melhorar a posição de suas URLs nos buscadores. Pois o Google, Yahoo, Live Search (Microsoft) e qualquer outro buscador varrem a internet em busca de informações e se durante uma busca sua URL for relevante, ela irá aparecer entre as primeiras. Esse é uma técnica muito utilizado em <a href="http://www.marketingdebusca.com/artigo/seo-search-engine-optimization/">SEO</a> (Search Engine Optimization).</p>
<p>Fica ai a dica para quem precisar um dia efetuar esse tipo de trabalho com as URLs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/27/componente-para-reescrever-a-url-urlrewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando Profile em um Web Application Project</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/25/usando-profile-em-um-web-application-project/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/25/usando-profile-em-um-web-application-project/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 00:41:40 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Profile]]></category>
		<category><![CDATA[ProfileBase]]></category>
		<category><![CDATA[ProfileCommon]]></category>
		<category><![CDATA[Web Application Project]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=218</guid>
		<description><![CDATA[Brincando com uns projetos da minha máquina, migrei um Website esses dias para Web Application Project e no mesmo eu uso o recurso de Profile para armazenar alguns dados. Ao finalizar a migração e tentar compilar a solução, o Visual Studio listou muitos erros por causa que o objeto Profile que é gerado dinamicamente (buildProviders) [...]]]></description>
			<content:encoded><![CDATA[<p>Brincando com uns projetos da minha máquina, migrei um Website esses dias para <a href="http://webproject.scottgu.com/" target="_blank">Web Application Project</a> e no mesmo eu uso o recurso de Profile para armazenar alguns dados.</p>
<p>Ao finalizar a migração e tentar compilar a solução, o Visual Studio listou muitos erros por causa que o objeto Profile que é gerado dinamicamente (<a href="http://weblogs.asp.net/scottgu/archive/2005/09/02/424337.aspx" target="_blank">buildProviders</a>) em tempo de execução não é suportado em Web Application Project (até no Visual Studio 2008 isso ficou de fora <img src='http://blog.carlosalessandroribeiro.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  ), e para resolver esse meu problema fiz uma classe simples para expor as propriedades que eu necessitava e &#8220;arrumar&#8221; os erros de compilação.</p>
<p><strong>Classe Profile:</strong></p>
<pre class="brush: csharp;">public class Profile
{
	protected ProfileBase objProfile = null;

	public Profile()
	{
		objProfile = ProfileBase.Create(HttpContext.Current.Profile.UserName, HttpContext.Current.User.Identity.IsAuthenticated);
	}

	public Profile(string userName)
	{
		objProfile = ProfileBase.Create(userName);
	}

	public string Nome
	{
		get
		{
			if (objProfile.GetPropertyValue("Nome") != null)
				return objProfile.GetPropertyValue("Nome").ToString();
			else
				return string.Empty;
		}

		set
		{
			objProfile.SetPropertyValue("Nome", value);
			objProfile.Save();
		}
	}

	public int CodigoIdioma
	{
		get
		{
			if (objProfile.GetPropertyValue("CodigoIdioma") != null)
				return objProfile.GetPropertyValue("CodigoIdioma").ToInt();
			else
				return 1;
		}

		set
		{
			objProfile.SetPropertyValue("CodigoIdioma", value);
			objProfile.Save();
		}
	}

	public void SetUserName(string userName)
	{
		objProfile = ProfileBase.Create(userName);
	}
}</pre>
<p>Quem precisar disso um dia, fica ai a dica!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/25/usando-profile-em-um-web-application-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Útil: Método para formatar strings</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/14/util-metodo-para-formatar-strings/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/14/util-metodo-para-formatar-strings/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 20:39:40 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[formatar string]]></category>
		<category><![CDATA[máscara]]></category>
		<category><![CDATA[string format]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=193</guid>
		<description><![CDATA[Faz muito tempo que encontrei esse método na internet (google) no qual me ajudou muito. Ele serve para formatar valores, uso muito ele para formatar Telefone, CPF, CNPJ, etc&#8230; Código do método: public static string Formatar(string valor, string mascara) { StringBuilder dado = new StringBuilder(); // remove caracteres nao numericos foreach (char c in valor) [...]]]></description>
			<content:encoded><![CDATA[<p>Faz muito tempo que encontrei esse método na internet (google) no qual me ajudou muito. Ele serve para formatar valores, uso muito ele para formatar Telefone, CPF, CNPJ, etc&#8230;</p>
<p><strong>Código do método:</strong></p>
<pre class="brush: csharp;">public static string Formatar(string valor, string mascara)
{
	StringBuilder dado = new StringBuilder();
	// remove caracteres nao numericos
	foreach (char c in valor)
	{
		if (Char.IsNumber(c))
			dado.Append(c);
	}

	int indMascara = mascara.Length;
	int indCampo = dado.Length;

	for (; indCampo &gt; 0 &amp;&amp; indMascara &gt; 0; )
	{
		if (mascara[--indMascara] == '#')
			indCampo--;
	}

	StringBuilder saida = new StringBuilder();
	for (; indMascara &lt; mascara.Length; indMascara++)
		saida.Append((mascara[indMascara] == '#') ? dado[indCampo++] : mascara[indMascara]);

	return saida.ToString();
}</pre>
<p><strong>Exemplo de como utilizá-lo:</strong></p>
<pre class="brush: csharp;">string cpf = Formatar("12345678900", "###.###.###-##");</pre>
<p>Espero que possa ajudar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/14/util-metodo-para-formatar-strings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Organização de código</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/13/organizacao-de-codigo/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/13/organizacao-de-codigo/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 22:14:54 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[#region]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=169</guid>
		<description><![CDATA[Quando iniciamos na vida de programador não nos preocupamos muito na forma como programamos e se alguém vai entender o nosso código, porém, já me ferrei muito dando manutenção em código &#8220;sujo&#8221;, sem a preocupação de organizá-lo. Nos projetos em que desenvolvo peguei uma mania de aplicar REGIONs em tudo que é bloco de código [...]]]></description>
			<content:encoded><![CDATA[<p>Quando iniciamos na vida de programador não nos preocupamos muito na forma como programamos e se alguém vai entender o nosso código, porém, já me ferrei muito dando manutenção em código &#8220;sujo&#8221;, sem a preocupação de organizá-lo.</p>
<p>Nos projetos em que desenvolvo peguei uma mania de aplicar REGIONs em tudo que é bloco de código acima de 10 linhas, métodos, propriedades, campos privados, etc, ou seja, ao invés de apenas utilizar os comentários para informar qual é a idéia de um determinado trecho, eu aplico uma REGION para agrupar o bloco para que quem for dar manutenção entender o que está acontecendo sem precisar dar vários SCROLLs na tela para ler o resto.</p>
<p>Veja um exemplo de uma classe sem #region:</p>
<pre class="brush: csharp;">public class Cliente
{
	public Cliente()
	{}

	public Cliente(string nome, string cpf, string endereco, string telefone)
	{
		_nome = nome;
		_cpf = cpf;
		_endereco = endereco;
		_telefone = telefone;
	}

	private string _nome;
	private string _cpf;
	private string _endereco;
	private string _telefone;

	public string Nome
	{
		get { return _nome; }
		set { _nome = value; }
	}

	public string CPF
	{
		get { return _cpf; }
		set { _cpf = value; }
	}

	public string Endereco
	{
		get { return _endereco; }
		set { _endereco = value; }
	}

	public string Telefone
	{
		get { return _telefone; }
		set { _telefone = value; }
	}
}</pre>
<p>Agora veja como fica mais organizado uma classe com #region:</p>
<pre class="brush: csharp;">public class Cliente
{
	#region [ +Construtores ]

	#region [ Cliente() ]
	public Cliente()
	{}
	#endregion

	#region [ Cliente(string nome, string cpf, string endereco, string telefone) ]
	public Cliente(string nome, string cpf, string endereco, string telefone)
	{
		_nome = nome;
		_cpf = cpf;
		_endereco = endereco;
		_telefone = telefone;
	}
	#endregion

	#endregion

	#region [ Campos privados ]

	private string _nome;
	private string _cpf;
	private string _endereco;
	private string _telefone;

	#endregion

	#region [ +Propriedades ]

	#region [ Nome ]
	public string Nome
	{
		get { return _nome; }
		set { _nome = value; }
	}
	#endregion

	#region [ CPF ]
	public string CPF
	{
		get { return _cpf;; }
		set { _cpf = value; }
	}
	#endregion

	#region [ Endereco ]
	public string Endereco
	{
		get { return _endereco; }
		set { _endereco = value; }
	}
	#endregion

	#region [ Telefone ]
	public string Telefone
	{
		get { return _telefone; }
		set { _telefone = value; }
	}
	#endregion

	#endregion
}</pre>
<p>Copie e cole esse código em um arquivo .cs no <strong>Visual Studio</strong> e veja a diferença&#8230; Creio que vai começar a ficar mais fácil de entender o que acontece no seu código&#8230;  <img src='http://blog.carlosalessandroribeiro.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>Veja o resultado:</p>
<p><img class="alignnone size-full wp-image-187" title="Código Organizado" src="http://blog.caixaazul.com/wp-content/uploads/2009/01/codigoorganizado1.png" alt="Código Organizado" width="173" height="131" /></p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/13/organizacao-de-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Avisando ao google que seu site foi atualizado</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/10/dica-avisando-ao-google-que-seu-site-foi-atualizado/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/10/dica-avisando-ao-google-que-seu-site-foi-atualizado/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 00:33:40 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Sitemap.xml]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=155</guid>
		<description><![CDATA[Quando criamos um site, gostaríamos que o Google ou qualquer outro site de busca fosse avisado automaticamente. Existe uma maneira, o Google disponibiliza uma URL para você poder informar um arquivo XML no seu site que contém as suas URLs. Basta informar o endereço do sitemap.xml em seu site igual ao exemplo abaixo: http://www.google.com/webmasters/sitemaps/ping?sitemap=http://www.seusite.com.br/sitemap.xml Claro [...]]]></description>
			<content:encoded><![CDATA[<p>Quando criamos um site, gostaríamos que o Google ou qualquer outro site de busca fosse avisado automaticamente. Existe uma maneira, o Google disponibiliza uma URL para você poder informar um arquivo XML no seu site que contém as suas URLs.</p>
<p>Basta informar o endereço do sitemap.xml em seu site igual ao exemplo abaixo:</p>
<p>http://www.google.com/webmasters/sitemaps/ping?sitemap=<strong>http://www.seusite.com.br/sitemap.xml</strong></p>
<p>Claro que o Google não irá atualizar a busca automaticamente, porém, em alguns dias você já verá o resultado! <img src='http://blog.carlosalessandroribeiro.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Para obter mais informações de como criar um arquivo <strong>sitemap.xml</strong> <a href="http://www.sitemaps.org/pt_BR/" target="_blank">clique aqui</a>.</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/10/dica-avisando-ao-google-que-seu-site-foi-atualizado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: SiteMap e o evento SiteMapResolve</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/03/dica-sitemap-e-o-evento-sitemapresolve/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/03/dica-sitemap-e-o-evento-sitemapresolve/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 22:39:43 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[SiteMap]]></category>
		<category><![CDATA[SiteMapResolve]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=128</guid>
		<description><![CDATA[Segue mais uma dica que encontrei pesquisando pela internet (google)&#8230; Precisei durante o processamento da página colocar uma QueryString dinâmica em um link gerado no controle SiteMapPath do próprio ASP.NET, porém, o controle em si não fornece nenhum mecanismo para isso, daí comecei a buscar na internet algum meio de fazer isso sem perder os [...]]]></description>
			<content:encoded><![CDATA[<p>Segue mais uma dica que encontrei pesquisando pela internet (google)&#8230;<br />
Precisei durante o processamento da página colocar uma QueryString dinâmica em um link gerado no controle <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sitemappath(VS.80).aspx" target="_blank">SiteMapPath</a> do próprio ASP.NET, porém, o controle em si não fornece nenhum mecanismo para isso, daí comecei a buscar na internet algum meio de fazer isso sem perder os links gerados pelo controle, então encontrei um Evento da classe <a href="http://msdn.microsoft.com/en-us/library/system.web.sitemap.aspx" target="_blank">SiteMap</a> (que é a representação em memória da estrutra do site web.sitemap ou o arquivo que foi configurado para isso) chamado <a href="http://msdn.microsoft.com/en-us/library/system.web.sitemap.sitemapresolve.aspx" target="_blank">SiteMapResolve</a>. Segue abaixo como utilizá-lo:</p>
<pre class="brush: csharp;">protected void Page_Load(object sender, EventArgs e)
{
	SiteMap.SiteMapResolve +=
		new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
}

private SiteMapNode SiteMap_SiteMapResolve(Object sender,
							SiteMapResolveEventArgs e)
{
	SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
	currentNode.Url += + "?forumID=" + Request.QueryString["forumID"];
	return currentNode;
}

protected override void OnUnload(EventArgs e)
{
	SiteMap.SiteMapResolve -=
		new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
	base.OnUnload(e);
}
</pre>
<p>Até mais&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/03/dica-sitemap-e-o-evento-sitemapresolve/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Útil: Carregar combo a partir de um Enum</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/01/util-carregar-combo-a-partir-de-um-enum/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/01/util-carregar-combo-a-partir-de-um-enum/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 03:01:31 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=110</guid>
		<description><![CDATA[Um outro método que fiz para facilitar em alguns momentos foi para carregar um combo a partir de um Enum, imagina que você tem um Enum que possui os Estados de um Usuário, por exemplo: Ativo, Inativo, AguardandoAprovacao e Bloqueado. E você precisasse inserir esses itens em um combo para uma tela que efetuará uma [...]]]></description>
			<content:encoded><![CDATA[<p>Um outro método que fiz para facilitar em alguns momentos foi para carregar um combo a partir de um <strong>Enum</strong>, imagina que você tem um <strong>Enum </strong>que possui os Estados de um Usuário, por exemplo: Ativo, Inativo, AguardandoAprovacao e Bloqueado. E você precisasse inserir esses itens em um combo para uma tela que efetuará uma busca e conterá esses valores como filtro.</p>
<p>Veja como ficaria:</p>
<p><strong>Enum:</strong></p>
<pre class="brush: csharp;">public enum SituacaoUsuario : int
{
	[Description("Ativo")]
	Ativo = 1,
	[Description("Inativo")]
	Inativo = 2,
	[Description("Aguardando Aprovação")]
	AguardandoAprovacao = 3,
	[Description("Bloqueado")]
	Bloqueado = 4
}</pre>
<p><strong>Método:</strong></p>
<pre class="brush: csharp;">public static void CarregarComboEnum&lt;T&gt;(DropDownList cbo)
{
	cbo.Items.Clear();

	Type objType = typeof(T);
	FieldInfo[] propriedades = objType.GetFields();

	foreach (FieldInfo objField in propriedades)
	{
		DescriptionAttribute[] attributes = (DescriptionAttribute[])objField.GetCustomAttributes(typeof(DescriptionAttribute), false);

		if (attributes.Length &gt; 0)
			cbo.Items.Add(new ListItem(attributes[0].Description, objField.GetRawConstantValue().ToString()));
	}
}</pre>
<p><strong>Utilizando o método:</strong></p>
<pre class="brush: csharp;">protected void Page_Load(object sender, EventArgs e)
{
	if (!IsPostBack)
		CarregarComboEnum&lt;SituacaoUsuario&gt;(ddlSituacaoUsuario);
}</pre>
<p>Lembrando que para utilização desse exemplo, é necessário referenciar os seguintes Assemblies:</p>
<pre class="brush: csharp;">using System.ComponentModel;
using System.Reflection;
</pre>
<p>Espero que possa ajudar&#8230; até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2009/01/01/util-carregar-combo-a-partir-de-um-enum/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Útil: Carregar uma entidade a partir de um DataReader</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/31/util-carregar-uma-entidade-a-partir-de-um-datareader/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/31/util-carregar-uma-entidade-a-partir-de-um-datareader/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 00:48:04 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[CustomAttributes]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=101</guid>
		<description><![CDATA[Criei um método que facilita muito a minha vida durante o desenvolvimento de projetos, uma coisa que eu sempre achei um saco era ficar fazendo loop para carregar uma Entidade a partir de um SELECT, as vezes tínhamos 2 campos apenas e as vezes tínhamos 30, 40 e por ai vai. Pensando nisso, criei esse [...]]]></description>
			<content:encoded><![CDATA[<p>Criei um método que facilita muito a minha vida durante o desenvolvimento de projetos, uma coisa que eu sempre achei um saco era ficar fazendo loop para carregar uma Entidade a partir de um SELECT, as vezes tínhamos 2 campos apenas e as vezes tínhamos 30, 40 e por ai vai.</p>
<p>Pensando nisso, criei esse método usando <strong><a href="http://msdn.microsoft.com/en-us/library/cxz4wk15.aspx" target="_blank">Reflection</a> </strong>para fazer esse trabalho por mim, basta no SELECT o alias da coluna de retorno ser o mesmo nome da Property da entidade. Segue abaixo o método:</p>
<p><strong>Código do método CarregarEntidade:</strong></p>
<pre class="brush: csharp;">public static T CarregarEntidade&lt;T&gt;(DbDataReader dr)
{
	PropertyInfo[] propriedades = typeof(T).GetProperties();

	Assembly objAssembly = Assembly.GetAssembly(typeof(T));
	object instancia = objAssembly.CreateInstance(typeof(T).FullName, false);

	List&lt;string&gt; objCampos = new List&lt;string&gt;();

	int numCampos = dr.FieldCount;
	for (int i = 0; i &lt; numCampos; i++)
		objCampos.Add(dr.GetName(i).ToLower());

	#region [ Varre as propriedades atribuindo os valores do DataReader ]

	foreach (PropertyInfo p in propriedades)
	{
		if (objCampos.Contains(p.Name.ToLower()))
		{
			object valorDr = dr[p.Name.ToLower()];

			if (valorDr != DBNull.Value)
			{
				if (!p.PropertyType.IsEnum)
				{
					if (Nullable.GetUnderlyingType(p.PropertyType) != null)
						p.SetValue(instancia, Convert.ChangeType(valorDr, Nullable.GetUnderlyingType(p.PropertyType)), null);
					else
					{
						object valorConvertido = Convert.ChangeType(valorDr, p.PropertyType);
						p.SetValue(instancia, valorConvertido, null);
					}
				}
				else
					p.SetValue(instancia, Enum.Parse(p.PropertyType, valorDr.ToString()), null);
			}
		}
	}

	#endregion

	return (T)instancia;
}</pre>
<p>Veja um exemplo de como usar esse método:</p>
<p><strong>Entidade:</strong></p>
<pre class="brush: csharp;">public class PessoaFisica
{
	public string Nome
	{
		get;
		set;
	}

	public string CPF
	{
		get;
		set;
	}
}
</pre>
<p><strong>Realizando a busca:</strong></p>
<pre class="brush: csharp;">public List&lt;PessoaFisica&gt; BuscarPessoaFisica()
{
	List&lt;PessoaFisica&gt; arr = new List&lt;PessoaFisica&gt;();

	StringBuilder sbSql = new StringBuilder();
	sbSql.Append("SELECT Nome, CPF FROM T_PessoaFisica ");

	SqlCommand cmd = new SqlCommand(sbSql.ToString(), objConnection);

	SqlDataReader dr = cmd.ExecuteReader();

	while(dr.Read())
	{
		PessoaFisica objPF = CarregarEntidade&lt;PessoaFisica&gt;(dr);
		arr.Add(objPF);
	}

	dr.Close();
	dr.Dispose();

	return arr;
}
</pre>
<p>Esse é apenas um exemplo do que pode ser feito com <strong>Reflection</strong>, claro que esse método poderá ser adaptado para casos mais específicos e até mesmo retornar uma coleção de uma determinada entidade por exemplo, ou usando <a href="http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx" target="_blank"><strong>CustomAttributes</strong></a> como é feito no <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank"><strong>LINQ</strong></a> nas classes que são geradas&#8230; Basta usar a imaginação&#8230; rs..</p>
<p>Qualquer dúvida ou sugestão estou a disposição&#8230;</p>
<p><strong>[ATUALIZADO]:</strong> Atualização do método de acordo com os problemas encontrados com propriedades Nullable.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/31/util-carregar-uma-entidade-a-partir-de-um-datareader/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Dica: Shallow Copy vs Deep Copy em .NET</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/30/dica-shallow-copy-vs-deep-copy-em-net/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/30/dica-shallow-copy-vs-deep-copy-em-net/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 01:09:35 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Deep Copy]]></category>
		<category><![CDATA[ICloneable]]></category>
		<category><![CDATA[MemberwiseClone]]></category>
		<category><![CDATA[Shallow Copy]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=62</guid>
		<description><![CDATA[Existe um artigo muito bom na internet explicando qual a diferença dos 2 casos, segue abaixo um método que efetua o Deep Copy, ou seja, uma cópia fiel do objeto sem ter problemas com referência se alterado em algum momento após a cópia da mesma, coisa que não acontecia no Shallow Copy: Serão necessários esses [...]]]></description>
			<content:encoded><![CDATA[<p>Existe um <a target="_blank" href="http://www.codeproject.com/KB/cs/ShallowVsDeepCopy.aspx">artigo</a> muito bom na internet explicando qual a diferença dos 2 casos, segue abaixo um método que efetua o <strong>Deep Copy</strong>, ou seja, uma cópia fiel do objeto sem ter problemas com referência se alterado em algum momento após a cópia da mesma, coisa que não acontecia no <strong>Shallow Copy</strong>:</p>
<p><strong>Serão necessários esses USINGs:</strong></p>
<pre class="brush: csharp;">
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;</pre>
<p><strong>Método:</strong></p>
<pre class="brush: csharp;">
public static TReturn CopyObject&lt;TReturn&gt;(TReturn item)
{
	if (item != null)
	{
		BinaryFormatter formatter = new BinaryFormatter();
		MemoryStream stream = new MemoryStream();

		formatter.Serialize(stream, item);
		stream.Seek(0, SeekOrigin.Begin);

		TReturn result = (TReturn)formatter.Deserialize(stream);

		stream.Close();

		return result;
	}
	else
		return default(TReturn);
}
</pre>
<p>Espero que possa ajudar&#8230;</p>
<p>Até a próxima&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/30/dica-shallow-copy-vs-deep-copy-em-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: .NET Remoting x Generics</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/29/dica-net-remoting-x-generics/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/29/dica-net-remoting-x-generics/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 23:21:00 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET Remoting]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[SOAP]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=41</guid>
		<description><![CDATA[Em um dos projetos que participei na arquitetura do mesmo seria necessário utilizar .NET Remoting para um Application Server, até ai tranquilo, fizemos todas as camadas do projeto (UI, DAL, BLL, Facade, Factory, etc) utilizando todos os recursos disponíveis no .NET 2.0, inclusive o Generics (o mais bacana.. rs..). Após ser feito todos esses passos [...]]]></description>
			<content:encoded><![CDATA[<p>Em um dos projetos que participei na arquitetura do mesmo seria necessário utilizar .NET Remoting para um Application Server, até ai tranquilo, fizemos todas as camadas do projeto (UI, DAL, BLL, Facade, Factory, etc) utilizando todos os recursos disponíveis no .NET 2.0, inclusive o Generics (o mais bacana.. rs..).</p>
<p>Após ser feito todos esses passos e o início do desenvolvimento, ao testar a primeira tela efetuando a chamada remota para o Application Server, erro: <strong>Soap Serializer does not support serializing Generic Types</strong>.</p>
<p>Fazendo várias buscas na internet (google), descobrimos que para usar remoting e generics era necessário trafegar os dados em binário. Para conseguir essa configuração, basta ir no web.config do client, no nosso caso o website que fazia a chamada remota e colocar as seguintes chaves:</p>
<pre class="brush: xml;">
	&lt;system.runtime.remoting&gt;
		&lt;application&gt;
			&lt;channels&gt;
				&lt;channel ref=&quot;http&quot; useDefaultCredentials=&quot;true&quot; port=&quot;0&quot;&gt;
					&lt;clientProviders&gt;
						&lt;formatter ref=&quot;binary&quot; /&gt;
					&lt;/clientProviders&gt;
				&lt;/channel&gt;
			&lt;/channels&gt;
		&lt;/application&gt;
	&lt;/system.runtime.remoting&gt;
</pre>
<p>E crie um Global.asax e no evento Application_Start adicione o seguinte código:</p>
<pre class="brush:csharp;">
protected void Application_Start(object sender, EventArgs e)
{
	string filename = HttpContext.Current.Server.MapPath("~/web.config");
	RemotingConfiguration.Configure(filename, false);
}
</pre>
<p>Foi outra coisa que deu um pouco de trabalho para encontrar a solução e espero poder ajudar alguém que caia na mesma situação&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/29/dica-net-remoting-x-generics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica: Viewstate e OnInit</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/28/dica-viewstate-e-oninit/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/28/dica-viewstate-e-oninit/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 01:30:42 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[OnInit]]></category>
		<category><![CDATA[ViewState]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=11</guid>
		<description><![CDATA[Quem nunca precisou de um GridView em que você tivesse um botão e fosse adicionando itens dinamicamente a ele? Pois bem, recentemente em um dos projetos que estou participando tive um problema um tanto quanto estranho, até o momento não descobri o porque, porém, consegui encontrar onde estava o problema. Nesse projeto estamos usando Classes [...]]]></description>
			<content:encoded><![CDATA[<p>Quem nunca precisou de um GridView em que você tivesse um botão e fosse adicionando itens dinamicamente a ele?</p>
<p>Pois bem, recentemente em um dos projetos que estou participando tive um problema um tanto quanto estranho, até o momento não descobri o porque, porém, consegui encontrar onde estava o problema.</p>
<p>Nesse projeto estamos usando Classes bases para as páginas e MasterPages para poder ter um controle melhor em algumas situações como por exemplo: login (verificar se o usuário está logado, permissões), menu (de acordo com o perfil do usuário), etc..</p>
<p>Em uma das classes bases da página sobrescrevíamos o evento <strong>OnInit </strong>e nele fazíamos uma varredura recursiva em todos os controles da página (inclusive os da masterpage) e por algum motivo o <strong>ViewState </strong>da página simplesmente não funcionava mais. Para resolver esse problema, que com muito custo descobri que o problema era a varredura recursiva dos controles das páginas no <strong>OnInit</strong>, mudei para o evento <strong>OnPreLoad</strong>() essa &#8220;varredura&#8221; e pronto a página voltou a funcionar perfeitamente.</p>
<p>Espero que possa ajudar alguém que possa ter esse mesmo problema algum dia.. pois deu um trabalho enorme descobrir o que era&#8230; rs..</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/28/dica-viewstate-e-oninit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Post inicial&#8230;</title>
		<link>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/28/primeiro-post/</link>
		<comments>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/28/primeiro-post/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 22:50:24 +0000</pubDate>
		<dc:creator>Carlos Ribeiro</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://blog.caixaazul.com/?p=5</guid>
		<description><![CDATA[Bom galera, sou Analista de Sistema formado em 2006 pela Universidade São Judas Tadeu, trabalho desde 2002 com programação web na plataforma Microsoft. Tenho experiência em ASP, SQL Server, .NET (C# e um pouquinho de VB.NET) e quero guardar nesse blog todas as minhas experiências com programação no dia-a-dia&#8230; Espero poder ajudar em alguma coisa&#8230;]]></description>
			<content:encoded><![CDATA[<p>Bom galera, sou Analista de Sistema formado em 2006 pela Universidade São Judas Tadeu, trabalho desde 2002 com programação web na plataforma Microsoft. Tenho experiência em ASP, SQL Server, .NET (C# e um pouquinho de VB.NET) e quero guardar nesse blog todas as minhas experiências com programação no dia-a-dia&#8230;</p>
<p>Espero poder ajudar em alguma coisa&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carlosalessandroribeiro.com.br/index.php/2008/12/28/primeiro-post/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

