<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-7108887360952377006</atom:id><lastBuildDate>Sun, 27 Nov 2011 23:54:12 +0000</lastBuildDate><category>mobile</category><category>CLPE</category><category>windows seven</category><category>Dojo</category><category>Visual Studio</category><category>.Net Architects</category><category>design patterns</category><category>#cpartybr</category><category>Cache</category><category>IE9</category><category>Dexpot</category><category>C/C++</category><category>arquitetura</category><category>UML</category><category>Session</category><category>Dica</category><category>sql server</category><category>Visual Studio 2010</category><category>ASP.NET</category><category>Fences</category><category>MIX10</category><category>t-sql</category><category>Windows Phone</category><category>C#</category><category>Campus Party</category><category>TDD</category><category>ALM</category><category>Linguagem de programação</category><category>Bluetooth</category><category>Matemática</category><category>Community Launch</category><category>Silverlight</category><category>.NET</category><title>Waldyr Felix</title><description>Estudante de computação e desenvolvedor .NET [MCP, MCTS ASP.NET 3.5]</description><link>http://waldyrfelix.blogspot.com/</link><managingEditor>noreply@blogger.com (Waldyr Felix)</managingEditor><generator>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/WaldyrFelix" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="waldyrfelix" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-4985244912127484804</guid><pubDate>Tue, 14 Dec 2010 04:06:00 +0000</pubDate><atom:updated>2010-12-14T01:06:42.443-03:00</atom:updated><title>Esse blog será desativado</title><description>&lt;p&gt;Olá pessoal,&lt;/p&gt;  &lt;p&gt;Depois de algum tempo sem postar decidi voltar a ativa, mas não nesse blog. Acabei de colocar no ar um novo blog com um novo dominio. Será a partir dele que postarem semanalmente conteúdo técnico da plataforma .Net.&lt;/p&gt;  &lt;p&gt;Acessem &lt;a href="http://www.waldyrfelix.net/blog"&gt;waldyrfelix.net/blog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Obrigado a todos.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-4985244912127484804?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/12/esse-blog-sera-desativado.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-6759729075408987383</guid><pubDate>Mon, 23 Aug 2010 03:07:00 +0000</pubDate><atom:updated>2010-08-23T00:07:06.078-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.Net Architects</category><title>[DotNetArchitects] 1º DNA Meeting Partner</title><description>&lt;p&gt;Olá pessoal,&lt;/p&gt;  &lt;p&gt;Ontem dia 21/08/2010 houve o 1º DNA Meeting Partner que foi um evento criado para marcar o inicio da parceria entre o grupo .Net Architects PE e a TWM Tecnologia. &lt;/p&gt;  &lt;p&gt;No evento tivemos uma pequena apresentação sobre o .Net Architects com Felipe Pimentel e em seguida a palestra de Thiago Holder sobre DDD cujo título foi “Software Complexo? Entenda seu domínio e desenhe um modelo”. As apresentações foram muito interessantes, logo após o Sócio-Diretor da TWM, Thiago Brandão falou um pouco sobre a empresa e o porque de está entrando numa parceria com o grupo .Net Architects.&lt;/p&gt;  &lt;p&gt;Pois é pessoal, a partir de agora todos os eventos do .Net Architects PE serão realizados na própria TWM, que por sinal tem um espaço muito agradável e é muito bem localizada.&lt;/p&gt;  &lt;p&gt;A agenda dos próximos eventos já foi definida e pode ser conferida no site do .Net Architects PE.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Links&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.twmtecnologia.com.br/" href="http://www.twmtecnologia.com.br/"&gt;http://www.twmtecnologia.com.br/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="http://pe.dotnetarchitects.net/" href="http://pe.dotnetarchitects.net/"&gt;http://pe.dotnetarchitects.net/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.flickr.com/photos/dnape" href="http://www.flickr.com/photos/dnape"&gt;http://www.flickr.com/photos/dnape&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-6759729075408987383?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/08/dotnetarchitects-1-dna-meeting-partner.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-8161077136777565589</guid><pubDate>Sun, 09 May 2010 13:31:00 +0000</pubDate><atom:updated>2010-05-09T10:31:03.742-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.Net Architects</category><category domain="http://www.blogger.com/atom/ns#">Dojo</category><title>[DotNetArchitects] 1º Coding Dojo do .Net Architects em Recife</title><description>&lt;p&gt;Ontem dia 08/05 tivemos nosso primeiro &lt;a href="http://www.codingdojo.org/" target="_blank"&gt;coding dojo&lt;/a&gt; do .Net Architects aqui em Recife. &lt;/p&gt;  &lt;p&gt;Foi muito interessante e divertido interagir com todos resolvendo um problema em comum. Que diga-se de passagem não foi um problema tão fácil assim: soma com números Romanos. &lt;/p&gt;  &lt;p&gt;Para o Coding Dojo usamos Visual Studio 2010, TDD e C#, não conseguimos finalizar o problema mas creio que o objetivo foi atingido com sucesso, que é interagir com outros, aprender enquanto se diverte e colocar em prática os conhecimentos de programação.&lt;/p&gt;  &lt;p&gt;Coloquei no SlideShare a apresentação do Coding Dojo:&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4021965"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="1º coding dojo dnape" href="http://www.slideshare.net/waldyrfelix/1-coding-dojo-dnape"&gt;1º coding dojo dnape&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4021965" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=1codingdojodna-100508184910-phpapp01&amp;amp;stripped_title=1-coding-dojo-dnape" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4021965" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=1codingdojodna-100508184910-phpapp01&amp;amp;stripped_title=1-coding-dojo-dnape" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/waldyrfelix"&gt;Waldyr Felix&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Espero que gostem, logo em breve faremos outra reunião com Coding Dojo.&lt;/p&gt;  &lt;p&gt;[]s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-8161077136777565589?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/05/dotnetarchitects-1-coding-dojo-do-net.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-8842460492599506475</guid><pubDate>Sun, 09 May 2010 13:17:00 +0000</pubDate><atom:updated>2010-05-09T10:17:51.959-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">Session</category><title>[ASP.NET 4] Compressão do Session</title><description>&lt;p&gt;Voltando finalmente a nossa série de posts sobre o novo ASP.NET 4, hoje irei falar sobre compressão na serialização do session.&lt;/p&gt;  &lt;p&gt;Em ASP.NET existem basicamente 3 tipos de armazenamento de dados no session, são eles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;InProc: Armazena o session na memória do servidor web, essa é a opção default.&lt;/li&gt;    &lt;li&gt;StateServer: Usa um serviço chamado ASP.NET State Server para armazenar dados do session das aplicações, usado em Web farms ou quando precisamos manter o estado do session mesmo depois de reiniciar a aplicação no IIS.&lt;/li&gt;    &lt;li&gt;SQLServer: Armazena os dados do session num banco de dados SQL Server, usado para manter o estado de Web farms ou quando precisamos manter o estado do session mesmo depois de reiniciar a aplicação no IIS.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Nos dois últimos tipos, StateServer e SQLServer, é necessário serializar os dados da sessão antes de se armazenar. O que pode aumentar a tráfego e tornar a aplicação lenta quando se tem muitos dados no session. &lt;/p&gt;  &lt;p&gt;No ASP.NET 4 há uma maneira de resolver isso, usando compressão desses dados serializados antes de transmiti-lo pra outro server, por exemplo. Para isso basta adicionar o atributo &lt;em&gt;compressionEnabled&lt;/em&gt; na configuração do session, mais ou menos assim:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_WqDTFTxw_iw/S-a1_VWp4ZI/AAAAAAAABkE/zRDnaR5UmE4/image%5B6%5D.png?imgmax=800" width="546" height="123" /&gt; &lt;/p&gt;  &lt;p&gt;Quando a opção compressionEnabled está ativada o .Net Framework 4 automaticamente serializa o session e comprime esses dados usando o algoritmo GZip, usando a classe System.IO.Compression.GZipStream para realizar as operações de compressão e descompressão dos dados.&lt;/p&gt;  &lt;p&gt;Claro que habilitando esta opção haverá um gasto maior de CPU, mas não deve ser nada muito dispendioso já que o GZipStream é bastante rápido.&lt;/p&gt;  &lt;p&gt;Por hoje é só, espero que tenham gostado :)&lt;/p&gt;  &lt;p&gt;[]s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-8842460492599506475?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/05/aspnet-4-compressao-do-session.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_WqDTFTxw_iw/S-a1_VWp4ZI/AAAAAAAABkE/zRDnaR5UmE4/s72-c/image%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-6039440069610697076</guid><pubDate>Fri, 23 Apr 2010 03:15:00 +0000</pubDate><atom:updated>2010-05-09T09:54:55.775-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.Net Architects</category><category domain="http://www.blogger.com/atom/ns#">Community Launch</category><category domain="http://www.blogger.com/atom/ns#">CLPE</category><title>[DotNetArchitects] Quem não foi pro Community Launch PE perdeu!</title><description>Semana passada mas especificamente no sábado dia 17/04 houve o primeiro evento organizado pelo .Net Architects de Recife. O evento foi marcado com a presença de muitos estudantes e profissionais que, apesar da chuva forte, compareceram para prestigiar as palestras sobre diversos assuntos envolvendo tecnologias novas da Microsoft.&lt;br /&gt;
Eu como membro ativo e um dos organizadores do evento, tive o prazer de palestrar sobre as novidades do Visual Studio 2010.&lt;br /&gt;
&lt;div id="__ss_3825056" style="width: 425px;"&gt;
&lt;b style="display: block; margin: 12px 0px 4px;"&gt;&lt;a href="http://www.slideshare.net/waldyrfelix/palestra-visual-studio-2010-clpe" title="Palestra novidades do Visual Studio 2010 - Community Launch"&gt;Palestra novidades do Visual Studio 2010 - Community Launch&lt;/a&gt;&lt;/b&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=palestravisualstudio2010-clpe-100422214723-phpapp02&amp;amp;stripped_title=palestra-visual-studio-2010-clpe" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowScriptAccess" value="always" /&gt;
&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=palestravisualstudio2010-clpe-100422214723-phpapp02&amp;amp;stripped_title=palestra-visual-studio-2010-clpe" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;br /&gt;
&lt;div style="padding: 5px 0px 12px;"&gt;
View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/waldyrfelix"&gt;Waldyr Felix&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
E ainda fiz parte da mesa redonda sobre Qualidade de Software, onde Daniel Ferreira (@dfsdaniel), Helio Bentzen (@heliobentzen), Roberto Alves (@jr_robertoalves) e eu (@waldyrfelix) falamos sobre diversos aspectos da qualidade em software.&lt;br /&gt;
No geral, tanto as palestras como a discussão na mesa redonda foram de altíssimo nível. Quem foi não se arrependeu e que não foi é trouxa! :P&lt;br /&gt;
E pra finalizar este post com chave de ouro seguem as fotos!!! &lt;a href="http://picasaweb.google.com.br/dcruzb/CommunityLaunchPEDEV" title="http://picasaweb.google.com.br/dcruzb/CommunityLaunchPEDEV"&gt;http://picasaweb.google.com.br/dcruzb/CommunityLaunchPEDEV&lt;/a&gt;&lt;br /&gt;
Próximo post continuo a série sobre ASP.NET 4. Abraço pessoal!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-6039440069610697076?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/04/dotnetarchitects-quem-perdeu-o.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-4765599208340507087</guid><pubDate>Tue, 13 Apr 2010 01:51:00 +0000</pubDate><atom:updated>2010-04-12T22:51:07.737-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Visual Studio 2010</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>[ASP.NET 4] Mudanças no web.config</title><description>&lt;p&gt;Olá pessoal dando continuidade a série sobre ASP.NET 4, vamos falar hoje sobre uma mudança significativa no tamanho do XML dentro do web.config de uma aplicação web.&lt;/p&gt;  &lt;p&gt;Desde as primeiras versões do ASP.NET o web.config tem sido incrementado mais e mais para suportar as funcionalidades que iam sendo adicionadas a cada versão. Desta forma ao chegar na versão 3.5 do ASP.NET qualquer aplicação, por mais básica que fosse, ficava com um arquivo de configuração gigantesco.&lt;/p&gt;  &lt;p&gt;Na novíssima versão do ASP.NET não precisamos ter tantas linhas de XML na configuração, não precisamos sequer colocar nada dentro do web.config.&lt;/p&gt;  &lt;p&gt;Isto acontece porque todas as configurações padrão que foram sendo adicionadas, como integração com IIS 7, suporte a Ajax, roteamento de URL e etc, foram movidos para o arquivo de configuração da máquina, o machine.config.&lt;/p&gt;  &lt;p&gt;Imagine só um web.config tão enxuto quanto este:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_WqDTFTxw_iw/S8POCGt_MEI/AAAAAAAABic/qEKWLJ8L2So/image%5B6%5D.png?imgmax=800" width="360" height="120" /&gt; &lt;/p&gt;  &lt;p&gt;Legal né? Uma grande vantagem dessa nova característica é que torna o desenvolvimento para aplicações ASP.NET um pouco menos dependente do Visual Studio, muito embora acredite que esta não seja lá uma opção muito interessante. :)&lt;/p&gt;  &lt;p&gt;Abraço pessoal e até a próxima.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-4765599208340507087?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/04/aspnet-4-mudancas-no-webconfig.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_WqDTFTxw_iw/S8POCGt_MEI/AAAAAAAABic/qEKWLJ8L2So/s72-c/image%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-1627450640602246236</guid><pubDate>Sat, 03 Apr 2010 04:26:00 +0000</pubDate><atom:updated>2010-04-03T01:26:19.464-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio 2010</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>[ASP.NET 4] Geração de IDs mais eficientes</title><description>&lt;p&gt;Oi pessoal.&lt;/p&gt;  &lt;p&gt;Estou inaugurando agora, uma série de posts sobre novas features do ASP.NET 4, então vamos lá!&lt;/p&gt;  &lt;p&gt;Nas versões anteriores do ASP.NET a questão de geração de IDs era um pouco complicada e porque não dizer tosca. Onde era muito comum códigos lindos como esse:&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_WqDTFTxw_iw/S7bDVrxHy1I/AAAAAAAABfU/sCtqv_eG5JI/image%5B65%5D.png?imgmax=800" width="409" height="21" /&gt; &lt;/p&gt;  &lt;p&gt;Se tornar uma aberração quando renderizado para HTML assim:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_WqDTFTxw_iw/S7bDWe_7peI/AAAAAAAABfY/yKr5bkySUzc/s1600-h/image%5B64%5D.png"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_WqDTFTxw_iw/S7bDW8dwhHI/AAAAAAAABfc/ytOpO8Fnxf4/image_thumb%5B19%5D.png?imgmax=800" width="507" height="33" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O fato é que isso era horrível quando se precisava manipular o componente do client usando, por exemplo, Java Script ou CSS. Além do que aumenta em muito o tamanho da página, pois o programador não tem controle algum sobre o que vai para o browser do usuário. &lt;/p&gt;  &lt;p&gt;Mas para a alegria de todos isso mudou com o advento do ASP.NET 4 \o/&lt;/p&gt;  &lt;p&gt;Na novíssima versão do ASP.NET existe uma nova propriedade chamada &lt;strong&gt;ClientIDMode&lt;/strong&gt; que foi adicionada a classe Control do namespace System.Web.UI o que significa que qualquer controle agora possui esta nova propriedade.&lt;/p&gt;  &lt;p&gt;O ClientIDMode possui 4 valores possíveis, são eles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;AutoID&lt;/strong&gt; – Que equivale a maneira como as versões anteriores já renderizavam o HTML.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Static&lt;/strong&gt; – Força o ASP.NET a manter o mesmo ID do controle server side. Não deve ser usado quando estiver dentro de um controle de repetição, por motivos óbvios de repetição de IDs na página.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Predictable&lt;/strong&gt; – Esta opção foi criada para ser usada com controles de repetição, pois gera um ID concatenando os IDs dos containers, melhorando assim a legibilidade e acesso ao elemento da página.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Inherit&lt;/strong&gt; – Esta já é conhecida. É usada para manter as mesmas configurações herdadas pelos elementos pai. Esta opção é a default.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Vamos então a alguns exemplos, digamos que eu tenha um GridView como este:&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_WqDTFTxw_iw/S7bDXR-u3nI/AAAAAAAABfg/NlHjsbwhNoI/image%5B63%5D.png?imgmax=800" width="597" height="318" /&gt; &lt;/p&gt;  &lt;p&gt;Observe que coloquei os itens como template para exemplificar como os IDs serão gerados.&lt;/p&gt;  &lt;p&gt;Caso na linha 1 esteja setado &lt;strong&gt;ClientIDMode=&amp;quot;AutoID&amp;quot;&lt;/strong&gt; o HTML gerado fica bem parecido com o que havia nas versões anteriores, algo como isso:&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh3.ggpht.com/_WqDTFTxw_iw/S7bDYApcLVI/AAAAAAAABfk/y7dDGb_lYFE/image%5B62%5D.png?imgmax=800" width="463" height="387" /&gt; &lt;/p&gt;  &lt;p&gt;Caso a propriedade esteja assim &lt;strong&gt;ClientIDMode=&amp;quot;Static&amp;quot;&lt;/strong&gt;, todos os itens iguais dentro do GridView ficarão com o mesmo ID.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_WqDTFTxw_iw/S7bDYtq5OHI/AAAAAAAABfo/ZUJLp80s6Io/image%5B60%5D.png?imgmax=800" width="443" height="385" /&gt; &lt;/p&gt;  &lt;p&gt;E por último temos a propriedade assim &lt;strong&gt;ClientIDMode=&amp;quot;Predictable&amp;quot; &lt;/strong&gt;onde os IDs gerados serão compostos pelos IDs do elemento pai, o ID do próprio elemento mais o número da linha começando por zero. Segue o exemplo:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_WqDTFTxw_iw/S7bDZMqte8I/AAAAAAAABfs/tgZ3iF7jvxA/image%5B59%5D.png?imgmax=800" width="448" height="386" /&gt; &lt;/p&gt;  &lt;p&gt;Podemos ainda deixar o exemplo mais rico, utilizando uma outra propriedade nova chamada &lt;strong&gt;ClientIDRowSuffix&lt;/strong&gt; que recebe o nome de um dos campos do DataSource. Neste caso vou colocar o ID como sufixo nas linhas geradas, assim &lt;strong&gt;ClientIDRowSuffix=&amp;quot;ID&amp;quot;&lt;/strong&gt;: &lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh5.ggpht.com/_WqDTFTxw_iw/S7bDZvy8UEI/AAAAAAAABfw/TVEbSegOVBI/image%5B58%5D.png?imgmax=800" width="466" height="382" /&gt; &lt;/p&gt;  &lt;p&gt;Legal né? Ainda podemos ter um controle mais geral sobre como os controles irão renderizar seus ID colocando o ClientIDMode na diretiva @Page da página.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_WqDTFTxw_iw/S7bDaD0tkVI/AAAAAAAABf0/iTksM9fohmU/image%5B66%5D.png?imgmax=800" width="448" height="123" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ou ainda usar o famoso Web.config para setar a configuração pro site inteiro.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh5.ggpht.com/_WqDTFTxw_iw/S7bDalWYqrI/AAAAAAAABf4/AJPGThuO8jY/image%5B73%5D.png?imgmax=800" width="448" height="86" /&gt; &lt;/p&gt;  &lt;p&gt;Era isso que eu tinha pra mostrar a vocês, espero que tenham gostado da iniciativa. Aguardem os próximos posts. Obrigado e até a próxima.&lt;/p&gt;  &lt;p&gt;[]s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-1627450640602246236?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/04/aspnet-4-geracao-de-ids-mais-eficientes.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_WqDTFTxw_iw/S7bDVrxHy1I/AAAAAAAABfU/sCtqv_eG5JI/s72-c/image%5B65%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-3505714617901715532</guid><pubDate>Sat, 27 Mar 2010 03:09:00 +0000</pubDate><atom:updated>2010-03-27T00:09:06.720-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Windows Phone</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio 2010</category><category domain="http://www.blogger.com/atom/ns#">CLPE</category><category domain="http://www.blogger.com/atom/ns#">ALM</category><title>Palestras e Community Launch PE / Dev</title><description>&lt;p&gt;Olá pessoal.&lt;/p&gt;  &lt;p&gt;Ontem (25/03) e hoje (26/03) palestrei na FIR e na Unicap, as palestras foram sobre Visual Studio 2010 e foram muito bem recebidas. O pessoal ficou bastante empolgado com as novas features do Visual Studio.&lt;/p&gt;  &lt;p&gt;A palestra da FIR foi focada em ALM no Visual Studio 2010 e houve antes a palestra de Felipe Pimentel sobre &lt;a href="http://ificomm.com/blog/?p=71" target="_blank"&gt;Windows Phone 7&lt;/a&gt;.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_3559212"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="ALM no Visual Studio 2010" href="http://www.slideshare.net/waldyrfelix/alm-no-visual-studio-2010"&gt;ALM no Visual Studio 2010&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ciclodedesenvolvimentodesoftware-100325213256-phpapp02&amp;amp;stripped_title=alm-no-visual-studio-2010" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ciclodedesenvolvimentodesoftware-100325213256-phpapp02&amp;amp;stripped_title=alm-no-visual-studio-2010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/waldyrfelix"&gt;Waldyr Felix&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Já a palestra da Unicap foi mais focada no código e tivemos também a presença de Thiago Holder que falou muito bem sobre DDD (Domain Driven Design). Thiago postou as fotos pra gente no Picasa &lt;a href="http://picasaweb.google.com.br/thiagoholder/DotNetArchitects" target="_blank"&gt;confiram&lt;/a&gt;.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_3568794"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Visual Studio 2010" href="http://www.slideshare.net/waldyrfelix/visual-studio-2010-3568794"&gt;Visual Studio 2010&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=palestravs2010-100326211332-phpapp02&amp;amp;rel=0&amp;amp;stripped_title=visual-studio-2010-3568794" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=palestravs2010-100326211332-phpapp02&amp;amp;rel=0&amp;amp;stripped_title=visual-studio-2010-3568794" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/waldyrfelix"&gt;Waldyr Felix&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Outra coisa que não posso deixar de comentar aqui, é que nós do grupo .Net Architects de Pernambuco estamos em parceria com a Microsoft montando um evento chamado Community Launch. Este é um evento totalmente realizado pelas comunidades locais de todo o Brasil. &lt;/p&gt;  &lt;p&gt;O Community Launch está sendo realizado Brasil a fora com o intuito de mostrar para a comunidade dev e infra todas as novidades da plataforma da Microsoft. E como somos desenvolvedores, o Community Launch que estamos organizando será totalmente focado em desenvolvimento de software. &lt;/p&gt;  &lt;p&gt;Para os interessados segue o link do &lt;a href="http://pe.dotnetarchitects.net/CommunityLaunch.aspx" target="_blank"&gt;Community Launch PE / Dev&lt;/a&gt;, não percam pois essa será uma grande oportunidade de conhecer tecnologias novas e gente nova também…&lt;/p&gt;  &lt;p&gt;E para quem quiser acompanhar o que está acontecendo em tempo real sobre o Community Launch PE, fiquei atentos à hashtag #CLPE no Twitter! E se der tempo me sigam também @waldyrfelix :D&lt;/p&gt;  &lt;p&gt;Abraço pessoal e até a próxima.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-3505714617901715532?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/03/palestras-e-community-launch-pe-dev.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-1475917303110752905</guid><pubDate>Wed, 17 Mar 2010 03:03:00 +0000</pubDate><atom:updated>2010-03-17T00:03:54.384-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MIX10</category><category domain="http://www.blogger.com/atom/ns#">Windows Phone</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio 2010</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">IE9</category><title>Semana de grandes novidades</title><description>&lt;p&gt;Esta semana está rolando o MIX10 (de 15 a 17/Março) em Las Vegas, evento organizado pela Microsoft com palestras sobre novas tecnologias e anúncios de novos produtos.&lt;/p&gt;  &lt;p&gt;Só pra ter ideia do que tá rolando por lá, veja o que foi lançado já:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Silverlight 4 RC&lt;/strong&gt;: Finalmente o Silverlight 4 saiu do beta e já tem um patch que pode ser baixado aqui &lt;a title="http://silverlight.net/getstarted/silverlight-4/" href="http://silverlight.net/getstarted/silverlight-4/"&gt;http://silverlight.net/getstarted/silverlight-4/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SDK do Windows Phone 7&lt;/strong&gt;: E confirmando todas as expectativas de desenvolvimento com Silverlight e XNA 4.0 no novo sistema mobile da Microsoft. As ferramentas para começar a desenvolver já estão disponíveis para download no site &lt;a title="http://developer.windowsphone.com/" href="http://developer.windowsphone.com/"&gt;http://developer.windowsphone.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Preview do Internet Explorer 9&lt;/strong&gt;: Já pode ser baixado no site &lt;a title="http://ie.microsoft.com/testdrive/" href="http://ie.microsoft.com/testdrive/"&gt;http://ie.microsoft.com/testdrive/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Expression Blend 4&lt;/strong&gt;: Lançado e já pode ser baixado &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=6f014e07-0053-4aca-84a7-cd82f9aa989f&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6f014e07-0053-4aca-84a7-cd82f9aa989f&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=6f014e07-0053-4aca-84a7-cd82f9aa989f&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;E olha que isso aí foi só um aperitivo, quem ficou com água na boca pode acompanhar ao vivo o resto do evento pelo site oficial &lt;a href="http://live.visitmix.com"&gt;http://live.visitmix.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ah e essa notícia aqui é de última hora. O Channel 9 disponibilizou um &lt;strong&gt;Kit de Treinamento em vídeo sobre o Silverlight 4&lt;/strong&gt;&amp;#160;&lt;a title="http://channel9.msdn.com/learn/courses/Silverlight4/" href="http://channel9.msdn.com/learn/courses/Silverlight4/"&gt;http://channel9.msdn.com/learn/courses/Silverlight4/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pois é amigo, incrível como uma empresa tão grande como a Microsoft tem conseguido entregar produtos de altíssima qualidade tão rapidamente.&lt;/p&gt;  &lt;p&gt;Alguma dúvida que Silverlight é o futuro? :D&lt;/p&gt;  &lt;p&gt;Abraços e até a próxima&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-1475917303110752905?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/03/semana-de-grandes-novidades.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-2321989649921046602</guid><pubDate>Mon, 15 Mar 2010 04:32:00 +0000</pubDate><atom:updated>2010-03-15T01:32:48.138-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.Net Architects</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>A 1ª Reunião do .Net Architects em Recife</title><description>&lt;p&gt;Olá pessoal!&lt;/p&gt;  &lt;p&gt;No último sábado dia 13/03/2010 aconteceu a primeira reunião do .Net Architects em Recife.&lt;/p&gt;  &lt;p&gt;Para quem não sabe o .Net Architects é o maior e mais movimentado grupo focado em arquitetura de software do Brasil. O grupo começou em São Paulo e já está no Rio de Janeiro, em Minas Gerais e agora em Recife. A base das discussões giram em torno de melhores práticas de desenvolvimento e arquitetura de software, aplicando tudo isso ao mundo .NET.&lt;/p&gt;  &lt;p&gt;A nossa primeira reunião foi muitíssimo interessante, o tema abordado foi TDD (Test Driven Development), o primeiro palestrante foi Felipe Pimentel (@felipe_pimentel) e a reunião aconteceu na FIR (Faculdade Integrada do Recife) que nos apoiou com o espaço físico e equipamentos.&lt;/p&gt;  &lt;p&gt;A principio o pessoal estava bastante empolgado com reunião e a discussão foi bem interessante, apontamos nossos pontos de vista e tivemos um conteúdo de alto nível. Para quem ficou de fora desta, não fique triste que faremos outras reuniões (muitas outras espero) e no que depender da força de vontade do grupo, novos temas não irão faltar.&lt;/p&gt;  &lt;p&gt;Se você ainda não participa do grupo já tá na hora de entrar nas discussões e ficar de olho na hashtag do twitter #DotNetArchitects tem muita coisa boa por aí.&lt;/p&gt;  &lt;p&gt;E essa foi a nossa foto do grupo, olha a cara de satisfação da galera depois da reunião, você vai perder? &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_WqDTFTxw_iw/S524bLwMStI/AAAAAAAABdo/VcNgrysvslw/s1600-h/DSCN0189%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="DSCN0189" border="0" alt="DSCN0189" src="http://lh3.ggpht.com/_WqDTFTxw_iw/S524b0AOkHI/AAAAAAAABds/bi9EQdYgzgE/DSCN0189_thumb%5B2%5D.jpg?imgmax=800" width="618" height="469" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Links do .Net Architects: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Site oficial: &lt;a title="http://www.dotnetarchitects.net/" href="http://www.dotnetarchitects.net/"&gt;http://www.dotnetarchitects.net/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Podcast: &lt;a title="http://podcast.dotnetarchitects.net/" href="http://podcast.dotnetarchitects.net/"&gt;http://podcast.dotnetarchitects.net/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Grupo do google:&lt;a title="http://groups.google.com/group/dotnetarchitects/" href="http://groups.google.com/group/dotnetarchitects/"&gt;http://groups.google.com/group/dotnetarchitects/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Abraço pessoal!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-2321989649921046602?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/03/1-reuniao-do-net-architects-em-recife.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_WqDTFTxw_iw/S524b0AOkHI/AAAAAAAABds/bi9EQdYgzgE/s72-c/DSCN0189_thumb%5B2%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-3869985093976016472</guid><pubDate>Sat, 13 Mar 2010 03:53:00 +0000</pubDate><atom:updated>2010-03-13T00:53:50.931-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Cache</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>Cache em aplicações ASP.NET, usando Page Output Cache e controle Substituition</title><description>&lt;p&gt;Existem várias maneiras de se utilizar caching de dados no ASP.NET, uma das mais utilizadas é o &lt;strong&gt;Page Output Cache&lt;/strong&gt; que o ASP.NET implementa desde seus primórdios.&lt;/p&gt;  &lt;p&gt;É muito simples usar cache de páginas, bastando para tanto adicionar uma diretiva no cabeçalho de seu arquivo .aspx mais ou menos assim:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;%@ OutputCache Duration=&amp;quot;120&amp;quot; VaryByParam=&amp;quot;*&amp;quot; %&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Aqui estou dizendo a minha página que ela ficará estocada no cache por 120 segundos e que será gravado um nova cópia da página em cache dependendo de quaisquer parâmetros que eu passe na minha URL. &lt;/p&gt;  &lt;p&gt;Vejamos, aqui o usuário 2 foi consultado e a hora atual foi 0h17&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_WqDTFTxw_iw/S5sMQ85dW-I/AAAAAAAABdY/otcGFmnIlj8/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_WqDTFTxw_iw/S5sMRucy4WI/AAAAAAAABdc/zNXLydXo_88/image_thumb%5B3%5D.png?imgmax=800" width="567" height="383" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Aqui depois de algum tempo e alguns refreshes na página a hora do computador mudou, mais a hora da página continuou a mesma.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_WqDTFTxw_iw/S5sMSUL2WiI/AAAAAAAABdg/zNoPw6BV5hY/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_WqDTFTxw_iw/S5sMTbZuGSI/AAAAAAAABdk/u8Xd-P1RvTw/image_thumb%5B11%5D.png?imgmax=800" width="575" height="389" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Isso foi pra mostrar como o cache trabalha, já que o atributo Duration está setado para 120 é natural que o cache seja renovado somente a cada 2 minutos.&lt;/p&gt;  &lt;p&gt;O fato é que temos um problema quando usamos o @OutputCache, toda a página é colocada no cache do ASP.NET, inclusive os dados que precisamos de alterações instantâneas como a Hora, por exemplo.&lt;/p&gt;  &lt;p&gt;Para resolver este problema existe o controle chamado &amp;lt;asp:Substitution&amp;gt;, ele é um controle especial que faz uma chamada a um método sempre que a página é carregada, este método retorna uma string que sempre irá atualizar seu conteúdo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;asp:Substitution MethodName=&amp;quot;AtualizarHora&amp;quot; ID=&amp;quot;subHora&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Este método AtualizarHora deve ser estático e obedecer a assinatura imposta pelo delegate HttpResponseSubstitutionCallback assim:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public static string AtualizarHora(HttpContext context)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return DateTime.Now.ToLongTimeString();      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Agora a hora sempre será atualizada independente do cache! E você não pode mais dá desculpa que não consegue usar cache porque sua aplicação é atualizada frequentemente :)&lt;/p&gt;  &lt;p&gt;Abraço pessoal e até a próxima.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-3869985093976016472?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/03/cache-em-aplicacoes-aspnet-usando-page.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_WqDTFTxw_iw/S5sMRucy4WI/AAAAAAAABdc/zNXLydXo_88/s72-c/image_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-2146117918998703507</guid><pubDate>Sat, 27 Feb 2010 23:17:00 +0000</pubDate><atom:updated>2010-02-27T20:17:16.546-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">design patterns</category><category domain="http://www.blogger.com/atom/ns#">arquitetura</category><title>Usando o Padrão Strategy</title><description>&lt;p&gt;Olá pessoal,&lt;/p&gt;  &lt;p&gt;Como prometi no post &lt;a href="http://waldyrfelix.blogspot.com/2010/02/suporte-uml-no-visual-studio-2010-rc.html" target="_blank"&gt;anterior&lt;/a&gt; vou falar um pouco sobre o design pattern strategy. Pra começar imagine a seguinte situação:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Preciso implementar um componente que carrega uma imagem do disco e exibe na tela. Um dos requisitos é que o usuário possa modificar o brilho, a coloração e possa salvá-la em diversos formatos (JPEG e TIFF a princípio).&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A pergunta é como criar uma arquitetura onde eu tenha ao mesmo tempo baixo acoplamento e facilidade de manutenção?&lt;/p&gt;  &lt;p&gt;Explico, o baixo acoplamento é necessário porque o brilho, e as colorações disponíveis devem ser aplicadas da mesma forma para os diversos formatos de arquivo, que por sinal cada um deve ser gravado de forma diferente. E a facilidade de manutenção porque a qualquer momento o cliente pode dizer que não quer mais a coloração preto e branco, ou que agora teremos mais um tipo de imagem, PNG por exemplo. &lt;/p&gt;  &lt;p&gt;Pois bem, esse foi o problema que tive esta semana, pois estava desenvolvendo um componente de captura de imagens escaneadas, é mais complexo que isso mas para a demonstração do padrão strategy é o suficiente :)&lt;/p&gt;  &lt;p&gt;Vamos a definição: &lt;em&gt;O Padrão Strategy define uma família de algoritmos, encapsula cada um e os torna intercambiáveis. O Strategy deixa o algoritmo variar de comportamento independentemente do cliente.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Muito bonito, mas como eu uso isso? É simples, vamos criar uma classe básica abstrata que sabe como alterar o brilho, sabe como alterar a coloração (é aqui onde entra a estratégia), mas não sabe como salvar a imagem (método abstrato). Então herdaremos esta classe básica e implementaremos o método Salvar de acordo com as especificações do TIFF e do JPEG. A maneira como será mudada a imagem fica a cargo de classes que implementam uma interface responsável por prover um método Colorir, criando desta forma ligações leves entre as classes de imagem e as classes de coloração.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_WqDTFTxw_iw/S4mn9z3ZA_I/AAAAAAAABdM/yokKoxOZ8L8/s1600-h/image%5B17%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_WqDTFTxw_iw/S4mn-4QeLoI/AAAAAAAABdQ/JGs0GhuyCVU/image_thumb%5B11%5D.png?imgmax=800" width="626" height="370" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Bom aqui temos nosso diagrama de classes, UML não é meu forte mas acho que dá pra ter uma visão geral do que quero mostrar. &lt;/p&gt;  &lt;p&gt;Temos uma classe abstrata ImagemBase que se relaciona com a interface IColoracaoStrategy onde temos o método Colorir, esta interface que é responsável pelo comportamento da coloração na imagem, que é implementado nas classes ColoridoStrategy, SerpiaStrategy e PretoBrancoStrategy. Observe que na classe ImagemBase temos uma propriedade pública chamada Coloracao, ela está ali porque vamos precisar trocar o tipo de coloração da imagem em tempo de execução. &lt;/p&gt;  &lt;p&gt;Este esquema dá muita flexibilidade para futuras alterações, pois se precisarmos de uma nova coloração de escala de cinza basta adicionar uma classe implementando a interface IColoracaoStrategy e referenciá-la nas imagens. Da mesma forma se precisarmos no futuro implementar outro tipo de imagem, GIF por exemplo basta herda a classe ImagemBase e implementar o método Salvar.&lt;/p&gt;  &lt;p&gt;O Padrão Strategy está de acordo com vários princípios de projetos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Programe para interface, não para implementação.&lt;/li&gt;    &lt;li&gt;Dê prioridade a composição, não a herança de comportamento.&lt;/li&gt;    &lt;li&gt;Encapsule o que muda e separe do que não muda.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;E de acordo com o princípio S.O.L.I.D. aberto/fechado: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As classes devem ser abertas para extensão mas fechadas para modificação.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Implementei um projeto deste exemplo em C# no Visual Studio 2010, vocês podem baixar pelo link –&amp;gt; &lt;a title="http://cid-995f7a89b33affa8.skydrive.live.com/self.aspx/P%c3%bablico/Blog/PostPadraoStrategy.zip&amp;#13;&amp;#10;" href="http://cid-995f7a89b33affa8.skydrive.live.com/self.aspx/P%c3%bablico/Blog/PostPadraoStrategy.zip"&gt;http://cid-995f7a89b33affa8.skydrive.live.com/self.aspx/P%c3%bablico/Blog/PostPadraoStrategy.zip     &lt;br /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Espero que tenham gostado, abraço e até a próxima.&lt;/p&gt;  &lt;p&gt;Referências:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://unplugged.giggio.net/unplugged/post/Usando-o-principio-AbertoFechado-%28Open-Closed-Principle-OCP%29.aspx" href="http://unplugged.giggio.net/unplugged/post/Usando-o-principio-AbertoFechado-%28Open-Closed-Principle-OCP%29.aspx"&gt;http://unplugged.giggio.net/unplugged/post/Usando-o-principio-AbertoFechado-%28Open-Closed-Principle-OCP%29.aspx&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Strategy_pattern" href="http://en.wikipedia.org/wiki/Strategy_pattern"&gt;http://en.wikipedia.org/wiki/Strategy_pattern&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.dofactory.com/Patterns/PatternStrategy.aspx" href="http://www.dofactory.com/Patterns/PatternStrategy.aspx"&gt;http://www.dofactory.com/Patterns/PatternStrategy.aspx&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-2146117918998703507?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/02/usando-o-padrao-strategy.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_WqDTFTxw_iw/S4mn-4QeLoI/AAAAAAAABdQ/JGs0GhuyCVU/s72-c/image_thumb%5B11%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-5469409253044932861</guid><pubDate>Sun, 21 Feb 2010 05:07:00 +0000</pubDate><atom:updated>2010-02-21T02:07:39.819-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">UML</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio 2010</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Suporte à UML no Visual Studio 2010 RC</title><description>&lt;p&gt;Estou lendo o livro “Use a Cabeça: Padrões de Projetos”, recomendadíssimo por sinal. O livro tem muitos diagramas UML mostrando a composição dos padrões e tal. Então decidi fazer alguns testes com Diagramas UML e aproveitar para testar as novas capacidades do novíssimo Visual Studio 2010 RC. &lt;/p&gt;  &lt;p&gt;Nem precisa dizer que mais uma vez o VS2010 vai acima de qualquer expectativa né… &lt;/p&gt;  &lt;p&gt;Para iniciar um projeto UML basta fazer o de sempre, File –&amp;gt; New –&amp;gt; Project e selecionar Modeling Project, dá um nome ao projeto e clicar em Ok.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_WqDTFTxw_iw/S4C_iE6HhzI/AAAAAAAABcY/tKgnFvKT0Bo/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_WqDTFTxw_iw/S4C_jB2yNKI/AAAAAAAABcc/j7um3JcPGIM/image_thumb%5B7%5D.png?imgmax=800" width="566" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Depois disto feito, abrirá um projeto de Modelagem UML em branco, daí para adicionar um diagrama é botão direito no projeto –&amp;gt; Add –&amp;gt; New Item. Assim:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_WqDTFTxw_iw/S4C_jsQI25I/AAAAAAAABcg/GKdNWICMyjk/s1600-h/uml%20vs2010%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="uml vs2010" border="0" alt="uml vs2010" src="http://lh4.ggpht.com/_WqDTFTxw_iw/S4C_kV0elOI/AAAAAAAABck/JKfsTopbiM0/uml%20vs2010_thumb%5B2%5D.jpg?imgmax=800" width="607" height="388" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Aqui temos vários tipos de diagramas, claro que não chega nem perto da quantidade total de diagramas UML (que nem sei quantos são), mas aí estão listados os mais usados pelos desenvolvedores.&lt;/p&gt;  &lt;p&gt;Para fazer meu teste usei o diagrama de classe (UML Class Diagram). Fiz o exemplo do Padrão Strategy (depois irei postar algo sobre esse padrão) que tem no primeiro capítulo do “Use a Cabeça: Padrões de Projetos” e ficou assim:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_WqDTFTxw_iw/S4C_lJ4MlsI/AAAAAAAABco/58aoxrUExLc/s1600-h/image%5B20%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_WqDTFTxw_iw/S4C_mjxAx0I/AAAAAAAABcs/DN0yuSqHPPw/image_thumb%5B14%5D.png?imgmax=800" width="626" height="420" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Gostei bastante do resultado, nota-se de cara que a Microsoft fez o dever de casa ao projetar ferramentas de modelagem já integradas ao Visual Studio. Só senti falta da geração de código fonte pelo diagrama. Porém o MVP @igorabade me falou via &lt;a href="http://twitter.com/WaldyrFelix/status/9381024927" target="_blank"&gt;Twitter&lt;/a&gt; que essa funcionalidade deve sair pós RTM. É só esperar pra ver!&lt;/p&gt;  &lt;p&gt;Abraços pessoal, até a próxima.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-5469409253044932861?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/02/suporte-uml-no-visual-studio-2010-rc.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_WqDTFTxw_iw/S4C_jB2yNKI/AAAAAAAABcc/j7um3JcPGIM/s72-c/image_thumb%5B7%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-7178504880699182004</guid><pubDate>Sat, 06 Feb 2010 14:43:00 +0000</pubDate><atom:updated>2010-02-06T11:43:34.740-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">#cpartybr</category><category domain="http://www.blogger.com/atom/ns#">Campus Party</category><title>Campus Party Brasil 2010</title><description>&lt;p&gt;Olá pessoal, depois de um bom tempo sem postar nada. Voltei para contar como foi a minha experiência na Campus Party, e pode ser resumindo em uma única palavra: incrível!&lt;/p&gt;  &lt;p&gt;Para os que ficaram com vontade de ir a Campus Party, ano que vem tem mais (e eu não vou perder por nada nesse mundo). A princípio iria falar sobre o que é Campus Party, o que você encontra lá e tal. Mas resolvi fazer diferente vou postar aqui &lt;strong&gt;conteúdo&lt;/strong&gt; criado pela Campus Party, então vai aí meu “pequeno” resumo:&lt;/p&gt;  &lt;p&gt;Palestra sobre&lt;strong&gt; Cloud Computing&lt;/strong&gt; com Fábio Kung&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:f2fcd896-c66b-4b75-b186-0e97d4df1e61" class="wlWriterEditableSmartContent"&gt;&lt;div id="ccfd5621-2921-46b8-9a8f-57bed84e25db" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=wf6Z2ddEmz8" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_WqDTFTxw_iw/S22ACEheBmI/AAAAAAAABb8/TLQwFRU_GW0/video087415a6d57a%5B4%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('ccfd5621-2921-46b8-9a8f-57bed84e25db'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/wf6Z2ddEmz8&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/wf6Z2ddEmz8&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre&lt;strong&gt; TV Digital – DATAPREV&lt;/strong&gt; com Marco Antônio Munhoz&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:593f9f52-cc1b-425c-ac98-968c5493797d" class="wlWriterEditableSmartContent"&gt;&lt;div id="e2d416ca-831c-43ac-ba94-2645cb0b8eb2" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=DdwRq5GJk-0" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_WqDTFTxw_iw/S22ACtkkgRI/AAAAAAAABcA/is87cI8DVu4/videocf3f17f184e5%5B4%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('e2d416ca-831c-43ac-ba94-2645cb0b8eb2'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/DdwRq5GJk-0&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/DdwRq5GJk-0&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre&lt;strong&gt; Ruby On Rails&lt;/strong&gt; com Fábio Akita (uma das melhores)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.slideshare.net/akitaonrails/campus-party-2010" href="http://www.slideshare.net/akitaonrails/campus-party-2010"&gt;http://www.slideshare.net/akitaonrails/campus-party-2010&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre&lt;strong&gt; Interoperabilidade&lt;/strong&gt; com Marines Gomes da Microsoft e os campeões do Imagine Cup 2009 (Recife!) :P&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:121e5d1f-d221-4043-941c-b30937f7c13c" class="wlWriterEditableSmartContent"&gt;&lt;div id="766eadcd-5fe9-4384-84d5-e671b7766c96" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=kDU3iO6se5c" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_WqDTFTxw_iw/S22ADDrvatI/AAAAAAAABcE/B1n2lRjBRJk/video598beda90cb2%5B4%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('766eadcd-5fe9-4384-84d5-e671b7766c96'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/kDU3iO6se5c&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/kDU3iO6se5c&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Obs.: o áudio no começo tá mudo, mais depois do 3º minuto fica normal :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre &lt;strong&gt;Silverlight 4.0&lt;/strong&gt; com Bruno Sonino (uma das melhores que assisti)&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:f3885ad6-82bd-4b97-8352-b206c1746d60" class="wlWriterEditableSmartContent"&gt;&lt;div id="70907320-971a-4694-9d5b-ea5fcd98f5fc" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=DrRFbjKlNW0" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_WqDTFTxw_iw/S22ADvSLMsI/AAAAAAAABcI/5hK6ifKcjEY/videoff90ccebcb6b%5B3%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('70907320-971a-4694-9d5b-ea5fcd98f5fc'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/DrRFbjKlNW0&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/DrRFbjKlNW0&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre &lt;strong&gt;ALM – Application Lifecycle Management&lt;/strong&gt;; &lt;strong&gt;ASP.NET com AJAX Iniciando o desenvolvimento com .NET&lt;/strong&gt;; &lt;strong&gt;Entity Framework 4.0&lt;/strong&gt; com Ramon Durães (todas elas muito boas)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.ramonduraes.net/post/Campus-Party-Brasil-2010-e-um-grande-sucesso.aspx" href="http://www.ramonduraes.net/post/Campus-Party-Brasil-2010-e-um-grande-sucesso.aspx"&gt;http://www.ramonduraes.net/post/Campus-Party-Brasil-2010-e-um-grande-sucesso.aspx&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre&lt;strong&gt; Windows Azure Platform&lt;/strong&gt; com Evilazaro&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.evilazaro.net/post/Palestra-Azure-Platform-na-Campus-Party-Brasil-2010.aspx" href="http://www.evilazaro.net/post/Palestra-Azure-Platform-na-Campus-Party-Brasil-2010.aspx"&gt;http://www.evilazaro.net/post/Palestra-Azure-Platform-na-Campus-Party-Brasil-2010.aspx&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;Palestra sobre &lt;strong&gt;XNA Desenvolvimento de Games&lt;/strong&gt; com Jalf&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.slideshare.net/campuspartybrasil/introduo-ao-xna-campus-party" href="http://www.slideshare.net/campuspartybrasil/introduo-ao-xna-campus-party"&gt;http://www.slideshare.net/campuspartybrasil/introduo-ao-xna-campus-party&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre &lt;strong&gt;XNA Touch Desenvolvimento de Games para iPhone&lt;/strong&gt; com Jalf&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.slideshare.net/campuspartybrasil/xna-touch-campus-party" href="http://www.slideshare.net/campuspartybrasil/xna-touch-campus-party"&gt;http://www.slideshare.net/campuspartybrasil/xna-touch-campus-party&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Palestra sobre&lt;strong&gt; Realidade Aumentada&lt;/strong&gt; com Vitor Secco&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:53dd8480-99b1-431e-bf82-f9695854c890" class="wlWriterEditableSmartContent"&gt;&lt;div id="fa3230eb-1e93-4505-88e0-1d6ac9b27cbb" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=_aJPd_k6ZxA" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_WqDTFTxw_iw/S22AENxjPsI/AAAAAAAABcM/DZrxl0GDkxI/video03b587b17d89%5B3%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('fa3230eb-1e93-4505-88e0-1d6ac9b27cbb'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/_aJPd_k6ZxA&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/_aJPd_k6ZxA&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ainda teve muitas e muitas outras palestra, postei aqui somente as que eu assisti e gostei mais…&lt;/p&gt;  &lt;p&gt;Segue também alguns links que postei durante o evento pelo Twitter (@waldyrfelix)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Vídeos&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.twitvid.com/505F8" href="http://www.twitvid.com/505F8"&gt;http://www.twitvid.com/505F8&lt;/a&gt; Barracas &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.twitvid.com/7BE72" href="http://www.twitvid.com/7BE72"&gt;http://www.twitvid.com/7BE72&lt;/a&gt; Área dos computadores &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.twitvid.com/FDF6B" href="http://www.twitvid.com/FDF6B"&gt;http://www.twitvid.com/FDF6B&lt;/a&gt; Super máquinas &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.twitvid.com/B3D6D" href="http://www.twitvid.com/B3D6D"&gt;http://www.twitvid.com/B3D6D&lt;/a&gt; Protesto Red Bull &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.twitvid.com/10B75" href="http://www.twitvid.com/10B75"&gt;http://www.twitvid.com/10B75&lt;/a&gt; Torre de Red Bull &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.twitvid.com/DA6A6" href="http://www.twitvid.com/DA6A6"&gt;http://www.twitvid.com/DA6A6&lt;/a&gt; Robô &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Fotos&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://tweetphoto.com/9989520" href="http://tweetphoto.com/9989520"&gt;http://tweetphoto.com/9989520&lt;/a&gt; Prêmio de interoperabilidade &lt;/li&gt;    &lt;li&gt;&lt;a title="http://tweetphoto.com/9989861" href="http://tweetphoto.com/9989861"&gt;http://tweetphoto.com/9989861&lt;/a&gt; Ganhei num sorteio &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.twitpic.com/zukpb" href="http://www.twitpic.com/zukpb"&gt;http://www.twitpic.com/zukpb&lt;/a&gt; Computador de R$ 18 mil &lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.twitpic.com/zv6lm" href="http://www.twitpic.com/zv6lm"&gt;http://www.twitpic.com/zv6lm&lt;/a&gt; Encontro da galera de Recife, todos da UNICAP &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_WqDTFTxw_iw/S22AEz4XS-I/AAAAAAAABcQ/HIrdg1ztta8/s1600-h/yd7%5B1%5D%5B7%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="yd7[1]" border="0" alt="yd7[1]" src="http://lh6.ggpht.com/_WqDTFTxw_iw/S22AFegnWxI/AAAAAAAABcU/pj43w_YMwxE/yd7%5B1%5D_thumb%5B5%5D.jpg?imgmax=800" width="465" height="357" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;É isso pessoal, na internet tem muito conteúdo sobre a Campus Party no Youtube &lt;a title="http://www.youtube.com/user/campusparty" href="http://www.youtube.com/user/campusparty"&gt;http://www.youtube.com/user/campusparty&lt;/a&gt;, no Flicker &lt;a title="http://www.flickr.com/photos/campuspartybr/" href="http://www.flickr.com/photos/campuspartybr/"&gt;http://www.flickr.com/photos/campuspartybr/&lt;/a&gt;, no Twitter &lt;a title="http://twitter.com" href="http://twitter.com"&gt;http://twitter.com&lt;/a&gt; hashtag #cpartybr e é claro no site oficial &lt;a title="http://www.campusparty.com.br/" href="http://www.campusparty.com.br/"&gt;http://www.campusparty.com.br/&lt;/a&gt; e no blog &lt;a title="http://www.campus-party.com.br/blogoficial/" href="http://www.campus-party.com.br/blogoficial/"&gt;http://www.campus-party.com.br/blogoficial/&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Acompanhem as novidades e vejo vocês na Campus Party 2011!&lt;/p&gt;  &lt;p&gt;Abraços.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-7178504880699182004?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2010/02/campus-party-brasil-2010.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_WqDTFTxw_iw/S22ACEheBmI/AAAAAAAABb8/TLQwFRU_GW0/s72-c/video087415a6d57a%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-4603860565611827680</guid><pubDate>Tue, 17 Nov 2009 15:43:00 +0000</pubDate><atom:updated>2009-11-17T22:08:44.914-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Fences</category><category domain="http://www.blogger.com/atom/ns#">Dica</category><category domain="http://www.blogger.com/atom/ns#">Dexpot</category><category domain="http://www.blogger.com/atom/ns#">windows seven</category><title>Melhore seu desktop no Windows 7</title><description>Há duas semanas instalei o Windows 7 que tive acesso pelo programa &lt;a href="http://www.microsoft.com/brasil/educacao/comunidadeacademica/msdnaa/default.mspx" target="_blank"&gt;MSDNAA&lt;/a&gt; da Microsoft (pra quem não conhece, é um programa de parceria entre a Microsoft e instituições de ensino, que provê acesso dos alunos aos softwares da Microsoft sem nenhum custo – para os alunos pelo menos). Por enquanto, estou adorando o sistema. Muito rápido, bonito e simples. Gostei bastante da nova barra de tarefas e tal. &lt;br /&gt;
Mas senti falta de múltiplos desktops, funcionalidade que já existe há muito tempo em outros sistemas operacionais. Pois é, quem já está usando o Windows 7 já deve saber disso, mas eu juro que esperava que a Microsoft fosse incluir esta funcionalidade – na minha opinião essencial para um programador, administrador de rede, ou qualquer pessoal que precise do mínimo de organização em meio às suas dezenas de janelas abertas.&lt;br /&gt;
&lt;br /&gt;
Bom, então fui procurar alguma solução descente na internet para o problema e achei o &lt;a href="http://www.dexpot.de/index.php?lang=en" target="_blank"&gt;Dexpot&lt;/a&gt; que é simplesmente tudo que eu queria. Ele cria desktops virtuais (até 20) e lhe dá uma gama de configurações (tanta que nem sei) para vc poder customizar ao máximo seus desktops. O programa é leve e tem suporte desde o Windows 2000 até o Windows 7, o legal é que tem alguns efeitos de transição entre os desktops, parecido com esse:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_WqDTFTxw_iw/SwLDkTz5rCI/AAAAAAAABbg/wxKk2MDh85s/s1600-h/imagem%20post%203%5B7%5D.png"&gt;&lt;img alt="imagem post 3" border="0" height="292" src="http://lh4.ggpht.com/_WqDTFTxw_iw/SwLDw0CKG7I/AAAAAAAABbk/Zdo0ZmmRPfA/imagem%20post%203_thumb%5B5%5D.png?imgmax=800" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="imagem post 3" width="452" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Bem parecido com um efeito que tem no Ubuntu, quando vc instala o Compiz, tem outros efeitos também mas eu gostei mais deste :) Além disso vc pode ter uma pré-visualização dos seus desktops:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_WqDTFTxw_iw/SwLEBLtC28I/AAAAAAAABbo/nnnhW0Mjp70/s1600-h/imagem%20post%204%5B6%5D.png"&gt;&lt;img alt="imagem post 4" border="0" height="289" src="http://lh6.ggpht.com/_WqDTFTxw_iw/SwLEJo91EeI/AAAAAAAABbs/RQCJY58bVeI/imagem%20post%204_thumb%5B4%5D.png?imgmax=800" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="imagem post 4" width="452" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Claro que se vc tiver mais que 4 desktops vai aparecer aí também… Fica aí &lt;strike&gt;a dica&lt;/strike&gt; o pedido para a Microsoft adicionar isso no próximo Windows (ou mesmo num service pack), ideia é o que não falta: &lt;a href="http://www.windows7taskforce.com/view/3420" target="_blank"&gt;veja esse link&lt;/a&gt; e &lt;a href="http://www.windows7taskforce.com/view/2085" target="_blank"&gt;esse também&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Outro aplicativo que achei bem legal e que também adotei (dica do &lt;a href="http://www.hanselman.com/blog/HerdingCatsOrganizeYourDesktopIconsWithStardockFencesForWindows.aspx" target="_blank"&gt;Scott Hanselma&lt;/a&gt;) foi a divisão do desktop em sessões, tal como esta:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh4.ggpht.com/_WqDTFTxw_iw/SwLEUbRAdJI/AAAAAAAABbw/d4PvsOrPS38/s1600-h/imagem%20post%205%5B8%5D.png"&gt;&lt;img alt="imagem post 5" border="0" height="188" src="http://lh4.ggpht.com/_WqDTFTxw_iw/SwLEhjoLpdI/AAAAAAAABb0/hB23jidBQUs/imagem%20post%205_thumb%5B4%5D.png?imgmax=800" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="imagem post 5" width="452" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Pra fazer isso vc precisa de um outro programinha chamado &lt;a href="http://www.stardock.com/products/fences/" target="_blank"&gt;Fences&lt;/a&gt;, com ele vc pode criar várias destas áreas e colocar nomes diferentes, serve como se fosse um contêiner de itens, isso deixa seu desktop bem mais organizado. E se não quiser ficar olhando o tempo todo pra eles, basta dar dois cliques na área vazia do desktop que tudo desaparece (até os ícones), muito legal. E para criar novos “fences” basta clicar arrastar e soltar com o botão direito do mouse, delimitando assim as dimensões do seu novo “fence”.&lt;br /&gt;
&lt;br /&gt;
Bem era isso que tinha pra falar, por hoje é só.&lt;br /&gt;
&lt;br /&gt;
Até a próxima.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-4603860565611827680?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/11/windows-7-nao-e-perfeito.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_WqDTFTxw_iw/SwLDw0CKG7I/AAAAAAAABbk/Zdo0ZmmRPfA/s72-c/imagem%20post%203_thumb%5B5%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-923607777577181744</guid><pubDate>Wed, 11 Nov 2009 17:23:00 +0000</pubDate><atom:updated>2009-11-11T22:55:04.511-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linguagem de programação</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Até quanto C# pode ser considerada uma linguagem funcional?</title><description>Estive brincando um pouco com expressões lambda e percebi que simplesmente não dá pra usar recursividade, o detalhe mais importante de todos é que em linguagens funcionais isso é requisito básico. Afinal de contas em linguagem &lt;b&gt;funcional&lt;/b&gt; tudo são funções, chamadas de funções e o uso de recursividade neste caso é fundamental. &lt;br /&gt;
Testando, o algoritmo recursivo mais vagabundo de todos, o de calculo fatorial, fica assim:&lt;br /&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New,monospace; font-size: small;"&gt;&lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; fat = (b) =&amp;gt; (b &amp;lt;= &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;) ? &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt; : b * fat(b – &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
Parece bem obvio que isto funciona, mas não funciona… Ao compilar a instrução acima dispara este erro de compilação:&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_WqDTFTxw_iw/Svry86O5oII/AAAAAAAABa8/U5tPwxz_FtI/s1600-h/image%5B16%5D.png"&gt;&lt;img alt="image" border="0" height="130" src="http://lh5.ggpht.com/_WqDTFTxw_iw/Svry-dLpldI/AAAAAAAABbA/t_FO-SuoL2Y/image_thumb%5B10%5D.png?imgmax=800" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" width="293" /&gt;&lt;/a&gt;&lt;br /&gt;
Bonito né? Não, eu não achei nem um pouco bonito, que tipo de expressão “lambda” é essa que não permite fazer chamadas recursivas de si mesma?&lt;br /&gt;
Tentei novamente, agora usando todo o dinamismo do C# 4.0, que alias, é lindo - mas vou falar sobre isso noutro post – e ficou assim:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;span style="font-family: Courier New,monospace; font-size: small;"&gt;&lt;span style="color: blue;"&gt;dynamic&lt;/span&gt;&lt;span style="color: black;"&gt; fat = (&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;)((b) =&amp;gt; (b &amp;lt;= &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;) ? &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt; : b * fat(b - &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Pois também não compila! E acusa o mesmo erro de antes – talvez não foi dinâmico o suficiente…&lt;br /&gt;
Apelando mais um pouco dá pra “emular” uma chamada recursiva assim:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;span style="font-family: Courier New,monospace; font-size: small;"&gt;&lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; fat = &lt;/span&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;span style="color: black;"&gt;;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New,monospace; font-size: small;"&gt;&lt;span style="color: black;"&gt;fat = (b) =&amp;gt; (b &amp;lt;= &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;) ? &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt; : b * fat(b - &lt;/span&gt;&lt;span style="color: brown;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Antes que alguém pergunte: digo “emular” porque na verdade isso não é uma recursão é chamada de delegate – delegate que chama delegate. Isso é recursão? Não!&lt;br /&gt;
Nas linguagens funcionais de verdade tal como &lt;a href="http://pt.wikipedia.org/wiki/Lisp" target="_blank"&gt;Lisp&lt;/a&gt;, &lt;a href="http://pt.wikipedia.org/wiki/Scheme" target="_blank"&gt;Scheme&lt;/a&gt; e &lt;a href="http://pt.wikipedia.org/wiki/Haskell_%28linguagem_de_programa%C3%A7%C3%A3o%29" target="_blank"&gt;Haskell&lt;/a&gt; não existe nenhum comando mágico que sirva para fazer iteração (sem &lt;i&gt;for&lt;/i&gt; ou &lt;i&gt;while&lt;/i&gt;, &lt;i&gt;foreach &lt;/i&gt;nem pensar), temos somente que nos apegar as recursões. Veja o exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;span style="font-family: Courier New,monospace; font-size: small;"&gt;(&lt;span style="color: blue;"&gt;define&lt;/span&gt; (fat n) (&lt;span style="color: blue;"&gt;if&lt;/span&gt; (= n &lt;span style="color: brown;"&gt;1&lt;/span&gt;) &lt;span style="color: brown;"&gt;1&lt;/span&gt; (* n (fat (- n &lt;span style="color: brown;"&gt;1&lt;/span&gt;)))))&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Isso aí é meu algoritmo fatorial em &lt;a href="http://pt.wikipedia.org/wiki/Scheme" target="_blank"&gt;Scheme&lt;/a&gt;, já deve ter percebido porque as linguagens funcionais não são lá muito populares né? Apesar que se vc estudar um pouco vai ver que são linguagens extremamente simples, mas vamos em frente com outro exemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;span style="font-family: Courier New,monospace; font-size: small;"&gt;fat = &lt;span style="color: blue;"&gt;lambda&lt;/span&gt; x: &lt;span style="color: brown;"&gt;1&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; x &amp;lt;= &lt;span style="color: brown;"&gt;1&lt;/span&gt; &lt;span style="color: blue;"&gt;else&lt;/span&gt; fat(x-&lt;span style="color: brown;"&gt;1&lt;/span&gt;) * x&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;br /&gt;
Isso aí agora é &lt;a href="http://pt.wikipedia.org/wiki/Python" target="_blank"&gt;Python&lt;/a&gt;, pois é, &lt;a href="http://pt.wikipedia.org/wiki/Python" target="_blank"&gt;Python&lt;/a&gt; é uma linguagem multi-paradigma e dinâmica onde dá para programar de forma estruturada, orientada a objetos ou mesmo como uma linguagem funcional (ver também &lt;a href="http://www.codeplex.com/wikipage?ProjectName=IronPython" target="_blank"&gt;IronPython&lt;/a&gt;). Bem mais fácil de entender…&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
O que eu quero dizer com todo essa conversa é que a Microsoft não tem intuito de torna C# uma linguagem dinâmica como &lt;a href="http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa%C3%A7%C3%A3o%29" target="_blank"&gt;Ruby&lt;/a&gt; (ver também &lt;a href="http://www.ironruby.net/" target="_blank"&gt;IronRuby&lt;/a&gt;), nem totalmente funcional como &lt;a href="http://pt.wikipedia.org/wiki/Lisp" target="_blank"&gt;Lisp&lt;/a&gt; (ver também linguagem funcional da Microsoft, o &lt;a href="http://pt.wikipedia.org/wiki/F_Sharp" target="_blank"&gt;F#&lt;/a&gt;). Estas &lt;strike&gt;novas&lt;/strike&gt; características da linguagem tem mais a ver com evolução natural do C# e necessidade de se ter uma ferramenta cada vez mais flexível, deixando o desenvolvimento de software cada vez mais ágil e simplificando a vida dos desenvolvedores.&lt;br /&gt;
&lt;/div&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;br /&gt;
Então, não pense que o C# vai ser tão dinâmico quanto &lt;a href="http://pt.wikipedia.org/wiki/Python" target="_blank"&gt;Python&lt;/a&gt; ou tão funcional quanto &lt;a href="http://pt.wikipedia.org/wiki/Lisp" target="_blank"&gt;Lisp&lt;/a&gt;, isso nunca vai acontecer. Mas isso não quer dizer que a Microsoft não possa dar um suporte melhor à programação dinâmica e funcional. Apesar que isso poderá mudar em breve, talvez no C# 5.0, vamos esperar pra ver.&lt;br /&gt;
&lt;/div&gt;
&lt;div class="western" style="margin-bottom: 0cm;"&gt;
&lt;br /&gt;
Por hoje é só, até a próxima.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-923607777577181744?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/11/ate-quanto-c-pode-ser-considerada-uma.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_WqDTFTxw_iw/Svry-dLpldI/AAAAAAAABbA/t_FO-SuoL2Y/s72-c/image_thumb%5B10%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-3236803267437882035</guid><pubDate>Sat, 31 Oct 2009 12:14:00 +0000</pubDate><atom:updated>2009-10-31T09:15:17.399-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Usando parâmetros opcionais no C# 4.0</title><description>&lt;br /&gt;Olá pessoal, hoje vamos falar um pouco sobre um novo recurso do C# 4.0, os parâmetros opcionais.   &lt;br /&gt;Para isto utilizaremos um código bem simples que gera strings, segue:   &lt;br /&gt;  &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] GerarString()      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; GerarString(&lt;span style="color: #a31515"&gt;&amp;quot;Parâmetros&amp;quot;&lt;/span&gt;);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] GerarString(&lt;span style="color: blue"&gt;string&lt;/span&gt; str)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; GerarString(str, &lt;span style="color: brown"&gt;10&lt;/span&gt;);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] GerarString(&lt;span style="color: blue"&gt;string&lt;/span&gt; str, &lt;span style="color: blue"&gt;int&lt;/span&gt; qtd)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; lista = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;(); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i = &lt;span style="color: brown"&gt;0&lt;/span&gt;; i &amp;lt; qtd; i++) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lista.Add(str); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; lista.ToArray(); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-size: 9pt"&gt;} &lt;/span&gt;    &lt;br /&gt;Como vocês estão vendo, aqui utilizei 3 métodos sobrecarregados, onde posso chamá-los passando a string que eu quero gerar e a quantidade de repetições, ou somente a string que eu quero gerar (neste caso a quantidade default é 10), ou mesmo não passar nenhum parâmetro (neste caso a quantidade default é 10 e o string é &amp;quot;Parâmetros&amp;quot;).     &lt;br /&gt;Bem, não há novidade nenhuma até agora. O fato é que parâmetros default têm o funcionamento parecido com os métodos sobrecarregados e torna a linguagem mais expressiva, vamos ver agora o código a seguir:&lt;/div&gt;  &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] GerarString(&lt;span style="color: blue"&gt;string&lt;/span&gt; str = &lt;span style="color: #a31515"&gt;&amp;quot;Parâmetros&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt; qtd = &lt;span style="color: brown"&gt;10&lt;/span&gt;)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; lista = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i = &lt;span style="color: brown"&gt;0&lt;/span&gt;; i &amp;lt; qtd; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160; lista.Add(str);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;}     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; lista.ToArray();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;}&lt;/span&gt;&lt;/div&gt;  &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;/span&gt;Ficou bem mais simples e bem menor! O que acontece agora é que estamos dizendo ao compilador que se nada for passado no parâmetro str ele assumirá o valor &amp;quot;Parâmetros&amp;quot; e se nada for passado no parâmetro qtd ele assumirá o valor 10. Isso significa que podemos passar ou não os parâmetros (opcionais) e as chamadas ficam idênticas a como fazíamos com a sobrecarga de método:&lt;/div&gt;  &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt; color: green"&gt;// sem passar nenhum parâmetro, neste caso assume os defaults     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;GerarString();&lt;/span&gt;&lt;/div&gt;  &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: green"&gt;// passando somente o ultimo parâmetro, neste caso somente str assume o default     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;GerarString(&lt;span style="color: brown"&gt;15&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;  &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: green"&gt;// passando ambos, nenhum parâmetro assume o default     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;GerarString(&lt;span style="color: #a31515"&gt;&amp;quot;Agora tou passando&amp;quot;&lt;/span&gt;,&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: brown"&gt;30&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;  &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;/span&gt;Legal, mas temos que ter em mente algumas regrinhas na hora de sair programando com parâmetros opcionais.&lt;/div&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;É possível especificar quantos parâmetros opcionais você quiser, desde que comece do ultimo para o primeiro.&lt;/div&gt;   &lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;       &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; Calcular(&lt;span style="color: blue"&gt;int&lt;/span&gt; a, &lt;span style="color: blue"&gt;int&lt;/span&gt; b, &lt;span style="color: blue"&gt;int&lt;/span&gt; c = &lt;span style="color: brown"&gt;10&lt;/span&gt;) &lt;span style="color: green"&gt;// isso é permitido&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; Calcular(&lt;span style="color: blue"&gt;int&lt;/span&gt; a = &lt;span style="color: brown"&gt;10&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt; b, &lt;span style="color: blue"&gt;int&lt;/span&gt; c) &lt;span style="color: green"&gt;// isso NÃO é permitido&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;     &lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;     &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: green"&gt;&lt;/span&gt;&lt;/span&gt;Não é permitido intercalar parâmetros opcionais e não opcionais.&lt;/div&gt;   &lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;       &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; Calcular(&lt;span style="color: blue"&gt;int&lt;/span&gt; a = &lt;span style="color: brown"&gt;2&lt;/span&gt;, &lt;span style="color: blue"&gt;int&lt;/span&gt; b, &lt;span style="color: blue"&gt;int&lt;/span&gt; c = &lt;span style="color: brown"&gt;8&lt;/span&gt;) &lt;span style="color: green"&gt;// isso NÃO é permitido&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;     &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;Caso todos os parâmetros do método sejam opcionais é possível escolher quais poderemos passar usando parâmetros nomeados.&lt;/div&gt;   &lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;       &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;Calcular(b: &lt;span style="color: brown"&gt;1&lt;/span&gt;); &lt;span style="color: green"&gt;// especifica somente b, enquanto a e c assumem o default&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: green"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Calcular(b: &lt;span style="color: brown"&gt;5&lt;/span&gt;, c: &lt;span style="color: brown"&gt;4&lt;/span&gt;); &lt;span style="color: green"&gt;// especifica somente b e c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: green"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Calcular(b: &lt;span style="color: brown"&gt;5&lt;/span&gt;, a: &lt;span style="color: brown"&gt;10&lt;/span&gt;, c: &lt;span style="color: brown"&gt;4&lt;/span&gt;); &lt;span style="color: green"&gt;// ou mesmo especificados (a ordem não importa)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;     &lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;     &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: green"&gt;&lt;/span&gt;&lt;/span&gt;O parâmetro default sempre deve ser uma constante.&lt;/div&gt;   &lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;       &lt;div style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;Calcular(&lt;span style="color: blue"&gt;int&lt;/span&gt; a, &lt;span style="color: blue"&gt;int&lt;/span&gt; b, &lt;span style="color: blue"&gt;int&lt;/span&gt; c = SelecionarC()) &lt;span style="color: green"&gt;// isso NÃO é possível&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;     &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;&lt;span style="font-size: 9pt"&gt;&lt;span style="color: green"&gt;&lt;/span&gt;&lt;/span&gt;Como podemos observar existem grandes aplicações para este novo recurso do C#, façam bom uso dele. Espero que tenham gostado.&lt;/p&gt;  &lt;p style="font-family: &amp;quot;Courier New&amp;quot;,courier,monospace"&gt;Tchau e até a próxima.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-3236803267437882035?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/10/usando-parametros-opcionais-no-c-4.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-6844938900532448802</guid><pubDate>Tue, 27 Oct 2009 03:30:00 +0000</pubDate><atom:updated>2009-10-27T00:32:34.894-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">t-sql</category><category domain="http://www.blogger.com/atom/ns#">sql server</category><title>Verificando existência de Objetos no SQL Server</title><description>&lt;span xmlns=''&gt;&lt;p&gt;Olá, após um longo tempo fora do meu blog volto com força total e neste post vou falar um pouco sobre como podemos obter informações sobre existência de objetos numa base SQL Server. Entenda "objeto" como qualquer coisa que possa ser manipulada no banco tal como tabelas, colunas, constraints, índices, chaves primárias, etc.
&lt;/p&gt;&lt;p&gt;No SQL Server existe uma função Object_ID()  que é muito útil na hora de descobrir a existência de elementos no banco.
&lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;-- Retorno o id do objeto do elemento buscado
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;if&lt;/span&gt;
     &lt;span style='color:fuchsia'&gt;Object_ID&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'CK_NIVEL'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
     &lt;span style='color:gray'&gt;IS&lt;/span&gt;
     &lt;span style='color:gray'&gt;NOT&lt;/span&gt;
     &lt;span style='color:gray'&gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    &lt;span style='color:blue'&gt;print&lt;/span&gt;
     &lt;span style='color:red'&gt;'sim, existe!!!'&lt;/span&gt;
     &lt;span style='color:green'&gt;-- aqui vc faz o que quiser
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Como vimos acima o uso da função Object_ID() bem simples e pode ser usado para quase qualquer tipo de objeto que exista – ou não – na base de dados. Só que nem sempre ela é suficiente, por exemplo, se precisarmos então descobrir se existe uma determinada coluna na tabela tal? Para estes casos teremos que usar as tabelas do sistema do SQL Server.
&lt;/p&gt;&lt;p&gt;A lista é imensa, mas vou tentar resumir pra vocês somente o que interessa. Vamos lá!
&lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;-- Verifica a existência da contraint CK_NIVEL na tabela USUARIO
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;if&lt;/span&gt;
     &lt;span style='color:gray'&gt;exists&lt;/span&gt;
     &lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;select&lt;/span&gt; 1 &lt;span style='color:blue'&gt;from&lt;/span&gt;
     &lt;span style='color:green'&gt;INFORMATION_SCHEMA.TABLE_CONSTRAINTS&lt;/span&gt;
     &lt;span style='color:blue'&gt;where&lt;/span&gt; TABLE_NAME&lt;span style='color:gray'&gt;=&lt;/span&gt;&lt;span style='color:red'&gt;'USUARIO'&lt;/span&gt;
     &lt;span style='color:gray'&gt;and&lt;/span&gt; CONSTRAINT_NAME&lt;span style='color:gray'&gt;=&lt;/span&gt;&lt;span style='color:red'&gt;'CK_NIVEL'&lt;/span&gt;&lt;span style='color:gray'&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    &lt;span style='color:blue'&gt;print&lt;/span&gt;
     &lt;span style='color:red'&gt;'sim, existe!!!'&lt;/span&gt;
     &lt;span style='color:green'&gt;-- aqui vc faz o que quiser
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;-- Verifica a exitência da coluna POSOLOGIA na tabela MEDICAMENTO
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;if&lt;/span&gt;
     &lt;span style='color:gray'&gt;exists&lt;/span&gt;
     &lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;select&lt;/span&gt; 1 &lt;span style='color:blue'&gt;from&lt;/span&gt;
     &lt;span style='color:green'&gt;INFORMATION_SCHEMA.COLUMNS&lt;/span&gt;
     &lt;span style='color:blue'&gt;where&lt;/span&gt; TABLE_NAME&lt;span style='color:gray'&gt;=&lt;/span&gt;&lt;span style='color:red'&gt;'MEDICAMENTO'&lt;/span&gt;
     &lt;span style='color:gray'&gt;and&lt;/span&gt; COLUMN_NAME&lt;span style='color:gray'&gt;=&lt;/span&gt;&lt;span style='color:red'&gt;'POSOLOGIA'&lt;/span&gt;&lt;span style='color:gray'&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    &lt;span style='color:blue'&gt;print&lt;/span&gt;
     &lt;span style='color:red'&gt;'sim, existe!!!'&lt;/span&gt;
     &lt;span style='color:green'&gt;-- aqui vc faz o que quiser
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;-- Verifica existência da chave estrangeira FK_VENDA na tabela PEDIDO, mas também poderia ser uma chave primária
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;if&lt;/span&gt;
     &lt;span style='color:gray'&gt;exists&lt;/span&gt;
     &lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;select&lt;/span&gt; 1 &lt;span style='color:blue'&gt;from&lt;/span&gt;
     &lt;span style='color:green'&gt;INFORMATION_SCHEMA.KEY_COLUMN_USAGE&lt;/span&gt;
     &lt;span style='color:blue'&gt;where&lt;/span&gt; TABLE_NAME&lt;span style='color:gray'&gt;=&lt;/span&gt;&lt;span style='color:red'&gt;'PEDIDO'&lt;/span&gt;
     &lt;span style='color:gray'&gt;and&lt;/span&gt; CONSTRAINT_NAME&lt;span style='color:gray'&gt;=&lt;/span&gt;&lt;span style='color:red'&gt;'FK_VENDA'&lt;/span&gt;&lt;span style='color:gray'&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    &lt;span style='color:blue'&gt;print&lt;/span&gt;
     &lt;span style='color:red'&gt;'sim, existe!!!'&lt;/span&gt;
     &lt;span style='color:green'&gt;-- aqui vc faz o que quiser
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;-- Verifica se existe o indice IX_NOME
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;if&lt;/span&gt;
     &lt;span style='color:gray'&gt;exists&lt;/span&gt;
     &lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;select&lt;/span&gt; 1 &lt;span style='color:blue'&gt;from&lt;/span&gt;
     &lt;span style='color:green'&gt;sys.sysindexes&lt;/span&gt;
     &lt;span style='color:blue'&gt;where&lt;/span&gt; name&lt;span style='color:gray'&gt;=&lt;/span&gt;&lt;span style='color:red'&gt;'IX_NOME'&lt;/span&gt;&lt;span style='color:gray'&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    &lt;span style='color:blue'&gt;print&lt;/span&gt;
     &lt;span style='color:red'&gt;'sim, existe!!!'&lt;/span&gt;
     &lt;span style='color:green'&gt;-- aqui vc faz o que quiser
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Na verificação de índices tem uma peculiaridade: a nossa funçãozinha mágica Object_ID() não funciona para índices... Não me pergunte por que, mas é isso.
&lt;/p&gt;&lt;p&gt;Espero ter ajudado em algo, se tiver mas algum item para incluir na lista por favor postem aí!!!
&lt;/p&gt;&lt;p&gt;Abraços e até a próxima.&lt;span style='text-decoration:underline'&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-6844938900532448802?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/10/verificando-existencia-de-objetos-no.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-6022343228652516961</guid><pubDate>Sun, 21 Jun 2009 13:15:00 +0000</pubDate><atom:updated>2009-06-21T10:22:40.738-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">Bluetooth</category><title>Bluetooth com a API 32feet</title><description>&lt;span xmlns=''&gt;&lt;p&gt;Recentemente precisei usar Bluetooth em um projeto da faculdade na cadeira de Arquitetura e Organização de Computadores. Pesquisei bastante procurando alguma API que fizesse o trabalho pesado e me deixasse abstrair um monte de coisas, como Socket e API do Windows, por exemplo. Então encontrei uma biblioteca formidável escrita em .NET chamada 32feet que foi desenvolvida por uma empresa chamada In The Hand (estranho o nome, não é?), mas é isso mesmo. O código fonte desta biblioteca é a aberto e está hospedado no &lt;a href='http://www.codeplex.com/32feet/'&gt;Codeplex&lt;/a&gt;. 
&lt;/p&gt;&lt;p&gt;O 32feet foi muito bem desenvolvido e nos traz facilidades incríveis na hora de manipular dispositivos Bluetooth. Vou mostrar algumas funcionalidades bem legais: detectar dispositivos, pareá-los e enviar um arquivo. Para começar você deve baixar os arquivos necessários e instalá-los corretamente a partir do endereço &lt;a href='http://www.codeplex.com/32feet/'&gt;http://www.codeplex.com/32feet/&lt;/a&gt;, referenciar o namespace InTheHand.Net.Personal no seu projeto no Visual Studio e mãos à obra!
&lt;/p&gt;&lt;h4&gt;Detectando dispositivos&lt;/h4&gt;&lt;p&gt;Para começar vamos detectar os dispositivos ao redor, tarefa simples com o 32feet.
&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#2b91af'&gt;BluetoothClient&lt;/span&gt; client = &lt;span style='color:blue'&gt;new&lt;/span&gt;&lt;span style='color:#2b91af'&gt;BluetoothClient&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#2b91af'&gt;BluetoothDeviceInfo&lt;/span&gt;[]&lt;span style='color:#2b91af'&gt;
 &lt;/span&gt;arrDevices = client.DiscoverDevices();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    Pronto! Este código funciona perfeitamente e detecta todos os dispositivos que estão próximos, autenticados ou acessados recentemente pelo rádio Bluetooth se precisar filtrar mais o dispositivos retornados pelo método DiscoverDevices, existe uma sobrecarga deste método que possibilita customizar o retorno, informando a quantidade máxima de dispositivos, se vai retornar os autenticados, conhecidos e/ou os desconhecidos (dispositivos novos). Dentro da classe BluetoothDeviceInfo estão todas as informações pertinentes ao dispositivo que foi detectado, onde os principais são DeviceAddress e DeviceName.
&lt;/p&gt;&lt;h4&gt;Pareando um dispositivo
&lt;/h4&gt;&lt;p&gt;    A maioria das operações com Bluetooth necessitam do DeviceAddress, que é o endereço identificador do dispositivo, é como o IP para os computadores em rede. Para parear um dispositivo obviamente temos que ter o endereço dele em mãos, aí fica fácil parear, bastando chamar um método.
&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#2b91af'&gt;BluetoothSecurity&lt;/span&gt;.PairRequest(device.DeviceAddress, "1");
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    Este trecho de código é super simples, o método PairRequest manda um requisição de pareamento para um dispositivo, o primeiro parâmetro é o endereço do dispositivo em questão e o segundo é a chave de pareamento que no meu caso é "1". Este método retorna true se o pareamento ocorreu com sucesso ou false se, por algum motivo, o pareamento não pode ser concluído.
&lt;/p&gt;&lt;h4&gt;Enviando um arquivo&lt;/h4&gt;&lt;p&gt;    O envio de arquivo usei duas classes especiais da biblioteca, ObexWebRequest e ObexWebResponse. OBEX é a abreviação para Object Exchange que é um protocolo que facilita a troca de arquivos binários entre dispositivos (&lt;a href='http://en.wikipedia.org/wiki/OBEX'&gt;leia mais&lt;/a&gt;).
&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;string&lt;/span&gt; arquivo = &lt;span style='color:#a31515'&gt;"...URL DO ARQUIVO..."&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#2b91af'&gt;Uri&lt;/span&gt; uri = &lt;span style='color:blue'&gt;new&lt;/span&gt;
     &lt;span style='color:#2b91af'&gt;Uri&lt;/span&gt;(&lt;span style='color:#a31515'&gt;"obex://"&lt;/span&gt; + device.DeviceAddress.ToString() + &lt;span style='color:#a31515'&gt;"/"&lt;/span&gt; + arquivo);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#2b91af'&gt;ObexWebRequest&lt;/span&gt; request = &lt;span style='color:blue'&gt;new&lt;/span&gt;&lt;span style='color:#2b91af'&gt;ObexWebRequest&lt;/span&gt;(uri);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;request.ReadFile(arquivo);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#2b91af'&gt;ObexWebResponse&lt;/span&gt; response = (&lt;span style='color:#2b91af'&gt;ObexWebResponse&lt;/span&gt;)request.GetResponse();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;response.Close();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    O uso do Obex é bastante simplificado, pois funciona igual a uma requisição web qualquer. Neste exemplo estou passando o nome do arquivo para o método ReadFile, mas poderia ter feito diferente passando o Stream diretamente para o construtor sobrecarregado ObexWebRequest.
&lt;/p&gt;&lt;p&gt;    Bom, acredito que com esta brevíssima introdução deu pra ter idéia de como funciona esta maravilhosa biblioteca. Para quem quiser se aprofundar deixo os links principais:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://inthehand.com/content/32feet.aspx'&gt;http://inthehand.com/content/32feet.aspx&lt;/a&gt;
    &lt;/li&gt;&lt;li&gt;&lt;a href='http://www.codeplex.com/32feet/'&gt;http://www.codeplex.com/32feet/&lt;/a&gt;
    &lt;/li&gt;&lt;li&gt;&lt;a href='http://inthehand.com/forums/default.aspx?GroupID=29'&gt;http://inthehand.com/forums/default.aspx?GroupID=29&lt;/a&gt;
    &lt;/li&gt;&lt;li&gt;&lt;a href='http://inthehand.com/library/'&gt;http://inthehand.com/library/&lt;/a&gt;
    &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;[]s&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-6022343228652516961?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/06/bluetooth-com-api-32feet.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-198001311150101213</guid><pubDate>Sat, 11 Apr 2009 02:38:00 +0000</pubDate><atom:updated>2009-04-10T23:40:50.129-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Atalhos do Visual Studio</title><description>&lt;span xmlns=''&gt;&lt;p&gt;No Visual Studio existem muitos atalhos bastante úteis. Muitos deles estão listados neste post de André Furtado &lt;a href='http://afurtado1980.spaces.live.com/blog/cns!63514833CE40C143!686.entry'&gt;http://afurtado1980.spaces.live.com/blog/cns!63514833CE40C143!686.entry&lt;/a&gt;. 
&lt;/p&gt;&lt;p&gt;Outro atalho que descobri por acaso há algumas semanas é o &lt;span style='text-decoration:underline'&gt;CTRL+SHIFT+V&lt;/span&gt; que serve para colar pedaços de textos que foram usados recentemente em outras "colagens". Com este atalho não é preciso mais copiar e colar a mesma coisa repetidas vezes, pois o VS guarda na memória o histórico de tudo o que foi colado recentemente, para acessar as colagens anteriores basta teclar &lt;span style='text-decoration:underline'&gt;CTRL+SHIFT+V&lt;/span&gt; várias vezes até chegar no trecho que você quer.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-198001311150101213?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/04/atalhos-do-visual-studio.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-1854377271375288435</guid><pubDate>Wed, 04 Mar 2009 02:43:00 +0000</pubDate><atom:updated>2009-03-03T23:43:02.289-03:00</atom:updated><title>Competição Info Arena</title><description>&lt;p&gt;Recebi uma notícia bem legal hoje, sobre a competição de programação organizada pela INFO.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://info.abril.com.br/blog/arena/" href="http://info.abril.com.br/blog/arena/"&gt;http://info.abril.com.br/blog/arena/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;E aí, vai encarar ?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-1854377271375288435?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/03/competicao-info-arena.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-3552424115357088643</guid><pubDate>Sun, 01 Mar 2009 07:10:00 +0000</pubDate><atom:updated>2009-03-01T04:29:56.174-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Matemática</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Arredondamento de casas decimais</title><description>&lt;p&gt;Quando trabalhamos com arredondamento de números reais nos deparamos com algo como:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;1,9349 arredondando para 2 casas fica 1,93 &lt;/li&gt;    &lt;li&gt;1,9351 arredondando para 2 casas fica 1,94 &lt;/li&gt;    &lt;li&gt;E 1,9350 arredondando para 2 casas fica 1,93 ou seria 1,94 ? &lt;b&gt;O correto é 1,94! (arredonda-se para cima)&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;E 1,9250 arredondando para 2 casas fica 1,92 ou seria 1,93 ? &lt;b&gt;O correto é 1,92! (arredonda-se para baixo)&lt;/b&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Parece coisa de doido mas não é. Diz a regra “Se o algarismo decimal seguinte for igual a 5, o anterior incrementa-se em uma unidade caso ele seja impar. Caso seja par basta conservar o algarismo” (&lt;a href="http://pt.wikipedia.org/wiki/Arredondamento" target="_blank"&gt;definição do wikipedia&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Esta regra diminui os erros de arredondamento (&lt;a href="http://pt.wikipedia.org/wiki/Erro_de_arredondamento" target="_blank"&gt;mais sobre&lt;/a&gt;) em 50%, pois metade das vezes aproxima para cima e metade das vezes aproxima para baixo.&lt;/p&gt;  &lt;p&gt;Em .NET quando você usa Math.Round() este comportamento é o padrão, tanto para double quanto para decimal.&lt;/p&gt;  &lt;p&gt;O mais legal é que em .NET é possível alterar o comportamento padrão do método Round passando um terceiro parâmetro chamado MidpointRounding que, na verdade, é um enum que pode assumir os valores MidpointRounding.AwayFromZero (arredonda sempre para cima) ou MidpointRounding.ToEven (arredonda pra cima se for ímpar ou mantém o valor se for par).&lt;/p&gt;  &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WqDTFTxw_iw/Sao4gvNq4GI/AAAAAAAABAU/pGYNHqCNNEs/s1600-h/imagem.GIF"&gt;&lt;img id="BLOGGER_PHOTO_ID_5308117245890322530" style="float: left; margin: 5px 10px 10px 5px; width: 109px; cursor: hand" height="114" alt="" src="http://1.bp.blogspot.com/_WqDTFTxw_iw/Sao4gvNq4GI/AAAAAAAABAU/pGYNHqCNNEs/s200/imagem.GIF" width="115" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Aqui vai um print screen de um código em C# executando as operações com MidpointRounding.AwayFromZero, com MidpointRounding.ToEven e sem MidpointRounding. &lt;/p&gt;  &lt;p&gt;(clique para ampliar)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Para ler mais sobre MidpointRounding vai aí um &lt;a href="http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx" target="_blank"&gt;link&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;[]s&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-3552424115357088643?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/03/arredondamento-de-casas-decimais.html</link><author>noreply@blogger.com (Waldyr Felix)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_WqDTFTxw_iw/Sao4gvNq4GI/AAAAAAAABAU/pGYNHqCNNEs/s72-c/imagem.GIF" height="72" width="72" /><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-3823013227812957800</guid><pubDate>Sun, 15 Feb 2009 01:09:00 +0000</pubDate><atom:updated>2009-02-14T22:14:15.002-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linguagem de programação</category><category domain="http://www.blogger.com/atom/ns#">C/C++</category><title>Convenções na passagem de arrays por parâmetro</title><description>&lt;p&gt;Esta semana estava eu assistindo aula de Paradigma de Linguagens de Programação quando meu professor – maluquinho da silva – disse que o fato de um array em C não poder ser passado por valor para dentro de uma função era um erro de projeto, porque fere o princípio de ortogonalidade e etc. Pera lá, a primeira vista soa no mínimo estranho dizer que houve erro de projeto numa linguagem tão fantástica e bem sucedida quanto C, mas de fato existiram muitos. Mas acredito que a convenção na passagem de arrays por parâmetro não seja o caso.&lt;/p&gt;  &lt;p&gt;Na verdade, quando passamos um array por parâmetro em C, seja lá qual tipo for, o que é de fato passado é o primeiro elemento do array. A partir do primeiro elemento você pode – usando aritmética de ponteiros – achar qualquer outro elemento deste array. Isto explica o porque das sintaxes tão variadas no tratamento dos arrays.&lt;/p&gt;  &lt;p&gt;Estas sintaxes funcionam todas sem problemas:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="398"&gt;         &lt;p&gt;&lt;font face="Courier New" color="#808080" size="2"&gt;/*              &lt;br /&gt;o ponteiro ‘arr’ recebe o endereço do 1º elemento do array               &lt;br /&gt;*/               &lt;br /&gt;void escreve_tudo(int * arr, int n){               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for(i = 0; i &amp;lt; n; ++i)               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%d\n&amp;quot;, arr[i]);               &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New" color="#808080" size="2"&gt;/*              &lt;br /&gt;neste caso ‘arr’ também é um ponteiro para o endereço do 1º elemento do array               &lt;br /&gt;*/               &lt;br /&gt;void escreve_tudo(int arr[], int n){               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for(i = 0; i &amp;lt; n; ++i)               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%d\n&amp;quot;, arr[i]);               &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New" color="#808080" size="2"&gt;/*              &lt;br /&gt;mesmo especificando o tamanho recebido em ‘arr’ a semântica é da vista acima, pois em não existe checagem de limites de matrizes em tempo de compilação – tanto faz passar ou não o tamanho do array               &lt;br /&gt;*/               &lt;br /&gt;void escreve_tudo(int arr[10], int n){               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for(i = 0; i &amp;lt; n; ++i)               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%d\n&amp;quot;, arr[i]);               &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;A pergunta é: Será mesmo que os projetistas da linguagem C erraram nisto ou será que é um acerto de projeto? &lt;/p&gt;  &lt;p&gt;Na minha opinião está mais para acerto de projeto do que para erro. Pois imagine só se todas as vezes que passassemos um array - coisa pouca, uns 1000 elementos só - por parâmetro para uma função ele fosse todo novamente copiado para outra área da memória (&lt;a href="http://equipe.nce.ufrj.br/adriano/c/apostila/funcao.htm" target="_blank"&gt;mais sobre passagem por valor e referência aqui&lt;/a&gt;), imagine agora que esta função fosse uma função recursiva. É isto mesmo, caos total… Daí você pode perguntar: Então não seria melhor apenas criar uma forma de passar um array tanto por valor quanto por referência e aí o programador decidiria o que usar?&amp;#160; &lt;br /&gt;Dúvido que algum programador bem formado e em sã conciência iria usar uma passagem por valor de um array.&lt;/p&gt;  &lt;p&gt;Uma prova da inutilidade – e periculosidade - da passagem por valor de arrays é que nenhuma das linguagens mais famosas e utilizadas – tais como Java e C# – têm esta capacidade. Será mesmo que as equipes que implementaram Java e C# deixaram passar um erro de projeto de C? Acredito que não.&lt;/p&gt;  &lt;p&gt;Fico por aqui, até mais.&lt;/p&gt;  &lt;p&gt;[]s&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-3823013227812957800?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/02/convencoes-na-passagem-de-arrays-por.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-1548608384626392615</guid><pubDate>Sun, 08 Feb 2009 16:10:00 +0000</pubDate><atom:updated>2009-03-01T15:24:30.069-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mobile</category><title>Microsoft pode lançar seu próprio smartphone, diz especialista</title><description>&lt;p&gt;Quase caí da cadeira quando li esta reportagem:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Os rumores de que a Microsoft vai lançar seu próprio smartphone estão crescendo novamente, em especial após um analista declarar que o aparelho pode ser lançado no GSMA Mobile World Congress (MWC), entre 16 e 19 de fevereiro, em Barcelona. […]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Pelo visto a Microsoft quer ampliar ainda mais o que educadamente chamamos de “fatia do mercado” (em outras palavras: monopólio). Talvez esta seja uma maneira que a Microsoft encontrou de manter o Windows Mobile competitivo no mercado, já que o &lt;a href="http://info.abril.com.br/aberto/infonews/012009/19012009-42.shl" target="_blank"&gt;Android&lt;/a&gt; está vindo com força total.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://idgnow.uol.com.br/telecom/2009/02/06/microsoft-pode-lancar-seu-proprio-smartphone-diz-especialista/" target="_blank"&gt;Ver reportagem completa no IDG Now!&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;[]s&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-1548608384626392615?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/02/microsoft-pode-lancar-seu-proprio.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7108887360952377006.post-5151719535113390552</guid><pubDate>Sun, 08 Feb 2009 05:37:00 +0000</pubDate><atom:updated>2009-03-01T15:24:57.166-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">windows seven</category><title>Windows Seven</title><description>&lt;p&gt;Para quem ainda não viu, segue um vídeo do You tube (um tanto comercial) mas dá uma boa ideia do que esperar da nova versão do Windows.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=aLU34h8SCF4"&gt;http://www.youtube.com/watch?v=aLU34h8SCF4&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;[]s&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7108887360952377006-5151719535113390552?l=waldyrfelix.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://waldyrfelix.blogspot.com/2009/02/windows-seven.html</link><author>noreply@blogger.com (Waldyr Felix)</author><thr:total>0</thr:total></item></channel></rss>

