<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Soma, Inc.</title>
	<atom:link href="http://fsomalia.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://fsomalia.wordpress.com</link>
	<description>Explodir mentes é a nossa meta!</description>
	<lastBuildDate>Tue, 21 Sep 2010 04:25:10 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='fsomalia.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Soma, Inc.</title>
		<link>http://fsomalia.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://fsomalia.wordpress.com/osd.xml" title="Soma, Inc." />
	<atom:link rel='hub' href='http://fsomalia.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Porque o HTML 5 &#233; relevante, e o que voc&#234; deveria saber</title>
		<link>http://fsomalia.wordpress.com/2010/09/21/porque-o-html-5-e-relevante/</link>
		<comments>http://fsomalia.wordpress.com/2010/09/21/porque-o-html-5-e-relevante/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 04:08:39 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[futuro]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ie9]]></category>
		<category><![CDATA[opinião]]></category>

		<guid isPermaLink="false">https://fsomalia.wordpress.com/?p=194</guid>
		<description><![CDATA[No último dia 15, a Microsoft lançou para download a primeira versão beta do Internet Explorer 9. O IE foi o último grande navegador a dar algum tipo de suporte ao vindouro padrão HTML 5. Sejamos sinceros, ninguém acreditava muito na Microsoft. Para muitos usuários conscientes de tecnologia, Internet Explorer deixou de ser sinônimo de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=194&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/html5.jpg"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="html-5" border="0" alt="html-5" align="right" src="http://fsomalia.files.wordpress.com/2010/09/html5_thumb.jpg?w=233&#038;h=244" width="233" height="244" /></a> No último dia 15, a Microsoft lançou para download a primeira versão beta do <a href="http://www.beautyoftheweb.com/" target="_blank">Internet Explorer 9</a>. O IE foi o último grande navegador a dar algum tipo de suporte ao vindouro padrão HTML 5. </p>
<p>Sejamos sinceros, ninguém acreditava muito na Microsoft. Para muitos usuários conscientes de tecnologia, Internet Explorer deixou de ser sinônimo de navegador há muito tempo. Alguns preferem o poder de customização do <a href="getfirefox.com" target="_blank">Firefox</a>, ou a velocidade bruta do <a href="http://www.google.com/chrome" target="_blank">Chrome</a>, ou as soluções inovadoras do <a href="http://www.opera.com/" target="_blank">Opera</a>. E há os que não trocam o <a href="http://www.apple.com/safari/" target="_blank">Safari</a> por nada.</p>
<p>O que a Microsoft poderia dar em troca? Conformação com os padrões seria o mínimo. Aceleração de renderização por hardware? Quem precisa disso? Oras, ninguém quer jogar Crysis no navegador. As propostas inovadoras da Microsoft para a nova geração do IE pareciam piada.</p>
<p>Mas ninguém está rindo agora.</p>
<p> <span id="more-194"></span>
<p>De todas as novidades do IE, você deveria prestar atenção em duas:</p>
<ul>
<li>Aceleração por hardware </li>
<li>Realce no site/aplicação web </li>
</ul>
<p>Algumas semanas antes do lançamento do Internet Explorer, a Mozilla Foundation anunciou que o iria lançar uma versão do Firefox 4 com <a href="http://www.pcmag.com/article2/0,2817,2368107,00.asp" target="_blank">aceleração por hardware</a>, e a Google, para não ficar para trás, <a href="http://it.tmcnet.com/topics/it/articles/98532-googles-chrome-7-gets-hardware-acceleration.htm" target="_blank">incluiu o recurso</a> no Chrome 7. Isso é uma clara forma de correr atrás da concorrência. </p>
<p>Mas ao invés de uma briga boba por contagem de <em>feature bullets</em>, a aceleração de composição, vídeo e texto por hardware é um avanço real. De repente, o trabalho gráfico pesado não depende de plugins (como o Flash, que há várias versões faz aceleração de vídeo por hardware). E, de repente, o navegador abre caminhos para novas aplicações ainda não pensadas. Se você ainda não experimentou, acesse o <a href="http://ie.microsoft.com/testdrive/Performance/FishIE%20tank/Default.html" target="_blank">tanque de peixes</a> com uma das versões beta do Firefox 4, Chrome 7 ou IE 9. E depois compare com seu navegador atual.</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/image5.png"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="image" border="0" alt="image" align="right" src="http://fsomalia.files.wordpress.com/2010/09/image_thumb5.png?w=244&#038;h=125" width="244" height="125" /></a> Junto com isso, o novo IE dá um salto em foco no site que não era visto desde a entrada do Chrome ao mundo. A superfície de controle do navegador é a menor entre todos (mesmo até do antigo campeão, Chrome), e o site/aplicação web simplesmente salta na tela.</p>
<p>Isso sem falar na polêmica integração com o Windows 7. Já falei sobre isso <a href="http://fsomalia.wordpress.com/2010/09/18/integracao-ie9-win7/" target="_blank">nesse blog</a>, e achei a funcionalidade fabulosa. Na combinação IE9+Win7, o site é elevado a categoria de aplicação, com direito a seus próprio atalho pinado na barra de tarefas, e detalhes como <a href="http://ie.microsoft.com/testdrive/Browser/SitePinning/Default.html" target="_blank">botões na miniatura e ícones de overlay</a>. Claro, vai ser para 5% de toda a população de usuários do IE, mas algo nessas funcionalidades nos faz pensar em algumas tendências…</p>
<h2>A barreira entre desktop e web</h2>
<p>Por mais que a Microsoft quisesse, a web <a href="http://en.wikipedia.org/wiki/Active_Desktop" target="_blank">não se fundiu com o desktop</a>. A Microsoft tem uma vida difícil porque, ao mesmo tempo que não pode deixar muito espaço para concorrentes na web como o Google, ela precisa vender Windows como se fosse a solução definitiva para o universo.</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/chromeicon742122.jpg"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="chrome-icon-742122" border="0" alt="chrome-icon-742122" align="right" src="http://fsomalia.files.wordpress.com/2010/09/chromeicon742122_thumb.jpg?w=104&#038;h=104" width="104" height="104" /></a> A Google por sua vez, surgiu da web. Sua especialidade são aplicações baseadas na Internet. E com todo seu crescimento, era uma questão de tempo até que ela começasse a interferir no desktop. Quando o Chrome foi lançado, todos nós sabíamos: cansada de esperar o segmento, a Google decidiu fazer sua própria plataforma, para suas próprias aplicações.</p>
<p>Mas quando ela anunciou o <a href="http://www.youtube.com/user/googlechrome#p/c/FA594B0BBF1EDFC5/0/0QRO3gKj3qw" target="_blank">Chrome OS</a>, muitos acreditaram isso era demais. Um sistema operacional totalmente plugado? Sites como aplicações? E meus arquivos locais? E se eu não conseguir conexão?</p>
<div style="width:425px;display:block;float:none;margin:0 auto;padding:0;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:9017dfde-9fca-47a1-8d40-c4a1c72ca3fd" class="wlWriterEditableSmartContent">
<div><span style="text-align:center; display: block;"><a href="http://fsomalia.wordpress.com/2010/09/21/porque-o-html-5-e-relevante/"><img src="http://img.youtube.com/vi/0QRO3gKj3qw/2.jpg" alt="" /></a></span></div>
</div>
<p>Calma. A Google não está dizendo que a partir de amanhã, você não terá mais a necessidade um computador para, por exemplo, computação gráfica. Mas a roda da evolução está girando. O movimento que a Google ajudou a acelerar, e a Microsoft confirmou com o lançamento do IE9, está acontecendo.</p>
<p>E o alicerce de tudo isso é o HTML 5.</p>
<h2>O HTML 5 vai mudar o que você conhece de aplicações web</h2>
<p>Em 2004, a <a href="http://www.w3.org/2004/04/webapps-cdf-ws/index" target="_blank">W3C promoveu um workshop</a> para que as diversas entidades relacionadas à Internet pudessem dar voz as suas idéias para o futuro de aplicações web. Os participantes ficaram divididos entre aqueles que acreditavam que as aplicações web deveriam seguir o caminho do XML (XML, XHTML, SVG, XSL, XSLT) e aqueles que apoiavam todo o trabalho já construído em cima do HTML e CSS.</p>
<p>No final do workshop, a seguinte <a href="http://www.w3.org/2004/04/webapps-cdf-ws/summary" target="_blank">pergunta</a> foi feita aos participantes:</p>
<blockquote><p><font color="#333333">A W3C deveria desenvolver uma nova versão do HTML e CSS para implementar os requisitos de Aplicações Web (…)?</font></p>
</blockquote>
<p>8 votaram Sim. 14 votaram Não.</p>
<p>Findando o workshop, as pessoas que apoiavam o HTML – em especial Apple, Mozilla e Opera – fundaram o Web Hypertext Applications Technology Working Group, o <a href="http://www.whatwg.org/" target="_blank">WHATWG</a>. Eles começaram a trabalhar nas várias propostas que iriam se tornar o HTML 5. </p>
<p>Devido à grande atenção que o grupo ganhou, em 2006, a própria W3C se uniu ao WHATWG, incorporando os trabalhos como documentos do consórcio. E em 2009, a W3C encerrou os trabalhos no XHTML 2, morto antes de nascer. Isso quer dizer que o HTML 5 é <strong>real</strong>, e vai estar <strike>nas mesas</strike> nos computadores de todos cedo ou tarde.</p>
<p>O que faz o HTML 5 especial para quem desenvolve aplicações web?</p>
<h3>Formulários renovados</h3>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/image6.png"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="image" border="0" alt="image" align="right" src="http://fsomalia.files.wordpress.com/2010/09/image_thumb6.png?w=244&#038;h=31" width="244" height="31" /></a> Os <a href="http://diveintohtml5.org/forms.html" target="_blank">novos tipos</a> de campos de formulários produzem muito mais contexto para os navegadores. Quem já usou um iPhone, sabe que em certas aplicações web, quando você põe foco em um campo de e-mail, o teclado virtual muda para um modo especializado para e-mail. Isso não é magia; é o campo do tipo email funcionado.</p>
<p>O formulário agora tem muito mais suporte a <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#client-side-form-validation" target="_blank">validação</a>. Você pode definir um campo como requerido; em campos numéricos, pode especificar a faixa de valores permitida. Pode até especificar uma expressão regular como validador.</p>
<p>Isso sem falar em <a href="http://diveintohtml5.org/forms.html#autofocus" target="_blank">autofoco sem script</a>.</p>
<h3>Armazenamento local</h3>
<p>Sim, é verdade. Por muito tempo, ficamos limitados a soluções erradas como cookies, ou plugins como Flash e Gears para armazenar informação local no cliente. Não mais. O HTML 5 prevê que os navegadores terão, <strong>por padrão</strong>, uma forma de <a href="http://diveintohtml5.org/storage.html#localstorage" target="_blank">armazenamento de informação local</a>.</p>
<p>A priori, apenas armazenamento do tipo chave-valor são aceitas. Todos os navegadores atuais já possuem essa funcionalidade (mesmo o IE8), disponibilizando pelo menos 5 MB para cada aplicação. Com o tempo, é possível que o padrão <a href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html" target="_blank">IndexedDB</a> seja incorporado, dando uma solução estruturada de armazenamento.</p>
<h3>Aplicações web offline</h3>
<p>Isso não é paradoxo. Isso é real e possível hoje. Trata-se apenas do uso inventivo do cache do navegador.</p>
<p><a href="http://diveintohtml5.org/offline.html" target="_blank">Aplicações offline</a> trabalham em duas frentes. Nas suas páginas, você precisa indicar uma lista de arquivos que precisam ser cacheados caso o usuário queira usar sua aplicação de forma desconectada. E na sua lógica de página, você tem acesso a uma API que permite que você saiba se o usuário está offline, quando esse status muda, se o usuário deseja ou não trabalhar offline, etc.</p>
<p>Aliado com o armazenamento local, é possível criar aplicações web bem poderosas. E que desafiam um pouco mais o que é web e o que é desktop.</p>
<h3>CSS 3 </h3>
<p>Tecnicamente não é parte do HTML 5, mas está sendo empurrado junto nessa nova onda de aplicações web.</p>
<p>CSS 3 prevê interfaces bem mais interativas e aprazíveis. Munido apenas de CSS, é possível definir <a href="http://www.w3.org/TR/css3-animations/" target="_blank">animações</a>, <a href="http://dev.w3.org/csswg/css3-transitions/" target="_blank">transições</a> e <a href="http://www.w3.org/TR/css3-2d-transforms/" target="_blank">transformações</a> em 2D. Sites com animação, sem Flash.</p>
<p>Alguns exemplos <a href="http://www.webdesignerwall.com/trends/47-amazing-css3-animation-demos/" target="_blank">aqui</a>.</p>
<h3>Canvas</h3>
<p>Mais um adendo ao HTML 5 que elimina a nossa necessidade de plugins como Flash. Trata-se de uma área de desenho livre para HTML. Uma aplicação consegue desenhar formas e construir animações. O primeiro grande destaque ao canvas foi uma <a href="http://9elements.com/io/projects/html5/canvas/" target="_blank">aplicação</a> bem simples baseada no twitter, mas bem <em>cool</em>.</p>
<p>Com todo esse foco no desenho e gráficos, não é de se espantar que Mozilla, Microsoft e Google estão atrás de aceleração por hardware.</p>
<h2>O que falta</h2>
<p>Em uma única palavra, ferramentas. Hoje temos boas ferramentas para edição de HTML e CSS, mas não há nada bom para desenvolver em JavaScript. Eu não estou falando em programação reativa, como Notepad+Firebug. Eu estou falando em auto-complementação de código. Em descoberta de contexto. O Visual Studio 2010 chega perto disso, mas se enrola às vezes.</p>
<p>De qualquer forma, em HTML/CSS/JavaScript estamos bem servidos. O que ainda estamos bem defasados é em ferramentas para desenho/animação. Enquanto não houver uma ferramenta boa para animação e criação em canvas e CSS 3, os desenvolvedores e designers preferirão usar plugins como o Flash.</p>
<p><img style="display:inline;margin-left:0;margin-right:0;" align="right" src="http://www.adobe.com/aboutadobe/images/adobe_logo_50x50.gif" />Quem fornecerá essas ferramentas? A Adobe pode muito bem fornecê-las, já que é conceitualmente a melhor no design para web. Além disso, <a href="http://www.pocket-lint.com/news/32940/adobe-pledges-best-html5-tools" target="_blank">ela falou</a> que ia fazer isso. Mas com as <a href="http://www.i-programmer.info/professional-programmer/i-programmer/1278-windows-and-net-the-coming-storm.html" target="_blank">recentes dúvidas</a> em relação ao WPF dentro da Microsoft, não se surpreenda se o Visual Studio 11 ou o <a href="http://www.microsoft.com/expression/" target="_blank">Expression Studio</a> 5 vier como a melhor ferramenta de desenvolvimento para aplicações HTML5.</p>
<h2>O futuro está mais próximo do que você imagina</h2>
<p>Algumas coisas nos fazem pensar:</p>
<ul>
<li>A empresa <em>top-of-mind</em> da Internet fez sucesso fazendo aplicações web </li>
<li>A mesma Google cria um sistema operacional somente com aplicações web </li>
<li>Os produtores de navegador de Internet se unem para criar um padrão de aplicações web </li>
<li>A Google cria o Gears, plugin para desconectar aplicações web. O recurso vira um padrão HTML. </li>
<li>O iPhone é um dos primeiros a transformar aplicações web em itens de primeira instância, permitindo criar links lado a lado a aplicações nativas </li>
<li>O Internet Explorer adiciona aceleração de hardware na renderização (e todo mundo segue atrás) </li>
</ul>
<p>No dia seguinte ao lançamento do IE9, a Google veio a público dizer que o Chrome 7 ficaria <a href="http://www.pcworld.com/businesscenter/article/205550/chrome_7_will_get_60_times_faster_google_says.html" target="_blank">60 vezes mais rápido</a>. Além disso, incluiria suporte a 3D com CSS e WebGL. Isso permitiria a aplicações extremamente demandantes, como jogos 3D, rodar no navegador. Mesmo que eles não cheguem nesse número, entende o caminho para onde a coisa está andando?</p>
<p>Outra história. Lá no início de setembro, o ex-gerente do projeto Silverlight <a href="http://www.itwriting.com/blog/3127-microsoft-wrestles-with-html5-vs-silverlight-futures.html" target="_blank">postou</a>:</p>
<blockquote><p><font color="#333333">Exatamente agora há uma guerra entre HTML 5 e Silverlight dentro da Microsoft. Oh e WPF está morto… digo… já estava, mas agora… funeral.</font></p>
</blockquote>
<p>Logo após, o site I-Programmer postou um <a href="http://www.i-programmer.info/professional-programmer/i-programmer/1278-windows-and-net-the-coming-storm.html" target="_blank">artigo bem interessante</a> sobre como o WPF é tratado dentro da Microsoft. Em suma, a única equipe que usa WPF na Microsoft é a equipe que a criou, o time das ferramentas de desenvolvimento. De fato, mesmo depois de 5 anos de existência, o único grande software que usa WPF é o próprio Visual Studio.</p>
<p>Voltando ao ex-gerente do Silverlight, ele ainda acrescentou:</p>
<blockquote><p><font color="#333333">HTML 5 é o substituto do WPF… o time do IE quer estender o HTML5 colocando APIs do Windows via JS</font></p>
</blockquote>
<p>Isso semanas antes de a gente descobrir sobre <a href="http://ie.microsoft.com/testdrive/Browser/SitePinning/Default.html" target="_blank">Jump Lists e ícones de overlay</a> no IE9. Alguém duvida que a Microsoft pensa em incluir extensões para outras APIs do Windows, como IO e DirectX?</p>
<h2>O que você, desenvolvedor, vai fazer sobre isso?</h2>
<p>Imagino se você agora esteja em fase de negação. Eu estive. “Aplicações no navegador?” “Nunca substituirei meu Word!” “Não tem como {insira sua aplicação improvável aqui} rodar no navegador!”</p>
<p>O que eu posso dizer a você é: se livre de preconceitos. Seja <em><a href="http://pt.wikipedia.org/wiki/Tabula_rasa" target="_blank">tabula rasa</a></em> e crie novos conceitos.</p>
<p>Outra história. Até 2004, geoprocessamento era tratado como uma coisa para poucos. Se você quisesse um mapa, você comprava em uma livraria, ou procurava por uma imagem na Internet. GPS era coisa de firmas especializadas como <a href="http://www.garmin.com/garmin/cms/site/us" target="_blank">Garmin</a> e <a href="http://www.magellangps.com/" target="_blank">Magellan</a>. Internet e <a href="http://en.wikipedia.org/wiki/Geomatic" target="_blank">geomática</a> eram coisas tão ligadas quanto aviões e submarinos. As <a href="http://www.intergraph.com/" target="_blank">empresas</a> <a href="http://www.esri.com/" target="_blank">grandes</a> do ramo se esforçavam para que tudo continuasse assim. “É impossível criar uma mapa sem o datum adequado”. “Transformações geográficas devem ser exatas”. “Precisão”. “Burocracia”. </p>
<p><img style="display:inline;margin-left:0;margin-right:0;" alt="Google Earth.svg" align="right" src="http://upload.wikimedia.org/wikipedia/en/thumb/e/e9/Google_Earth.svg/64px-Google_Earth.svg.png" />Então, em 2004, a Google comprou uma empresa chamada <a href="http://en.wikipedia.org/wiki/Google_Earth" target="_blank">Keyhole</a> e lançou ao mundo o Google Earth. Imediatamente, da noite para o dia, todas as pessoas do mundo aprenderam tudo o que precisavam saber sobre imagens de satélite, geolocalização, rotas, GPS. Tudo impreciso, sem formalização. Mas não importava: qualquer um podia ver o lugar que morava, como eram as grandes pirâmides ou como é a sensação de estar no alto do Everest.</p>
<p>Isso simplesmente criou um novo nicho de mercado. Google Maps, Fourquare, Facebook, Latitude, Twitter, e muitíssimas outras aplicações fazem uso de geolocalização. GPS em um smartphone não fazia sentido em 2003; hoje é recurso obrigatório. Geolocalização <a href="http://diveintohtml5.org/geolocation.html" target="_blank">faz parte</a> do HTML 5.</p>
<p>E como estão as empresas sisudas de geomática e GPS hoje? Ainda correndo atrás do prejuízo. Tentando proteger sua propriedade intelectual, não arriscaram abrir a mente para novas idéias. Não viram o potencial das aplicações de Internet. E deixaram de ser o protagonista da revolução da geolocalização.</p>
<p>Não seja assim. Está sendo construído um padrão para aplicações de Internet. Nunca antes 5 produtoras de navegadores sentaram na mesa para discutir. O padrão não é perfeito. Não resolve tudo. Haverão discrepâncias. Mas é certamente a melhor plataforma para construir aplicações web feita até hoje. Aproveite, encontre um nicho, crie idéias, explore. E não tenha preconceitos.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/194/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=194&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/09/21/porque-o-html-5-e-relevante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/html5_thumb.jpg" medium="image">
			<media:title type="html">html-5</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/image_thumb5.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/chromeicon742122_thumb.jpg" medium="image">
			<media:title type="html">chrome-icon-742122</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/image_thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://www.adobe.com/aboutadobe/images/adobe_logo_50x50.gif" medium="image" />

		<media:content url="http://upload.wikimedia.org/wikipedia/en/thumb/e/e9/Google_Earth.svg/64px-Google_Earth.svg.png" medium="image">
			<media:title type="html">Google Earth.svg</media:title>
		</media:content>
	</item>
		<item>
		<title>Integra&#231;&#227;o do Internet Explorer 9 com Windows 7</title>
		<link>http://fsomalia.wordpress.com/2010/09/18/integracao-ie9-win7/</link>
		<comments>http://fsomalia.wordpress.com/2010/09/18/integracao-ie9-win7/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 00:59:56 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[ie9]]></category>
		<category><![CDATA[pinned-sites]]></category>
		<category><![CDATA[sitemode]]></category>

		<guid isPermaLink="false">https://fsomalia.wordpress.com/?p=179</guid>
		<description><![CDATA[Se você está vendo este artigo, então sabe que a Microsoft lançou o beta do Internet Explorer 9 na última semana, e sabe que ele tem funcionalidades interessantes para o Windows 7: fixar site na barra de tarefas, listas de tarefas do site e até ícones para sobreposição. Se você é desenvolvedor web, então esse [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=179&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://fsomalia.files.wordpress.com/2010/09/image.png"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="image" border="0" alt="image" align="right" src="http://fsomalia.files.wordpress.com/2010/09/image_thumb.png?w=254&#038;h=254" width="254" height="254" /></a> Se você está vendo este artigo, então sabe que a Microsoft <a href="http://windows.microsoft.com/ie9">lançou o beta do Internet Explorer 9</a> na última semana, e sabe que ele tem funcionalidades interessantes para o Windows 7: fixar site na barra de tarefas, listas de tarefas do site e até ícones para sobreposição.</p>
<p>Se você é desenvolvedor web, então esse post é para você. Saiba como fazer as coisas divertidas que o Internet Explorer pode fazer.</p>
<p> <span id="more-179"></span>  </p>
<p>A primeira coisa que você precisa aprender é que essas funcionalidades estão disponíveis apenas para Internet Explorer 9. Por isso, se você tentar executar algum código dessas funcionalidades em outro navegador, um belo erro de script vai acontecer.</p>
<p>Há quem faça detecção de browser via script. Nesse caso, não é necessário (e é contra-producente, não faça). O que você precisa fazer é detecção de funcionalidade. Para checar se o site suporta as funcionalidades, cheque por <em><a href="http://msdn.microsoft.com/en-us/library/ff976310(v=VS.85).aspx" target="_blank">msIsSiteMode</a></em>.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:b47d4bac-5253-48b6-ad01-5e9ad0143462" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
try {
    if (window.external.msIsSiteMode()) {
        // suportado, tudo certo no deserto
    } else {
        // IE9, mas SiteMode não suportado
    }
} catch(ex) {
    // Outro navegador, não suportado
}
</pre>
</pre>
</div>
<p>Dito isso, vamos às funcionalidades.</p>
<h2>Fixar aplicação na barra de tarefas ou menu Iniciar</h2>
<p>Qualquer site pode ser fixado na barra de tarefas ou menu Iniciar, seja ele preparado para o IE ou não. Fixar é tão fácil quanto arrastar a aba do navegador para a barra de tarefas. Você ainda pode usa o botão Ferramentas (Alt+X) para fixar no menu Iniciar.</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/image1.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/09/image_thumb1.png?w=623&#038;h=281" width="623" height="281" /></a>&#160;</p>
<p>Quando você fixa o site, várias coisas acontecem:</p>
<ul>
<li>O site fica fixado como se fosse um programa </li>
</ul>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/image2.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/09/image_thumb2.png?w=315&#038;h=44" width="315" height="44" /></a> </p>
<ul>
<li>Quando aberto, o IE mostra o ícone do site na extrema esquerda </li>
<li>Os botões de voltar e avançar mudam de cor </li>
</ul>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/snaghtml4dae0c6.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="SNAGHTML4dae0c6" border="0" alt="SNAGHTML4dae0c6" src="http://fsomalia.files.wordpress.com/2010/09/snaghtml4dae0c6_thumb.png?w=224&#038;h=90" width="224" height="90" /></a></p>
<p>Para configurar o ícone do site, continua o bom e velho <em>link shortcut icon</em>.</p>
<p><pre class="brush: xml;">
&lt;link rel=&quot;shortcut icon&quot; type=&quot;image/x-icon&quot;
    href=&quot;/themes/gizmodo3/favicon.ico&quot; /&gt;</pre></p>
<p>A cor dos botões, por padrão, é baseada na cor predominante do ícone do site. Web designers provavelmente irão querer fazer <em>tweaks</em> no ícone do site para melhorar a aparência da aplicação. Mas é possível alterar a cor padrão usando uma meta tag:</p>
<pre class="brush: xml;">&lt;meta name=&quot;msapplication-navbutton-color&quot; content=&quot;red&quot;/&gt;</pre>
<p>Também é possível alterar a URL que é aberta quando o usuário clica no link da barra de tarefas:</p>
<pre class="brush: xml;">&lt;meta name=&quot;msapplication-starturl&quot;
    content=&quot;http://example.com/start.html&quot;/&gt;</pre>
<p>E além disso, é possível customizar o tamanho da janela que é aberta:</p>
<pre class="brush: xml;">&lt;meta name=&quot;msapplication-window&quot; content=&quot;width=800;height=600&quot;/&gt;</pre>
<h2>Jump lists</h2>
<p>Jump lists, ou lista de tarefas, podem ser criadas no ícone com uso de scripting. As listas de tarefas são úteis para criar atalhos para partes do site, como no site do <a href="http://www.winsupersite.com/" target="_blank">Paul Turrott</a>:</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/image3.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/09/image_thumb3.png?w=376&#038;h=361" width="376" height="361" /></a> </p>
<p>Ou para relembrar atividades recém feitas no site, como <a href="http://ie.microsoft.com/testdrive/Browser/tweetfeed/Default.html" target="_blank">neste exemplo</a> usando o Twiter:</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/image4.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/09/image_thumb4.png?w=332&#038;h=332" width="332" height="332" /></a> </p>
<p>Existem dois tipos de jump lists: as tarefas de aplicação e as listas dinâmicas.</p>
<h3>Tarefas de aplicação</h3>
<p>As tarefas de aplicação estão ligadas à categoria Tarefas do menu de aplicação. Elas tendem a ser estáticas e são relacionadas às atividades que seu usuário usa o site.</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/ic432197.jpg"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="IC432197" border="0" alt="IC432197" src="http://fsomalia.files.wordpress.com/2010/09/ic432197_thumb.jpg?w=288&#038;h=290" width="288" height="290" /></a> </p>
<p>Pelo caráter estático das tarefas, elas são mais facilmente declaradas como meta tags no site. Dessa forma:</p>
<pre class="brush: xml;">&lt;META name=&quot;msapplication-task&quot;
    content=&quot;name=Task 1;action-uri=http://host/Page1.html;icon-uri=http://host/icon1.ico&quot;/&gt;
&lt;META name=&quot;msapplication-task&quot;
    content=&quot;name=Task 2;action-uri=http://microsoft.com/Page2.html;icon-uri=http://host/icon2.ico&quot;/&gt;</pre>
<p>Cada meta <em>msapplication-task</em> admite três parâmetros:</p>
<ul>
<li>name: o nome da tarefa </li>
<li>action: a URL que é aberta ao clicar na tarefa </li>
<li>icon-uri: o endereço do ícone da tarefa. </li>
</ul>
<p>As tarefas podem ser atualizadas. Sempre que o usuário abre a aplicação via ícone fixado, as tarefas são atualizadas pelas meta tags encontradas no momento.</p>
<p>Ah, e metas podem ser criadas sem medo de compatibilidade. Navegadores que não entendem <em>msapplication-task</em> simplesmente a ignoram.</p>
<h3>Listas dinâmicas</h3>
<p>Você pode criar sua própria categoria e lista de links. Isso é feito com um pouco de JavaScript. Existem várias etapas para criar uma categoria:</p>
<ul>
<li><strong>Crie a categoria:</strong> primeiramente, use <em><a href="http://msdn.microsoft.com/en-us/library/ff976293(v=VS.85).aspx" target="_blank">msSiteModeCreateJumpList</a></em> para criar uma categoria com um nome. Você precisa criar pelo menos uma categoria antes de começar a criar itens para ela. </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:8e042eb3-3289-4cbf-9b6d-ba15c9966b4d" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
window.external.msSiteModeCreateJumplist('List1');
</pre>
</pre>
</div>
<ul>
<li><strong>Adicione itens:</strong> Adicione itens à categoria com <em><a href="http://msdn.microsoft.com/en-us/library/ff976312(v=VS.85).aspx" target="_blank">msSiteModeAddJumpListItem</a></em>. Note que nesse momento, os itens são adicionados apenas em memória e não aparecem no link. </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ca58814a-013b-4c8a-ad97-6c8754d71a58" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
window.external.msSiteModeAddJumpListItem(
    'Item 1', 'http://host/Item1.html', 'http://host/images/item1.ico');
window.external.msSiteModeAddJumpListItem(
    'Item 2', 'http://host/Item2.html', 'http://host/images/item2.ico');
window.external.msSiteModeAddJumpListItem(
    'Item 3', 'Item3.html', 'images/item3.ico');
</pre>
</pre>
</div>
<p>Cada item requer um <em>nome</em>, uma <em>URL</em> de ação, e um <em>ícone</em> de aparência.</p>
<ul>
<li><strong>Mostre a lista:</strong> usando a função <a href="http://msdn.microsoft.com/en-us/library/ff976318(VS.85).aspx" target="_blank">msSiteModeShowJumpList</a>, a categoria do link é atualizada com a lista em memória. </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:089ff533-525d-4f83-afb9-5aabad7e26a0" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
window.external.msSiteModeShowJumplist();
</pre>
</pre>
</div>
<p>Note o seguinte:</p>
<ul>
<li>Um site pode criar apenas uma categoria customizada, portanto escolha bem o nome </li>
<li>Quando atualizada, a categoria não perde todos os itens; os itens em memória são adicionadas aos itens já existentes. </li>
<li>A atualização não duplica itens iguais: os itens referenciados são movidos para o topo da lista </li>
<li>A categoria suporta somente 20 itens; depois disso os itens mais antigos são removidos </li>
<li>É possível limpar a lista imediatamente chamando <em><a href="http://msdn.microsoft.com/en-us/library/ff976315(v=VS.85).aspx" target="_blank">msSiteModeClearJumpList</a></em> </li>
<li>Sites podem receber notificações quando o usuário manualmente remove um item da Jump List com o evento <em><a href="http://msdn.microsoft.com/en-us/library/ff975580(v=VS.85).aspx" target="_blank">mssitemodejumplistitemremoved</a></em> </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c5a2607a-8205-4db6-9da8-1778cf70b6ee" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
document.addEventListener(
    'mssitemodejumplistitemremoved', handler, false);
</pre>
</pre>
</div>
<h2>Ícones de Sobreposição</h2>
<p>Enquanto o site está aberto, você pode sobrepor o ícone de aplicação na barra de tarefas com seus próprios ícones.</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/snaghtml51a889a.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="Ícone sem sobreposição" border="0" alt="Ícone sem sobreposição" src="http://fsomalia.files.wordpress.com/2010/09/snaghtml51a889a_thumb.png?w=184&#038;h=44" width="184" height="44" /></a></p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/snaghtml51b3e51.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="Ícone com sobreposição de busca" border="0" alt="Ícone com sobreposição de busca" src="http://fsomalia.files.wordpress.com/2010/09/snaghtml51b3e51_thumb.png?w=189&#038;h=44" width="189" height="44" /></a></p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/snaghtml51b4fee.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="Ícone com sobreposição de contagem" border="0" alt="Ícone com sobreposição de contagem" src="http://fsomalia.files.wordpress.com/2010/09/snaghtml51b4fee_thumb.png?w=195&#038;h=44" width="195" height="44" /></a></p>
<p>Para definir um ícone de sobreposição, basta chamar <em><a href="http://msdn.microsoft.com/en-us/library/ff976316(VS.85).aspx" target="_blank">msSiteModeSetIconOverlay</a></em>. </p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ce364158-f64c-4481-95a1-3ab9ce69f47a" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
window.external.msSiteModeSetIconOverlay(
    'http://host/images/search.ico', 'Searching');
</pre>
</pre>
</div>
<p>O primeiro parâmetro é o endereço do ícone. O segundo parâmetro é opcional e muda a tooltip do ícone da aplicação.</p>
<p>Similarmente, para remover o ícone de sobreposição, basta chamar <em><a href="http://msdn.microsoft.com/en-us/library/ff976314(v=VS.85).aspx" target="_blank">msSiteModeClearIconOverlay</a></em>.</p>
<h2>Botões no preview miniatura</h2>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/ic432200.jpg"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="Preview miniatura" border="0" alt="Preview miniatura" src="http://fsomalia.files.wordpress.com/2010/09/ic432200_thumb.jpg?w=430&#038;h=283" width="430" height="283" /></a> </p>
<p>O site pode também adicionar aqueles pequenos botões em cima do preview em miniatura da janela.</p>
<p>Os botões são criados por janela, primeiramente em memória. Use o método <a href="http://msdn.microsoft.com/en-us/library/ff976313(VS.85).aspx" target="_blank"><em>msSiteModeAddThumbBarButton</em></a> para adicionar um botão:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:5778f797-9028-4b53-879b-4a164ac82719" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
btn1 = window.external.msSiteModeAddThumbBarButton(
    'http://host/images/button1.ico', 'button 1');
btn2 = window.external.msSiteModeAddThumbBarButton(
    'http://host/images/button2.ico', 'button 2');
btn1 = window.external.msSiteModeAddThumbBarButton(
    'http://host/images/button3.ico', 'button 3');
</pre>
</pre>
</div>
<p>O valor de retorno é um identificador do botão na barra de botões.</p>
<p>Para detectar se o usuário clicou em um botão, escute o evento <em><a href="http://msdn.microsoft.com/en-us/library/ff975582(v=VS.85).aspx" target="_blank">msthumbnailclick</a></em>:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:4c718fe9-3022-4055-8ad9-b3ca70b98d07" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
document.addEventListener('msthumbnailclick', handler1, false);
…
function handler1 (btn) {
         alert (&quot;addeventlist:thumbnail btn id&quot; + btn.buttonID);
}
</pre>
</pre>
</div>
<p>O botão pode ser identificado com a propriedade <em>buttonID</em> do objeto de evento. Ele vai ser um dos identificadores retornados por <em>msSiteModeAddThumbBarButton</em>.</p>
<p>E depois de definidos, você pode mostrar a barra de botões com <a href="http://msdn.microsoft.com/en-us/library/ff976319(VS.85).aspx" target="_blank">msSiteModeShowThumbBar</a>.</p>
<p>O código completo de inicialização da barra é algo assim:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:97ab12b4-8a98-405a-8121-abf2d007491b" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
var btn1, btn2;

function init()
{
    document.addEventListener('msthumbnailclick', processSelection, false);
    
    btn1 = window.external.msSiteModeAddThumbBarButton('Images/play.ico', 'Play');
    btn2 = window.external.msSiteModeAddThumbBarButton('Images/stop.ico', 'Stop');
    
    window.external.msSiteModeShowThumbBar();
}

function processSelection(btn)
{
   if (btn.buttonID == btn1) 
   {
       // Play video
   }
   else if (btn.buttonID == btn2) 
   {
       // Stop video
   }
} 
</pre>
</pre>
</div>
<h3>Modificando os botões</h3>
<p>Depois que a barra de botões foi mostrada, você pode habilitar/desabilitar, ocultar/mostrar, e mudar o ícone do botão.</p>
<p>Para desabilitar e ocultar, você pode chamar o <em><a href="http://msdn.microsoft.com/en-us/library/ff976320(VS.85).aspx" target="_blank">msSiteModeUpdateThumbBarButton</a></em>.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:7c403c3a-fad6-4d42-b4e0-4aeb8e268d37" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
window.external.msSiteModeUpdateThumbBarButton(btn1, false, true);
window.external.msSiteModeUpdateThumbBarButton(btn2, true, true);
window.external.msSiteModeUpdateThumbBarButton(btn3, true, false);
</pre>
</pre>
</div>
<p>O primeiro parâmetro é o <strong>identificador</strong> do botão, o segundo parâmetro indica se o botão está <strong>habilitado</strong> (verdadeiro/falso), e o terceiro indica se o botão está <strong>visível</strong>.</p>
<p>Para modificar o ícone do botão, você primeiro precisa declarar estilos de botão. Declare estilos usando <em><a href="http://msdn.microsoft.com/en-us/library/ff976311(VS.85).aspx" target="_blank">msSiteModeAddButtonStyle</a></em>, passando o identificador do botão, um endereço de ícone e a tooltip do botão.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bdb29694-3f3f-4cfc-b332-cbb8d9ffdaa0" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
style1 = window.external.msSiteModeAddButtonStyle(btn1,
    'http://example.com/img/down.ico', 'Button depressed');
style2 = window.external.msSiteModeAddButtonStyle(btn1,
    'http://example.com/img/up.ico', 'Button released');
</pre>
</pre>
</div>
<p>Um botão pode ter vários estilos.</p>
<p>Alterne os estilos de botão usando <a href="http://msdn.microsoft.com/en-us/library/ff976317(v=VS.85).aspx" target="_blank"><em>msSiteModeShowButtonStyle</em></a>, passando como parâmetros o identificador do botão e o identificador do estilo.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:f4c91a40-d217-4562-a97c-e5f196bd103c" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
window.external.msSiteModeShowButtonStyle(btn1, style1);
</pre>
</pre>
</div>
<h2>Chamando atenção do usuário</h2>
<p>É possível fazer o ícone da aplicação piscar chamando <em><a href="http://msdn.microsoft.com/en-us/library/ff975166(v=VS.85).aspx" target="_blank">msSiteModeActivate</a></em>:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:8623f311-db39-479a-970d-a3c63b5d1071" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: jscript;">
window.external.msSiteModeActivate();
</pre>
</pre>
</div>
<h2>Tamanho dos ícones</h2>
<p>Os sites fixados usam ícones em vários lugares. É recomendado que os arquivos de ícones tenham as seguintes resoluções: 16&#215;16, 24&#215;24, 32&#215;32, 64&#215;64.</p>
<p>Na configuração padrão, os ícones usados são:</p>
<ul>
<li>Ícone da barra de tarefas: 32&#215;32 </li>
<li>Ícone de Jump List: 16&#215;16 </li>
<li>Ícone de botão de preview em miniatura: 16&#215;16 </li>
<li>Ícone no canto esquerdo superior no navegador: 24&#215;24 </li>
<li>Ícone de sobreposição: 16&#215;16 </li>
</ul>
<h2>Conclusão</h2>
<p>Espero que tenha achado interessante as novas ferramentas do Internet Explorer. Elas fazem com que o limite entre desktop e a web fique um pouquinho mais nublado. No mais, inclui ferramentas interessantes para <em>power-users</em>.</p>
<p>Lembre-se que o IE9 ainda está em beta, e alguma coisa pode sempre mudar. Fique de olho na <a href="http://msdn.microsoft.com/en-us/library/bb268249(v=VS.85).aspx" target="_blank">documentação</a> em progresso, e no <a href="http://blogs.msdn.com/b/ie/" target="_blank">blog do time do IE</a>.</p>
<p>As informações aqui contidas foram retiradas em parte do <a href="http://msdn.microsoft.com/en-us/library/gg131029(VS.85).aspx" target="_blank">tutorial</a> na documentação do IE.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/179/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=179&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/09/18/integracao-ie9-win7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/snaghtml4dae0c6_thumb.png" medium="image">
			<media:title type="html">SNAGHTML4dae0c6</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/image_thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/ic432197_thumb.jpg" medium="image">
			<media:title type="html">IC432197</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/snaghtml51a889a_thumb.png" medium="image">
			<media:title type="html">Ícone sem sobreposição</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/snaghtml51b3e51_thumb.png" medium="image">
			<media:title type="html">Ícone com sobreposição de busca</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/snaghtml51b4fee_thumb.png" medium="image">
			<media:title type="html">Ícone com sobreposição de contagem</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/ic432200_thumb.jpg" medium="image">
			<media:title type="html">Preview miniatura</media:title>
		</media:content>
	</item>
		<item>
		<title>E a Apple estava certa: os pads são a resposta definitiva</title>
		<link>http://fsomalia.wordpress.com/2010/09/18/e-a-apple-estava-certa-os-pads-sao-a-resposta%c2%a0definitiva/</link>
		<comments>http://fsomalia.wordpress.com/2010/09/18/e-a-apple-estava-certa-os-pads-sao-a-resposta%c2%a0definitiva/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 20:32:57 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[futuro]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[opnião]]></category>
		<category><![CDATA[pad]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows-phone]]></category>

		<guid isPermaLink="false">https://fsomalia.wordpress.com/?p=154</guid>
		<description><![CDATA[Não que isso seja uma grande novidade para os fãs de Jornada nas Estrelas. Acontece que, como reportado por Jesús Diaz lá do Gizmodo, os notebooks estão morrendo. A notícia é que a venda dos notebooks vem sofrendo uma queda do crescimento, principalmente após Janeiro deste ano, quando o iPad foi anunciado. Hype ou não, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=154&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://fsomalia.files.wordpress.com/2010/09/sarah_sisko_reconstruction.jpg"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="Sarah_Sisko_reconstruction" border="0" alt="Sarah_Sisko_reconstruction" align="right" src="http://fsomalia.files.wordpress.com/2010/09/sarah_sisko_reconstruction_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> Não que isso seja uma grande novidade para os fãs de <a href="http://memory-alpha.org/wiki/PADD" target="_blank">Jornada nas Estrelas</a>. Acontece que, como <a href="http://www.gizmodo.com.br/conteudo/os-notebooks-estao-morrendo" target="_blank">reportado</a> por Jesús Diaz lá do Gizmodo, os <a href="http://gizmodo.com/5640351/best-buy-ceo-ipad-is-cannibalizing-laptop-sales-by-a-shocking-50" target="_blank">notebooks estão morrendo</a>.</p>
<p>A notícia é que a venda dos notebooks vem sofrendo uma queda do crescimento, principalmente após Janeiro deste ano, quando o iPad foi anunciado. Hype ou não, a queda nas vendas estava prevista pelo menos desde 2009, quando o WSJ reportou que era <a href="http://online.wsj.com/article/SB122477763884262815.html" target="_blank">hora de deixar os laptops para trás</a>. </p>
<p> <span id="more-154"></span>
</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/bb_bold_9700_detalhe.gif"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="bb_bold_9700_detalhe" border="0" alt="bb_bold_9700_detalhe" align="left" src="http://fsomalia.files.wordpress.com/2010/09/bb_bold_9700_detalhe_thumb.gif?w=116&#038;h=240" width="116" height="240" /></a> Vou te contar uma história. Minha sobrinha vai assumir um cargo de gerência em uma multinacional em Portugal. Como parte das atribuições, ela precisa estar sempre em movimento. E como parte dos benefícios, ela vai receber um Blackberry. O aparelho vai ser necessário para receber emails e gerenciar sua agenda, que poderá ser controlada pela empresa.</p>
<p>Isso está acontecendo em todo lugar. Email, agenda e Internet, antes possível apenas com o uso de um notebook, agora podem ser acessados via um aparelho de 15 centímetros e tamanho. E com vantagens: mais leve, mais ágil, mais eficiente.</p>
<p>Mas minha sobrinha vai receber também um laptop. Esse vai servir para criar relatórios e acessar as aplicações da empresa – web ou desktop. </p>
<p>É nesse nicho que os pads podem se mostrar um melhor <em>form-factor</em>. É no lugar de notebooks de baixo desempenho e netbooks que o formato pad pode se destacar. Não por acaso, <a href="http://gizmodo.com/5532511/netboooks-are-dead-baby-netbooks-are-dead" target="_blank">a venda de netbooks vem caindo</a> desde 2009.</p>
<h2>Afinal, por que os netbooks existem?</h2>
<p>Sempre houve uma necessidade (pelo menos é isso o que o mercado acredita) de transformar o computador pessoal em algo mais móvel. Existe a necessidade para profissionais <em>on-the-go</em> de:</p>
<ul>
<li>Ler emails </li>
<li>Ler noticias </li>
<li>Marcar, ver compromissos </li>
<li>Criar relatórios, artigos </li>
<li>Usar aplicativos da empresa </li>
</ul>
<p>Para o usuário comum, é interessante uma forma mais simples de:</p>
<ul>
<li>Navegar na internet </li>
<li>Ver emails </li>
<li>Comunicação instantânea (IM, Skype) </li>
<li>Criar documentos (na escola, pelo menos) </li>
<li>Ver fotos </li>
<li>Assistir vídeos </li>
<li>Ouvir música </li>
<li>Jogar! </li>
</ul>
<p>Smartphones e palmtops (descansem em paz) são interessantes, mas não podem fazer tudo isso. Notebooks podem, mas são algo como overkill: são pesados, grandes, e desnecessariamente potentes, drenando mais bateria que o ideal. Netbooks eram a escolha óbvia então. Não fogem do seguro <em>look and feel </em>de um notebook, mas são mais adaptados para agilidade e eficiência.</p>
<p>Então, Steve Jobs assistiu muitos episódios de Jornada, e resolveu que a Apple podia adiantar o futuro. E todo mundo seguiu atrás. </p>
<h2>O alvorecer do futuro</h2>
<p>Um parênteses antes de continuar. Quando eu menciono <em>pad</em>, eu estou me referindo ao formato, ou seja, um aparelho leve, com uma tela gigante sensível ao toque para computação pessoal &#8211; e não especificamente o <em>iPad</em>, o aparelho da Apple.</p>
<p>O pad é o substituto perfeito para o netbook e notebooks. Eles possuem telas maiores que smartphones, permitindo uma usabilidade bem mais avançada que a pequena tela do telefone. E são bem superiores em facilidade de uso do que um netbook. Quando uma <strong>avó de 99 anos </strong>pode usar um computador como uma geek, você sabe que acertou na usabilidade.</p>
<div style="width:425px;display:block;float:none;margin:0 auto;padding:0;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:754f74e3-5cbd-4aad-8fbe-7647e5c40afb" class="wlWriterEditableSmartContent">
<div><span style="text-align:center; display: block;"><a href="http://fsomalia.wordpress.com/2010/09/18/e-a-apple-estava-certa-os-pads-sao-a-resposta%c2%a0definitiva/"><img src="http://img.youtube.com/vi/ndkIP7ec3O8/2.jpg" alt="" /></a></span></div>
</div>
<p>O que sabemos é que o mouse é um mal necessário. Não há precisão como o mouse, mas ele requer uma superfície. Isso sozinho já reduz versatilidade de um aparelho móvel. Touchpads de notebooks são ok, mas requer uma técnica maior ainda. Com telas sensíveis a toque, não há metáfora, não há abstração: você literalmente toca o que você quer tocar. Não há nada mais óbvio que isso, e minha mãe pode usar um computador (não é ela ali em cima).</p>
<h2>O que ainda falta</h2>
<p>Há quem diga que os pads na atual concepção ainda não são o aparelho final que vai substituir tudo. Ainda falta alguns pequenos detalhes para a dominação mundial. Mas se já não estamos lá, estamos muito perto.</p>
<h3>Teclado e suporte</h3>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/ipadkeyboarddock.jpg"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="ipad-keyboard-dock" border="0" alt="ipad-keyboard-dock" align="left" src="http://fsomalia.files.wordpress.com/2010/09/ipadkeyboarddock_thumb.jpg?w=240&#038;h=180" width="240" height="180" /></a> </p>
<p>Essa é uma grande questão. Há os proponentes do teclado físico, e há quem diga que <a href="http://www.businessinsider.com/psstno-physical-keyboard-isnt-that-big-of-a-deal-2009-10" target="_blank">isso não é necessário</a>. </p>
<p>A verdade é que a resposta táctil na digitação é uma mão na roda, principalmente para aqueles com visão comprometida. Por outro lado, um teclado no aparelho ocupa espaço útil (que deveria ser tela).</p>
<p>Outro problema crônico dos pads é justamente a falta de suporte – no sentido de apoio mesmo. Segurar um iPad no braço e digitar não é para os fracos. Sentar em uma posição ereta em uma mesa e digitar num pad não é confortável. </p>
<p>A saída é incorporar no aparelho um teclado e uma forma de suporte. A Dell está no <a href="http://zumo.uol.com.br/2010/09/14/dell-mostra-tablet-que-vira-netbook/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed:+ZumoBlog+(Zumo+Blog)" target="_blank">caminho certo</a>, mas desde que isso não comprometa o peso e tamanho. Ou usar acessórios. Um acessório matador seria aquele que oferecesse suporte, teclado, proteção e leveza para o pad. E eles <a href="http://www.hardwaresphere.com/2010/09/01/sena-folio-case-for-the-ipad-with-bluetooth-keyboard/" target="_blank">já</a> <a href="http://trendgadget.net/2010/05/18/clamcase-turn-ipad-into-a-laptop-transform/" target="_blank">existem</a>.</p>
<div style="width:425px;display:block;float:none;margin:0 auto;padding:0;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:862eeec0-7b69-4bb6-b7c3-e0cebb33d5d0" class="wlWriterEditableSmartContent">
<div><span style="text-align:center; display: block;"><a href="http://fsomalia.wordpress.com/2010/09/18/e-a-apple-estava-certa-os-pads-sao-a-resposta%c2%a0definitiva/"><img src="http://img.youtube.com/vi/H4IbgCLzazw/2.jpg" alt="" /></a></span></div>
</div>
<h3>Documentos</h3>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/01_word2007screen.gif"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="01_Word2007Screen" border="0" alt="01_Word2007Screen" align="left" src="http://fsomalia.files.wordpress.com/2010/09/01_word2007screen_thumb.gif?w=244&#038;h=172" width="244" height="172" /></a> </p>
<p>Convenhamos, todos nós estamos ligados ao Microsoft Office. Mesmo que eu não queira usá-lo. A necessidade de ler e criar documentos .doc vai ser uma presença por uma bom tempo.</p>
<p>Os pads precisam lidar com isso. E podem fazer isso de duas formas: ou os pads precisam incorporar um editor desse formato localmente, ou os documentos precisam deixar o computador e ir para a web.</p>
<p>Office no Windows é impraticável. Porque o Windows no pad é impraticável (veja mais daqui a pouco). O OpenOffice é OK, mas ainda precisamos vê-lo em uma distribuição Linux decente que não precise de grande processamento. As melhores soluções atualmente são do iPad, mesmo porque foram pioneiras. O aplicativo Pages possui <a href="http://www.tothepc.com/archives/open-edit-microsoft-word-documents-on-ipad/" target="_blank">algum suporte</a> a arquivos .doc, e você sempre pode contar com o <a href="http://www.dataviz.com/products/documentstogo/iphone/techspecs.html" target="_blank">Documents-to-go</a>. </p>
<p>A alternativa é mover os documentos para a nuvem e usar aplicações web. O <a href="https://docs.google.com" target="_blank">Google Docs</a> já está aí há algum tempo e é o primeiro nome que vem à cabeça. A Microsoft conta com o <a href="http://workspace.officelive.com/pt-BR/" target="_blank">Office Live Workspace</a> para concorrer na área. Temos o <a href="http://sharepoint.microsoft.com/" target="_blank">Sharepoint</a> para as empresas que querem controlar o conteúdo, e até um <a href="http://weblogs.asp.net/gabriellopez/archive/2010/04/07/ipad-client-for-sharepoint.aspx" target="_blank">cliente de Sharepoint para iPad</a>.</p>
<p>De qualquer forma, as soluções para arquivos de escritório estão aí.</p>
<h3>Sistema operacional</h3>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/apple_ipad_2.jpg"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="apple_ipad_2" border="0" alt="apple_ipad_2" align="left" src="http://fsomalia.files.wordpress.com/2010/09/apple_ipad_2_thumb.jpg?w=163&#038;h=240" width="163" height="240" /></a> Quem duvida ainda que um pad precisa ter um sistema operacional compatível com o formato? O iOS da Apple foi uma grande sacada, e os desenvolvedores podem se beneficiar de uma mesma API para seus programas. É, de longe, o sistema operacional mais bem preparado para o formato. O <a href="http://tech.fortune.cnn.com/2010/09/10/googles-hugo-barra-android-2-2-not-meant-for-tablets/" target="_blank">Android ainda não está otimizado para pads</a>, mas nada que não se corrija em uma ou duas versões. Nada se fala de grande no mundo dos Linuxes. Enquanto que a Microsoft…</p>
<p>A Microsoft ainda insiste em <a href="http://windows.microsoft.com/en-US/windows7/products/features/tablet-pc" target="_blank">usar o Windows</a> <a href="http://www.silicon.com/technology/hardware/2010/07/13/microsoft-windows-7-tablets-coming-in-months-39746093/" target="_blank">em pads</a>. De certa forma, faz sentido. Afinal, se estamos falando sobre substituir os notebooks por pads, também estamos falando que aquele sistema legado da empresa que foi feito para o notebook com Windows também vai rodar no pad.</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/20100819macallan2.jpg"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="20100819macallan2" border="0" alt="20100819macallan2" align="left" src="http://fsomalia.files.wordpress.com/2010/09/20100819macallan2_thumb.jpg?w=240&#038;h=135" width="240" height="135" /></a> Mas sabemos que o Windows puro simplesmente não vai funcionar no pad. Mesmo que hajam skins <a href="http://wmpoweruser.com/ui-centric-announced-tablet-user-interface-for-windows-7-windows-ce-7-oems/" target="_blank">maravilhosas</a> para melhorar a interface da Área de Trabalho, os sistemas feitos para Windows podem não trabalhar perfeitamente. Os menus não são dedáveis. Os botões são muito pequenos. A tela não rola quando o teclado virtual fica em cima de um campo de formulário. Sem falar no desempenho do Windows, que requer quantidade massiva de processamento, e bateria.</p>
<p>Bem, a Microsoft lançou nesse último mês o <a href="http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2010/09/01/windows-phone-7-released-to-manufacturing.aspx" target="_blank">Windows Phone 7</a>, e as <a href="http://developer.windowsphone.com/" target="_blank">ferramentas de desenvolvimento</a> para o sistema operacional de telefone. Steve Balmer já chegou a dizer que <a href="http://www.liliputing.com/2010/05/microsoft-has-no-plans-for-windows-phone-7-tablets.html" target="_blank">não há plano nenhum em colocar o WP7 nos pads</a>, e pelo que eu <a href="http://msdn.microsoft.com/en-us/library/ff637515(VS.92).aspx" target="_blank">andei lendo</a>, ele realmente não foi feito para isso. Mas há quem diga que <a href="http://www.pcworld.com/article/201826/windows,%20tablet%20pc" target="_blank">ainda é possível</a>. Para o desenvolvedor, isso seria bom. Se não pudermos ficar com o Windows, pelo menos teríamos uma única API em dois formatos para nos preocupar – que por acaso é quase a mesma coisa que estava por aí <a href="http://www.silverlight.net/" target="_blank">faz alguns anos</a>.</p>
<div style="width:425px;display:block;float:none;margin:0 auto;padding:0;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:04a43623-2892-464f-ba73-91d9944b3d2a" class="wlWriterEditableSmartContent">
<div><span style="text-align:center; display: block;"><a href="http://fsomalia.wordpress.com/2010/09/18/e-a-apple-estava-certa-os-pads-sao-a-resposta%c2%a0definitiva/"><img src="http://img.youtube.com/vi/ni9-o2lZFOQ/2.jpg" alt="" /></a></span></div>
</div>
<p><a href="http://fsomalia.files.wordpress.com/2010/09/chrome_os_screenshot_sdres_0001_appmenu.png"><img style="display:inline;margin-left:0;margin-right:0;border-width:0;" title="Chrome_OS_screenshot_sdres_0001_App-Menu" border="0" alt="Chrome_OS_screenshot_sdres_0001_App-Menu" align="right" src="http://fsomalia.files.wordpress.com/2010/09/chrome_os_screenshot_sdres_0001_appmenu_thumb.png?w=240&#038;h=135" width="240" height="135" /></a>E ainda temos o WebOS e o ChromeOS. Nenhum deles deu a graça em pads ainda, mas o WebOS sempre foi bem aclamado pelo seu multitarefa. A HP disse que tem pads com <a href="http://www.engadget.com/2010/08/19/hp-confirms-webos-tablet-for-early-2011/" target="_blank">WebOS saindo em 2011</a>, então só precisamos aguardar.&#160; As idéias de multitasking do WebOS foram parar no Chrome OS, que usa quase as mesmas metáforas: aplicações ocupam a tela inteira e são facilmente alternáveis. O problema do ChromeOS é que ele roda exclusivamente aplicações web, e isso pode ser um problema para os que requerem que as aplicações fiquem armazenadas localmente.</p>
<h2>A morte do notebook (como é hoje)</h2>
<p>Agora considere as características:</p>
<ul>
<li>Portátil </li>
<li>Leve </li>
<li>Consumo eficiente </li>
<li>Conectado </li>
<li>Fácil de usar </li>
</ul>
<p>Parece um netbook, certo? Mas são as características de um pad. Além disso, conte que:</p>
<ul>
<li>Aplicações promovem a eficiência </li>
<li>É <u>realmente</u> usável. Acelere sua produtividade com interfaces de toque </li>
<li>Você pode esquecer o teclado quando não precisa dele, ou pode usá-lo se precisar de longos trabalhos de digitação. </li>
</ul>
<p>Não é à toa que os netbooks estão morrendo. E levam junto os notebooks de baixo desempenho.</p>
<p>No entanto, não é acreditável que os notebooks irão morrer por completo. O pad é, essencialmente, um aparelho leve. Isso, hoje, implica em baixo desempenho. Algumas aplicações ainda irão requerer o processamento de um bom notebook:</p>
<ul>
<li>Designers gráficos </li>
<li>Edição de vídeo </li>
<li>Desenvolvimento de aplicações </li>
<li>Jogos de alto desempenho </li>
</ul>
<p>Portanto, é provável que, a médio prazo, o mercado de computação móvel esteja segmentado em smartphones, pads, e notebooks de alto desempenho. Isso significa morte aos notebooks de baixo desempenho.</p>
<p>Claro que nada impede que, no futuro, um pad seja tão potente que eu possa fazer edição de vídeo nele, ou chegar em casa, encaixá-lo num <em>dock</em>, e usar mouse, teclado e uma tela de 30 polegadas para jogar um pouco. Estamos <a href="http://www.anandtech.com/show/3933/amds-zacate-apu-performance-update" target="_blank">quase lá</a>, <a href="http://www.anandtech.com/show/3926/first-public-demo-of-oaktrail-and-windows-gaming-tablet" target="_blank">sim senhor</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/154/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=154&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/09/18/e-a-apple-estava-certa-os-pads-sao-a-resposta%c2%a0definitiva/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/sarah_sisko_reconstruction_thumb.jpg" medium="image">
			<media:title type="html">Sarah_Sisko_reconstruction</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/bb_bold_9700_detalhe_thumb.gif" medium="image">
			<media:title type="html">bb_bold_9700_detalhe</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/ipadkeyboarddock_thumb.jpg" medium="image">
			<media:title type="html">ipad-keyboard-dock</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/01_word2007screen_thumb.gif" medium="image">
			<media:title type="html">01_Word2007Screen</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/apple_ipad_2_thumb.jpg" medium="image">
			<media:title type="html">apple_ipad_2</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/20100819macallan2_thumb.jpg" medium="image">
			<media:title type="html">20100819macallan2</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/09/chrome_os_screenshot_sdres_0001_appmenu_thumb.png" medium="image">
			<media:title type="html">Chrome_OS_screenshot_sdres_0001_App-Menu</media:title>
		</media:content>
	</item>
		<item>
		<title>Crie tipos on-the-fly com Tipos Anônimos</title>
		<link>http://fsomalia.wordpress.com/2010/06/05/crie-tipos-on-the-fly-com-tipos%c2%a0anonimos/</link>
		<comments>http://fsomalia.wordpress.com/2010/06/05/crie-tipos-on-the-fly-com-tipos%c2%a0anonimos/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 00:00:00 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[.net 3.0]]></category>
		<category><![CDATA[tipos anonimos]]></category>
		<category><![CDATA[var]]></category>

		<guid isPermaLink="false">https://fsomalia.wordpress.com/?p=133</guid>
		<description><![CDATA[O .NET Framework é cheio de features que, passadas desapercebidas, nunca fariam falta. Uma delas é a capacidade de criar objetos com propriedades sem a necessidade de declarar uma classe. Note que eu não estou falando de Tipos Implícitos – Tipos Implícitos, ou var, permitem que você não se preocupe com o tipo de variável. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=133&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O .NET Framework é cheio de features que, passadas desapercebidas, nunca fariam falta. Uma delas é a capacidade de criar objetos com propriedades sem a necessidade de declarar uma classe.</p>
<p>Note que eu não estou falando de <a href="https://fsomalia.wordpress.com/?p=132" target="_blank">Tipos Implícitos</a> – Tipos Implícitos, ou <strong>var</strong>, permitem que você não se preocupe com o tipo de variável.</p>
<p>Não, eu não estou falando de <strong>var</strong>. Estou falando disso:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:2538a973-a5fa-47ad-8cb5-65518b1d28cc" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var pessoa = new
{
    Nome = &quot;João&quot;,
    Idade = 23
};

Console.WriteLine(pessoa.Nome);
// Imprime &quot;João&quot;
</pre>
</pre>
</div>
<p><span id="more-133"></span></p>
<p>Viu o que eu fiz ali? <strong>Eu criei um objeto do nada</strong>! Quão fantástico é isso, hein? “Olhe mãe, sem definição de classe”. </p>
<p>Bem, se você não está animado até agora, não posso fazer mais nada. Porque a feature acaba aí. Usando essa sintaxe de <strong>new</strong>, você pode criar um novo objeto simplesmente declarando as propriedades e os valores das propriedades, assim, tudo de uma vez.</p>
<p>Não pense que isso é um objeto superdinâmico. Não há nada de JavaScript aí. Não é possível criar um objeto desse jeito e mais pra frente criar novas propriedades.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ef9a1303-a7a2-417b-a5cc-20db90e7f439" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var pessoa = new
{
    Nome = &quot;João&quot;,
    Idade = 23
};

// Isso é um erro
pessoa.Nascimento = DateTime.Today;
</pre>
</pre>
</div>
<p>Internamente, o compilador literalmente cria uma nova classe com as propriedades que você declarou, inferiu os tipos das propriedades com o valores, criou um novo objeto com essa classe e atribuiu os valores nele. Ele só não te falou qual é o nome da classe. Ergo, <strong>Tipos Anônimos</strong>.</p>
<h2>Quando usar</h2>
<p>Bem Tipos Anônimos é um bom exemplo de feature que parece ser revolucionária, que dá vontade de usar toda hora, mas na verdade é bem difícil achar um caso em que você possa aplicar.</p>
<p>Use o seguinte pensamento para usar Tipos Anônimos:</p>
<ul>
<li>Eu preciso atribuir um valor a uma variável</li>
<li>A variável vai ser usada no mesmo escopo da sua declaração e não vou passar a variável para métodos posteriores</li>
<li>Os dados que a variável vai receber vêm de um tipo mais complexo, que eu não quero usar</li>
<li>Mas eu também não quero declarar uma nova classe só para usar aqui</li>
<li><strong>Portanto</strong>, eu vou usar um Tipo Anônimo</li>
</ul>
<p>Parece restritivo, não é? E é. Na prática, você vai usar tipos anônimos com LINQ, especificamente para a cláusula <strong>select</strong>.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c3c355bb-a14d-41cc-86bb-a36b23a40ae6" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var pessoas = from pessoa in Pessoas
                select new
                {
                    Nome = pessoa.Nome,
                    Idade = DateTime.Today.Year -
                    pessoa.Nascimento.Year
                };
</pre>
</pre>
</div>
<h2>Detalhes</h2>
<p>Existem mais alguns detalhes sobre tipo anônimos:</p>
<ul>
<li>As propriedades do objeto são criadas <em>read-only</em>. Isso mesmo, você não pode alterar o valor depois do objeto criado</li>
<li>As propriedades são sempre <em>public</em></li>
<li>Você só pode declarar propriedades. Não é possível criar métodos e eventos em um tipo anônimo</li>
<li>O tipo é criado como herança de <strong>object</strong>. Portanto, não é possível tratá-lo como nenhuma outra classe ou interface.</li>
<li>Se dois objetos são criados com as mesmas propriedades na mesma ordem, o compilador gera apenas uma classe anônima para os dois objetos</li>
<li>Você não pode passar um objeto de classe anônima para um método</li>
<li>Você não pode passar um objeto de classe anônima como retorno de um método</li>
<li>Você pode fazer as duas coisas anteriores se tratar o objeto como <strong>object</strong>. Mas então, fora do método você vai precisar fazer um casting de object para… o que mesmo?</li>
<li><strong>Equals()</strong> e <strong>GetHashCode()</strong> já vem implementados. Duas instâncias de mesmo tipo anônimo são iguais se todas as propriedades são iguais.</li>
</ul>
<h2>Concluindo</h2>
<p>Basicamente, você vai usar tipos anônimos quando você quer reduzir a complexidade de um objeto para usar em seguida somente para leitura. Em outras palavras:</p>
<ul>
<li>Em código de visualização de dados (código de views), </li>
<li>Ou como passo intermediário em uma transformação de dados complexa.</li>
</ul>
<p>De qualquer forma, tipos anônimos são uma boa para reduzir a complexidade de código e, se bem usada, pode gerar belos programas.</p>
<p>Tipos anônimos estão disponíveis a partir da versão 3.0 do .NET Framework.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/133/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=133&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/06/05/crie-tipos-on-the-fly-com-tipos%c2%a0anonimos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>
	</item>
		<item>
		<title>Reduza o código para implementar propriedades</title>
		<link>http://fsomalia.wordpress.com/2010/06/04/reduza-o-codigo-para-implementar%c2%a0propriedades/</link>
		<comments>http://fsomalia.wordpress.com/2010/06/04/reduza-o-codigo-para-implementar%c2%a0propriedades/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 00:00:00 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[.net 3.0]]></category>
		<category><![CDATA[preguiça]]></category>
		<category><![CDATA[propriedades]]></category>

		<guid isPermaLink="false">https://fsomalia.wordpress.com/?p=134</guid>
		<description><![CDATA[Convenhamos. Eu sou preguiçoso. E para um preguiçoso, quanto menos trabalho, melhor. Uma das features do .NET 3.0 é uma coisa chamada Propriedades Auto-Implementadas. Eu adoro o time de nomeação de features da Microsoft. De qualquer forma, essa coisinha permite reduzir drasticamente a quantidade de código necessário para escrever uma classe. Vou mostrar o que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=134&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Convenhamos. Eu sou preguiçoso. E para um preguiçoso, quanto menos trabalho, melhor.</p>
<p>Uma das features do .NET 3.0 é uma coisa chamada <strong>Propriedades Auto-Implementadas</strong>. Eu adoro o time de nomeação de features da Microsoft. De qualquer forma, essa coisinha permite reduzir drasticamente a quantidade de código necessário para escrever uma classe.</p>
<p>Vou mostrar o que eu quero dizer. Há milhares de anos atrás, em C#, nós costumávamos declarar propriedades dessa forma:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:0bc58d86-53dc-474f-b147-156df7141b44" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
private int _idade;
public int Idade
{
    get
    {
        return _idade;
    }
    set
    {
        _idade = value;
    }
}
</pre>
</pre>
</div>
<p>Está vendo todo esse código aí? Tudo isso para criar <strong>uma </strong>propriedade, <em>Idade</em>. Eu falo a você. Antigamente nós subíamos montanhas com pés descalços. <strong>Com vento contra</strong>.</p>
<p><span id="more-134"></span></p>
<p>Mas não mais. Com o C# 3.0, eu e você podemos escrever propriedades simples assim:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:4ed9f1cd-f9d0-4f47-89b6-b8e7d8a0b5fb" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
public int Idade { get; set; }
</pre>
</pre>
</div>
<ul>
<li>Sem campos privados</li>
<li>Com muito menos linhas de código</li>
<li>Com acessadores <strong>get</strong> e <strong>set</strong> funcionando perfeitamente</li>
</ul>
<p>Internamente, o compilador vai criar campos privados para armazenar os valores da propriedade. Você não vai ter acesso a esses campos. Não importa. Você pode usar a propriedade para setar valores.</p>
<p>Veja essa classe com 4 propriedades declaradas:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:811f48f4-fe57-4d0e-ae63-70fb751c0c43" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
class Pessoa
{
    public string Nome { get; set; }
    public string Endereco { get; set; }
    public int Idade { get; set; }
    public DateTime Nascimento { get; set; }
}

Pessoa p = new Pessoa();
p.Nome = &quot;Somalia&quot;;
</pre>
</pre>
</div>
<p>Isso seria impossível de conceber. Uma classe com quatro propriedades e 7 linhas? </p>
<p>E quando você deve usar essa sintaxe? Sempre. <strong>Sempre</strong>. Não há nenhuma perda em termos de desempenho em runtime, e o código fica aproximadamente 1337% mais claro. Não use a sintaxe antiga, a menos que você tenha uma boa razão para usar. </p>
<h2>Uma boa razão para usar a sintaxe antiga</h2>
<p>Você vai querer usar a sintaxe antiga se a propriedade não for trivial como setar ou buscar valor. Se Idade da classe Pessoa for um campo calculado, talvez não seja possível usar essa sintaxe de propriedade auto-implementada:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:1e40d2de-cacb-458e-8293-dc5d532e810e" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
class Pessoa
{
    public string Nome { get; set; }
    public string Endereco { get; set; }
        
    public DateTime Nascimento { get; set; }

    public int Idade
    {
        get { return DateTime.Today.Year - Nascimento.Year; }
    }
}
</pre>
</pre>
</div>
<h2>Restringindo modificação</h2>
<p>Com a sintaxe mostrada, é possível perceber que tanto o <strong>get</strong> quanto o <strong>set</strong> são públicos. Em alguns casos você não vai querer esse comportamento. Na classe <strong>Pessoa</strong>, o <strong>Nome</strong> e a data de <strong>Nascimento</strong> não podem ser modificadas depois da criação do objeto. </p>
<p>Nesse caso, você pode usar a sintaxe do <strong>private set</strong>.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:043eb312-97af-48b1-89ba-220df0237a2a" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
class Pessoa
{
    public Pessoa(string nome, DateTime nasc)
    {
        Nome = nome;
        Nascimento = nasc;
    }

    public string Nome { get; private set; }
    public DateTime Nascimento { get; private set; }

    public string Endereco { get; set; }

    public int Idade
    {
        get { return DateTime.Today.Year - Nascimento.Year; }
    }
}
</pre>
</pre>
</div>
<p><strong>private set</strong> torna <strong>set</strong> privado (duh). Isso quer dizer que, dentro da sua classe, você pode alterar os valores das propriedades simplesmente acessando a elas. Fora da classe, a propriedade é <em>read-only</em>. Isso quer dizer também que, se você quer passar valores às propriedades na inicialização, você precisa criar um construtor apropriado.</p>
<h2>Concluindo</h2>
<p>Simples e direto. Propriedades Auto-Implementadas é uma dádiva digital. Use. Sempre. Você vai querer usar sempre, será sua primeira escolha, a não ser que você tenha um bom motivo para não usar.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/134/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=134&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/06/04/reduza-o-codigo-para-implementar%c2%a0propriedades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>
	</item>
		<item>
		<title>Use Tipos Implícitos e deixe o óbvio de lado</title>
		<link>http://fsomalia.wordpress.com/2010/06/03/use-tipos-implicitos-e-deixe-o-obvio-de%c2%a0lado/</link>
		<comments>http://fsomalia.wordpress.com/2010/06/03/use-tipos-implicitos-e-deixe-o-obvio-de%c2%a0lado/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 03:00:00 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[.net 3.0]]></category>
		<category><![CDATA[var]]></category>

		<guid isPermaLink="false">https://fsomalia.wordpress.com/?p=132</guid>
		<description><![CDATA[Você já deve saber que eu tenho problemas com a natureza burocrática da tipagem em .NET. Tipos são ótimos e tudo o mais, mas quando eu começo a escrever mais código de casting do que de negócio, algo não está certo. Por isso, acho válida qualquer tentativa de reduzir o nível de burocracia na hora [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=132&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Você já deve <a href="https://fsomalia.wordpress.com/2010/05/17/classes-especializadas-com-generics/" target="_blank">saber</a> que eu tenho problemas com a natureza burocrática da tipagem em .NET. Tipos são ótimos e tudo o mais, mas quando eu começo a escrever mais código de casting do que de negócio, algo não está certo. Por isso, acho válida qualquer tentativa de reduzir o nível de burocracia na hora de escrever o código.</p>
<p>Um desses recursos é o famoso Tipo Implícito, também conhecido como <strong>var</strong>:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ce464848-1798-4d1a-9513-a8846f7eeafd" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; pad-line-numbers: true;">
var numbers = new[] {4,8,15,16,23,42};

Console.WriteLine(numbers.Length);
</pre>
</pre>
</div>
<p><span id="more-132"></span></p>
<p>O recurso é bem básico e fácil de usar. Faça o seguinte:</p>
<ol>
<li>Use a palavra chave <strong>var</strong> para definir o tipo de uma variável ao invés do tipo real; </li>
<li>Note que a variável se comporta como uma variável tipada, incluindo Intellisense; </li>
<li>Lucre. </li>
</ol>
<p>Uma nota importante antes de prosseguir: <strong>var</strong> não é <strong>object</strong>. <strong>var</strong> não serve para deixar uma variável aceitar qualquer tipo. Ele indica ao compilador para ele decidir que tipo a variável, e o compilador faz isso na primeira inicialização dela. Assim, isso dará um erro:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:a68ef360-35c2-454e-a140-7ab7c6609b0f" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var numbers = new[] {4,8,15,16,23,42};

numbers = 23;
</pre>
</pre>
</div>
<p>Porque de início, <strong>numbers</strong> foi inicializado como <strong>int[]</strong> e na linha 3 o código tenta atribuir um <strong>int</strong> à variável. No can do. <strong>var</strong> não é <strong>object</strong>, <strong>var</strong> é um recurso para deixar o compilador atribuir o tipo por você. A natureza fria e burocrática da tipagem em .NET ainda corre por baixo.</p>
<p>Mas deixe-me mostra exemplos onde isso é realmente interessante:</p>
<ul>
<li>Você pode criar variáveis locais <strong>var</strong> para receber valores de um método, mas não se importar com a documentação do método para descobrir que tipo ele vai retornar </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:89d0af8f-0b35-4401-8ea1-5ebdd09248fd" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var pessoa = Buscar(42);

Console.WriteLine(pessoa.ToString());
</pre>
</pre>
</div>
<ul>
<li>Você pode usar no inicializador de um <strong>for</strong> </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:6363b9ca-a9bd-43e5-9502-5f7bbceb085f" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
for (var i = 0; i &lt; 10; i++)
{
    Console.WriteLine(i);
}
</pre>
</pre>
</div>
<ul>
<li>Você pode usar em um <strong>foreach</strong> </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:e8a8c691-9c57-4676-9db2-d3a2b1721131" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
foreach (var p in Pessoas)
{
    Console.WriteLine(p.ToString());
}
</pre>
</pre>
</div>
<ul>
<li>Você pode usar para definir uma variável no <strong>using</strong> </li>
</ul>
</p>
</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:cbbf3e09-e81f-43e6-ba94-b2f323ee83c5" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
using (var comando = new OracleCommand(&quot;select * from pessoas&quot;))
{
}
</pre>
</pre>
</div>
<p>Ah, e eu já falei que você não perde nenhum recurso do Visual Studio, não é? Se você pousar o mouse sobre a variável, o Visual Studio te fala qual é o tipo real. Se você teclar Control+Espaço, ele te dá Intellisense correto:</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/06/image.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/06/image_thumb.png?w=474&#038;h=132" width="474" height="132" /></a> </p>
<p>Como tudo que é bom tem restrições, você <strong>não pode</strong>:</p>
<ul>
<li>Usar <strong>var</strong> como tipo de retorno de um método ou propriedade </li>
</ul>
<p><a href="http://fsomalia.files.wordpress.com/2010/06/image1.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/06/image_thumb1.png?w=383&#038;h=98" width="383" height="98" /></a> </p>
<ul>
<li>Usar <strong>var</strong> como tipo de parâmetro de um método </li>
</ul>
<p><a href="http://fsomalia.files.wordpress.com/2010/06/image2.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/06/image_thumb2.png?w=450&#038;h=96" width="450" height="96" /></a> </p>
<ul>
<li>Usar <strong>var</strong> em uma constante </li>
</ul>
<p><a href="http://fsomalia.files.wordpress.com/2010/06/image3.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/06/image_thumb3.png?w=384&#038;h=141" width="384" height="141" /></a> </p>
<h2>Quando Usar</h2>
<p>O uso de <strong>var</strong> reduz a burocracia da tipagem, mas pode levar a um código confuso se ele for usado ao extremo. Imagine um código onde tipos não são mais declarados, e todo desenvolvedor é obrigado a sair a caça das declarações para inferir o tipo da variável. </p>
<p>Não, muito obrigado. Mas talvez você queira usar <strong>var</strong> quando:</p>
<ul>
<li>Se referir a tipos anônimos (na verdade, você é obrigado) </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:8a101426-ec42-4b32-befa-8437329b50a6" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var pessoa = new { Nome = &quot;João&quot;, Idade = 23 };
</pre>
</pre>
</div>
<ul>
<li>Se referir a expressões LINQ </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:3b545ccc-befb-4147-b1d5-4db1ffb378c0" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var pessoas = from p in Pessoas 
              where p.Nome.Contains(&quot;Somalia&quot;) 
              select p.Nome;
</pre>
</pre>
</div>
<ul>
<li>Se referir a tipos genéricos complexos </li>
</ul>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:b07ae714-1893-4f11-9b85-e43309b0001a" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; html-script: false;">
var table = new Dictionary&lt;string, object&gt;();
</pre>
</pre>
</div>
<p>E talvez você prefira declarar o tipo quando as atribuições forem mais simples e diretas.</p>
<p>Parágrafo Bônus: Arrays Implícitos</p>
<p>Se você viu o primeiro código exemplo deste post, deve ter percebido uma forma de tipagem implícita com o array:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:8e2f15d9-f3b3-4a11-92fc-bee4b5eb1479" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
var numbers = new[] {4, 8, 15, 16, 23, 42};
// numbers é implicitamente tipado para int[]
</pre>
</pre>
</div>
<p>Bem, <strong>numbers</strong> é tipado como <strong>int[]</strong> sem mesmo a criação do array indicar que é um <strong>int[]</strong>. A única coisa que aparece na criação do array é um tal de <strong>new[]</strong>.</p>
<p>Bem <strong>new[]</strong> é a palavra chave para os arrays tipados implicitamente. Basicamente o compilador, quando encontra <strong>new[]</strong>, checa os tipos dos itens do array declarados logo a seguir para definir o tipo do array.</p>
<p>Outros exemplos:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:834e62ca-2628-4de1-8a57-3cc5ad2ecceb" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
// string[]
var words = new[] { &quot;hello&quot;, null, &quot;world&quot; }; 

// int[][]
var matrix = new[]
{  
    new[]{1,2,3,4},
    new[]{5,6,7,8}
};
</pre>
</pre>
</div>
<h2>Concluindo</h2>
<p><strong>var</strong> reduz a burocracia do código e pode dar uma aliviada naquele código extremamente declarativo. Se você seguir algumas boas práticas para evitar o superuso, seu código vai ficar mais legível. Use sempre que possível. Vale lembrar que o uso de <strong>var</strong> não acarreta em nenhuma perda de desempenho do código final. </p>
<p>Como quase todas as coisas boas do .NET, <strong>var </strong>está disponível a partir da versão 3.0.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/132/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=132&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/06/03/use-tipos-implicitos-e-deixe-o-obvio-de%c2%a0lado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/06/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/06/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/06/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/06/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Corrigindo a classe dos outros com Extension Methods</title>
		<link>http://fsomalia.wordpress.com/2010/05/20/corrigindo-a-classe-dos-outros-com-extension%c2%a0methods/</link>
		<comments>http://fsomalia.wordpress.com/2010/05/20/corrigindo-a-classe-dos-outros-com-extension%c2%a0methods/#comments</comments>
		<pubDate>Fri, 21 May 2010 03:32:21 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[extension methods]]></category>

		<guid isPermaLink="false">https://fsomalia.wordpress.com/?p=118</guid>
		<description><![CDATA[Quem já programou acesso a banco de dados na mão em .NET, sabe que mexer naquelas classes do ADO.NET é mais feio que processo na Justiça. É uma salada mista de Commands, Connections, DataReaders, DataAdapters, e outros bichos. O ADO.NET é uma biblioteca de baixo nível, bem estruturada, e por causa disso, um pé-no-saco de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=118&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quem já programou acesso a banco de dados na mão em .NET, sabe que mexer naquelas classes do <a href="http://msdn.microsoft.com/en-us/library/9tahwysy(v=VS.100).aspx" target="_blank">ADO.NET</a> é mais feio que processo na Justiça. É uma salada mista de Commands, Connections, DataReaders, DataAdapters, e outros bichos. O ADO.NET é uma biblioteca de baixo nível, bem estruturada, e por causa disso, um pé-no-saco de se programar.</p>
<p>Pois bem, minha última pendenga com ADO.NET foi com parâmetros de comando. Para quem não é versado no assunto, basicamente o ADO.NET é estruturado de forma que você possa enviar comandos <a href="http://pt.wikipedia.org/wiki/SQL" target="_blank">SQL</a> para um banco de dados (como SELECT, INSERT, CREATE TABLE, etc) ou fazer chamadas a <em>stored procedures</em> e <em>functions</em>.</p>
<p>Rege as leis dos bons costumes (e o medo do <a href="http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL" target="_blank">SQL Injection</a>) que, sempre que for necessário enviar dados para um comando SQL (como o filtro de um SELECT), você precisa usar parâmetros de comando. Ou seja, ao invés de você fazer isso:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ce450718-01e4-493d-9fb7-c40b7816616a" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; pad-line-numbers: true;">
public List&lt;Pessoa&gt; ListarPessoas(string nome)
{
    string query = &quot;SELECT * FROM PESSOAS A WHERE A.NOME LIKE '%&quot; + nome + &quot;%'&quot;;
    OracleCommand comando = new OracleCommand(query);

    // Continua..
</pre>
</pre>
</div>
<p>É bem melhor para sua sanidade e emprego fazer isso:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:95b2ed0d-b643-4af7-b657-83311a5babad" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
public List&lt;Pessoa&gt; ListarPessoas(string nome)
{
    string query = &quot;SELECT * FROM PESSOAS A WHERE A.NOME LIKE :nome&quot;;    
    OracleCommand comando = new OracleCommand(query);

    OracleParameter param = new OracleParameter(&quot;nome&quot;, nome);
    param.OracleType = OracleType.VarChar;
    comando.Parameters.Add(param);
</pre>
</pre>
</div>
<p>Só que com essa pequena adição de segurança, você ganha também uma porção de linhas de código a mais no seu programa. Que <strong>você</strong> terá que escrever. Imagine um comando relativamente realístico cheio de parâmetros como este:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bb20c79a-3916-4f3d-b78a-68a400f209a7" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
string query = &quot;SELECT * FROM PESSOAS A WHERE &quot; +
    &quot;A.NOME LIKE :nome AND &quot; +
    &quot;A.IDADE &gt; :idade AND &quot; +
    &quot;DATA_CADASTRO &gt;= :data_inicial &quot; +
    &quot;DATA_CADASTRO &lt;= :data_final &quot;;
</pre>
</pre>
</div>
<p>Consegue ter uma idéia de quantas linhas de código são necessárias para adicionar todos esses parâmetros? Quanto tempo vai ficar perdendo tempo com burocracia de código? Quão mais próximo de um colapso do túnel de carpo? Eu digo a você: a resposta é <em>muito</em>.</p>
<p>Nessas horas eu me pego filosofando: deve haver um modo mais fácil de fazer isso. Um modo de economizar trabalho burocrático. Um modo de escrever apenas o essencial, de se livrar da gordura. Diabo, um modo de consertar essas classes que não pensam na saúde dos seus clientes. </p>
<p>E por incrível que pareça, existe um modo. A solução se chama Extension Methods, e está no .NET Framework a partir da versão 3.0.</p>
<p><span id="more-118"></span></p>
<h2>Extension Methods</h2>
<p>A verdade é que os programadores do ADO.NET se esqueceram do trabalho diário dos seus clientes. Se eu tivesse o poder de alterar alguma coisa no ADO.NET, eu incluiria um método mágico a classe OracleCommand. Esse método mágico receberia três parâmetros: seu nome, seu tipo, e o valor a atribuir. Eu planejaria usar esse método dessa forma:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c3491b61-e0a8-461e-b6e2-e49dfa6db1a8" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp;">
comando.AddInputParameter(&quot;nome&quot;, OracleType.VarChar, nome);
</pre>
</pre>
</div>
<p>E quer saber? É exatamente isso que o Extension Methods faz por você.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank">Extension Methods</a> permite que você adicione métodos em classes já existente e compiladas sem ter que:</p>
<ol>
<li>Criar um tipo derivado </li>
<li>Recompilar </li>
<li>Modificar de qualquer modo a classe original </li>
</ol>
<p>Mágica? Parece, mas os Extension Methods nada mais são que métodos <em>static</em> com parâmetros especiais. Para o código cliente – ou seja, a sua classe que usa a classe estendida – é como se o método pertencesse ao tipo original. Mas não se engane: os Extension Methods não modificam o tipo original de forma alguma, tampouco permite acessar membros privados. Mas são divertidos pra caramba.</p>
<p>OK, vamos à obra. Para criar um método de extensão você precisa de três coisas bem simples:</p>
<ol>
<li>Criar uma classe <em>static</em> com um nome sugestivo, como <em>OracleCommandExtension</em> (viu o que eu fiz? Esperto eu, hein?); </li>
<li>Criar o método de extensão desejado como um método <em>public</em> e <em>static</em> nessa classe recém-criada; </li>
<li>O primeiro parâmetro desse método precisa ser da classe que você quer “estender”, e precisa ter o modificador <em>this</em> no parâmetro. </li>
</ol>
<p>Sem mais delongas, veja como eu criei minha classe <em>OracleCommandExtension</em>:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:11eb78b2-398a-4c32-956d-e2b48e0779bb" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; highlight: [1,3];">
static class OracleCommandExtension
{
    public static void AddInputParameter(this OracleCommand comm, 
        string name, OracleType type, object value)
    {
        OracleParameter par = new OracleParameter(name, value);
        par.OracleType = type;
        comm.Parameters.Add(par);
    }
}
</pre>
</pre>
</div>
<p>Reveja os pontos: classe <em><strong>static</strong></em>, método <strong><em>public</em> e <em>static</em></strong>, primeiro parâmetro com <em><strong>this</strong></em> e do <strong>tipo que eu quero estender</strong>. Note então o que eu faço no método: exatamente o que eu faria no código cliente – criar o parâmetro, configurar o parâmetro, colocar o parâmetro na lista de parâmetros do comando. Ou seja, todo o código burocrático e chato vai pro método de extensão.</p>
<p>Como usar? Simples demais. Simplesmente acredite que esse método agora faz parte da classe estendida:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:291c59ab-1cc2-4a72-85a6-0a056e2ebd2a" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; highlight: [2];">
OracleCommand comando = new OracleCommand(query);
comando.AddInputParameter(&quot;nome&quot;, OracleType.VarChar, nome);
</pre>
</pre>
</div>
<p>Divino, ham? Tirando o primeiro parâmetro declarado no método de extensão (que indica a classe estendida), os outros parâmetros são mantidos para o código cliente usar.</p>
<p>Parece que a classe acabou de ganhar um novo método, mas não foi bem isso que aconteceu. Internamente, o compilador do C# traduz isso que você escreveu para isso:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:2daeb23c-2629-4a5d-bab3-65787193e33e" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; highlight: [2];">
OracleCommand comando = new OracleCommand(query);
OracleCommandExtension.AddInputParameter(comando, &quot;nome&quot;, OracleType.VarChar, nome);
</pre>
</pre>
</div>
<p>Portanto, não ligue perguntando porque você não consegue acessar campos privados ou protegidos, ou não consegue reescrever métodos virtuais. Extension Methods <strong>não é </strong>subclassing; é uma forma de eliminar a gordura do código cliente. No Visual Studio, os métodos de extensão aparecem diferentes no Intellisense: com uma setinha azul junto ao ícone do método, e com os dizeres (<em>extension)</em>:</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/05/image2.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://fsomalia.files.wordpress.com/2010/05/image_thumb2.png?w=423&#038;h=139" width="423" height="139" /></a> </p>
<h2>Estendendo coleções</h2>
<p>Uma maneira muito legal de usar Extension Methods é com coleções. Sabe aquelas operações que precisam ser feitas levando em consideração todos os itens da coleção? Como “transformar todas as strings da lista em maiúsculas” ou “somar todos os números da coleção”? Ao invés de fazer foreaches sempre que precisar fazer isso, simplesmente crie um Extension Method e se livre da gordura.</p>
<p>Veja um método que estende List&lt;string&gt; para transformar todas as strings da lista em maiúsculas:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:11d7964a-554f-4331-b8ec-f9d1a838cb1b" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; highlight: [3,22];">
static class ListStringExtension
{
    public static void ToUpper(this List&lt;string&gt; list)
    {
        for (int i = 0; i &lt; list.Count; i++)
        {
            if (string.IsNullOrEmpty(list[i])) continue;
            list[i] = list[i].ToUpper();
        }
    }
}

class Program
{        
    static void Main(string[] args)
    {
        List&lt;string&gt; lista = new List&lt;string&gt;();
        lista.Add(&quot;uva&quot;);
        lista.Add(&quot;pera&quot;);
        lista.Add(&quot;maçã&quot;);

        lista.ToUpper();

        foreach (string fruta in lista)
        {
            Console.WriteLine(fruta);
        }
    }
}
</pre>
</pre>
</div>
<p>O primeiro parâmetro pode ser uma interface também. Veja um método de extensão que estende todas as coleções de decimal.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:1fbad096-53cf-44d1-a21d-c504ce6c17c7" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; highlight: [3,20];">
static class NumberCollectionExtension
{
    public static decimal Sum(this ICollection&lt;decimal&gt; list)
    {
        decimal sum = 0;
        foreach (decimal d in list)
        {
            sum += d;
        }
        return sum;
    }
}

class Program
{        
    static void Main(string[] args)
    {
        decimal[] numbers = { 4, 8, 15, 16, 23, 42 };

        Console.WriteLine(numbers.Sum()); // 108
    }
}
</pre>
</pre>
</div>
<p>Extension Methods combinam tanto com coleções, que acabou se tornando a base para o <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank">LINQ</a>. Falaremos de LINQ nos próximos artigos.</p>
<h2>Pra acabar</h2>
<p>Alguns pontos importantes sobre Extension Methods:</p>
<ul>
<li>Extension Methods <strong>não é</strong> herança (não custa nada lembrar) </li>
<li>Extension Methods permite eliminar código repetitivo – de maneira <strong>elegante</strong>! </li>
<li>Extension Methods transforma classes chatas de usar em classes <strong>menos chatas</strong> de usar </li>
<li>Você pode criar Extension Methods para <strong>qualquer</strong> tipo em .NET:
<ul>
<li>Classes </li>
<li>Interfaces </li>
<li>Structs </li>
<li>Enums </li>
</ul>
</li>
<li>Se você criar um Extension Method com o mesmo nome de um método que já existe na classe estendida, o método de extensão <strong>nunca</strong> será chamado
<ul>
<li>Por exemplo, criar um método de extensão Count para a classe List&lt;T&gt; não adianta nada: o Count que já existe lá é que será chamado. Sempre. </li>
</ul>
</li>
<li>Atenção às bibliotecas de extensão! Se você criar bibliotecas com métodos de extensão e quiser usar em outros projetos, lembre-se que o compilador não pode encontrar os métodos de extensão se não puder encontrar a classe de extensão. Portanto, faça isso:
<ul>
<li>Declare a classe de extensão como <em><strong>public</strong></em> </li>
<li>No seu projeto cliente, <strong>adicione referência</strong> à biblioteca onde está a classe de extensão </li>
<li>No código cliente, <strong>crie um <em>using</em></strong> para o namespace onde está a classe de extensão </li>
</ul>
</li>
</ul>
<p>Extension Methods é provavelmente a coisa mais legal que inventaram depois de pão fatiado. Recomendo a todos que usem!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=118&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/05/20/corrigindo-a-classe-dos-outros-com-extension%c2%a0methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/05/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Classes especializadas com Generics</title>
		<link>http://fsomalia.wordpress.com/2010/05/17/classes-especializadas-com-generics/</link>
		<comments>http://fsomalia.wordpress.com/2010/05/17/classes-especializadas-com-generics/#comments</comments>
		<pubDate>Mon, 17 May 2010 19:30:56 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[dictionary]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[swap]]></category>

		<guid isPermaLink="false">http://fsomalia.wordpress.com/?p=89</guid>
		<description><![CDATA[Vamos colocar isso em pratos limpos: o framework .NET é fortemente tipado, e isso às vezes é uma maldição. Veja bem, não quero começar aqui uma discussão religiosa sobre linguagens de programação. Eu vejo a coisa de uma forma bem pragmática. Toda a questão sobre tipagem forte ou fraca no fim se resume a onde [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=89&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vamos colocar isso em pratos limpos: o framework .NET é <strong>fortemente tipado</strong>, e isso às vezes é uma maldição.</p>
<p>Veja bem, não quero começar aqui uma discussão religiosa sobre linguagens de programação. Eu vejo a coisa de uma forma bem pragmática. Toda a questão sobre tipagem forte ou fraca no fim se resume a onde você, programador, quer ver o erro: na compilação ou no software rodando.</p>
<p>O problema com o .NET fortemente tipado é pela quantidade de declarações, <em>castings</em>, conversões de tipo você precisa fazer para um simples programa com uma coleçãozinha. Estou falando do <a href="http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx" target="_blank">ArrayList</a>:</p>
<p><pre class="brush: csharp;">
ArrayList pessoas = new ArrayList();

// Dentro do ArrayList vai qualquer coisa
pessoas.Add(new Pessoa(&quot;Fabricio&quot;));
pessoas.Add(new Pessoa(&quot;Somalia&quot;));

// Para devolver, você precisa dizer o que quer
Pessoa somalia = (Pessoa) pessoas[1];
Console.WriteLine(somalia.Nome);</pre></p>
<p>A &#8220;grande&#8221; vantagem do ArrayList é que, como ele é uma coleção de <em>object</em>, ele pode receber qualquer coisa como item. O ArrayList é uma mãe: o que você mandar pra ele, ele recebe. Mas toda essa vantagem é jogada fora quando você quer o objeto de volta: você precisa dizer o que quer (casting). E que uma entidade oniciente te ajude caso o objeto que você espera não seja o que você pensa que é.</p>
<p>Quero dizer, uma vez me falaram que com o ArrayList você podia jogar qualquer coisa dentro. Tipo, misturar os objetos mesmo. Assim, ó:</p>
<p><pre class="brush: csharp;">
ArrayList bagunca = new ArrayList();

bagunca.Add(&amp;quot;Eu não queria estar nesse ArrayList&amp;quot;);
bagunca.Add(42);
bagunca.Add(new Pessoa(&amp;quot;Almeida Soares&amp;quot;));

foreach (string item in bagunca) // Isso não vai dar certo
{
	Console.WriteLine(item);
}</pre></p>
<p>Sério? Quem programa coleções desse jeito? Isso não é vantagem, é um problema! O código acima vai quebrar, e você só vai descobrir quando rodar o programa.</p>
<p>O fato é que seria perfeito se:</p>
<ol>
<li>Com uma única classe de coleção, pudéssemos adicionar qualquer objeto</li>
<li>Não precisássemos fazer castings e converões na hora de usar a coleção</li>
<li>Seja impossível um usuário da classe fazer bagunça em uma coleção (misturando valores adicionados)</li>
</ol>
<p>Bem, alguém ouviu essas preces, implementou no .NET Framework, e chamou de <strong>Generics</strong>.</p>
<p><span id="more-89"></span>A idéia de <a href="http://msdn.microsoft.com/en-us/library/512aeb7t(VS.80).aspx" target="_blank">Generics</a> é a gente poder escolher, na hora de criar o objeto de coleção, qual classe a coleção vai aceitar como item. Complexo? Um exemplo então. Eis a versão Generics do ArrayList, o <a href="http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx" target="_blank">List</a>:</p>
<p><pre class="brush: csharp;">
List&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;();

pessoas.Add(new Pessoa(&quot;Fabricio&quot;));
pessoas.Add(new Pessoa(&quot;Somalia&quot;));

pessoas.Add(42) // isso nao funciona
pessoas.Add(&quot;Uma string malandra&quot;) // isso também não</pre></p>
<p>Veja bem a declaração do objeto List. Note bem uma classe <em>Pessoa</em> pairando dentro daquilo que parace uma tag de HTML.</p>
<p>Acontece que o List por si só é um concha vazia. Uma alma sem cara-metade. Um barco sem mar, um campo sem flor. O List, como todas as classes Generics, precisa de um <strong>argumento</strong>, um tipo declarado entre o <em>&lt;</em> e o <em>&gt;</em>, que é justamente a classe alma-gêmea do Generics.</p>
<p>Quando você cria um objeto Generics com um argumento – digamos, um List com argumento Pessoa – tudo muda. O objeto Generic deixa de ser uma casca vazia. No nosso exemplo, a List passa a aceitar apenas objetos <em>Pessoa</em>. Coisas como números, strings e Enderecos não entram. A ajuda do <em>Intellisense</em> no Visual Studio mostra isso:</p>
<p><a href="http://fsomalia.files.wordpress.com/2010/05/image.png"><img style="display:inline;border-width:0;" title="image" src="http://fsomalia.files.wordpress.com/2010/05/image_thumb.png?w=357&#038;h=115" border="0" alt="image" width="357" height="115" /></a></p>
<p>Mais tarde, se você precisar criar uma coleção de números, basta informar o tipo <em>int</em> na declaração da coleçao:</p>
<p><pre class="brush: csharp;">
List&lt;int&gt; numeros = List&lt;int&gt;();

numeros.Add(4);
numeros.Add(8);
numeros.Add(15);
numeros.Add(16);
numeros.Add(23);
numeros.Add(42);

numeros.Add(&quot;números malditos!&quot;); // nao permitido</pre></p>
<p>Como você já pode ou não estar pensando, para obter um valor da lista é muito simples: basta obtê-lo!:</p>
<p><pre class="brush: csharp;">
List&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;();

pessoas.Add(new Pessoa(&quot;Fabricio&quot;));
pessoas.Add(new Pessoa(&quot;Somalia&quot;));

Pessoa somalia = pessoas[1]; // livre de castings!

Console.WriteLine(somalia.Nome);</pre></p>
<p>Entende como isso é <span style="text-decoration:underline;">libertador</span>? Sem conversões. Sem insegurança de tipagem. Com ajuda. <strong>É uma vida mais feliz</strong>.</p>
<p>Mas não é só isso. Generics também melhora o desempenho de sua aplicação!</p>
<p>É que quando você cria um objeto Generic e o associa a um argumento do tipo de <a href="http://msdn.microsoft.com/en-US/library/s1ax56ch(v=VS.80).aspx" target="_blank">valor</a>, o compilador, quando vai fazer coisas de compilador, olha para o <em>List&lt;int&gt;</em> e diz: “<em>Humm, então você quer uma classe especializada para inteiros</em>”. Pois o compilador literalmente cria uma classe especializada para inteiros, onde as estruturas internas são variáveis para inteiros.</p>
<p>Se você criar então, digamos, um objeto <em>List&lt;char&gt;</em>, o compilador vai lá e cria uma classe especializada só para char. Isso quer dizer que os valores não são mais guardados dentro de variáveis <em>object</em> – eles são guardados em variáveis tipadas apropriadamente. Conversões internas não são mais feitas a torto e direito. Desempenho <em>for free</em>.</p>
<p>Então ganhamos:</p>
<ol>
<li>Com uma única classe de coleção, podemos adicionar qualquer objeto – basta declarar o tipo da coleção na declaração da variável</li>
<li>Não precisamos fazer castings e conversões na hora de usar a coleção – e o Intellisense do Visual Studio ajuda na hora de usar a coleção</li>
<li>É impossível um usuário da classe fazer bagunça em uma coleção – a não ser, claro, se ele declarar um <em>List&lt;object&gt;</em></li>
</ol>
<h2>Generics em classes, interfaces, métodos…</h2>
<p>Generics no .NET não está presente só em classes de coleções. Claro, de longe, a maior utilidade dos Generics no Framework são para coleções. Eu só falei do <em>List&lt;T&gt;</em>, mas outras coleções notáveis são:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx" target="_blank">Dictionary&lt;TChave, TValor&gt;</a>: é a versão Generic no <a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx" target="_blank">Hastable</a>. Ou seja, uma Hashtable tipada. Você especifica não um, mas <em>dois</em> argumentos – um para o tipo da chave do Hashtable, um para o tipo do valor que será guardado. Vive inseparável da classe <a href="http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx" target="_blank">KeyValuePair&lt;TChave, TValor&gt;</a>, que nada mais é que o objeto que o Dictionary&lt;TChave, TValor&gt; guarda.</li>
</ul>
<p><pre class="brush: csharp;">
Dictionary&lt;string, Color&gt;() cores = new Dictionary&lt;string, Color&gt;();

cores.Add(&quot;RED&quot;, Color.FromArgb(255, 0, 0));
cores.Add(&quot;BLU&quot;, Color.FromArgb(0, 255, 0));

foreach (KeyValuePair&lt;string, Color&gt; item in cores)
{
	Console.WriteLine(item.Key);
	Console.WriteLine(item.Value.IsKnownColor);
}</pre></p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/7977ey2c(v=VS.100).aspx" target="_blank">Queue&lt;T&gt;</a>: versão Generic do <a href="http://msdn.microsoft.com/en-us/library/system.collections.queue(v=VS.100).aspx" target="_blank">Queue</a>. Fila tipada pronta para uso.</li>
</ul>
<p><pre class="brush: csharp;">
Queue&lt;Pessoa&gt; vacinacao = new Queue&lt;Pessoa&gt;();

vacinacao.Enqueue(new Pessoa(&quot;Fabricio&quot;));
vacinacao.Enqueue(new Pessoa(&quot;Somalia&quot;));

Pessoa p = vacinacao.Dequeue();

Console.WriteLine(p.Nome); // Fabricio</pre></p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/3278tedw(v=VS.100).aspx" target="_blank">Stack&lt;T&gt;</a>: versão Generic do <a href="http://msdn.microsoft.com/en-us/library/system.collections.stack(v=VS.100).aspx" target="_blank">Stack</a>. Pilha tipada pronta para uso.</li>
</ul>
<p><pre class="brush: csharp;">
Stack&lt;Prato&gt; pratosParaLavar = new Stack&lt;Prato&gt;();

pratosParaLavar.Push(new Prato(&quot;Porcelana&quot;));
pratosParaLavar.Push(new Prato(&quot;Duralex&quot;;));

Prato p = pratosParaLavar.Pop();

Console.WriteLine(p.Tipo); // Duralex</pre></p>
<p>Você pode encontrar Generics em <strong>interfaces</strong> também. Essas interfaces podem ser usadas como tipos de variáveis, ou para criar outras classes. Por exemplo, o <em>List&lt;T&gt;</em> possui um método chamado <a href="http://msdn.microsoft.com/en-us/library/234b841s(v=VS.100).aspx" target="_blank">Sort</a>. Como você pode imaginar, <em>Sort <span style="font-style:normal;"><span style="text-decoration:underline;">ordena</span></span></em> os itens da coleção. Tudo parece claro: se a lista é de inteiros, <em>Sort</em> os ordena em ordem crescente; se a lista é de strings, <em>Sort </em>as ordena em ordem alfabética. Mas e se a lista for de <em>Pessoa</em>? Ah, bem, então o método quebra gerando uma excessão.</p>
<p>A não ser que <em>Pessoa</em> implemente a interface <a href="http://msdn.microsoft.com/en-US/library/4d7sx9hd(v=VS.80).aspx" target="_blank">IComparable&lt;T&gt;</a>. Você sabe, quando você implementa uma interface, você precisa seguir o mestre. E o mestre <em>IComparable&lt;T&gt;</em> manda que você tenha um método chamado <em>CompareTo(T)</em>.</p>
<p>Veja todos esses <em>T</em> soltos pelo ar. Isso é ótimo. Quer dizer que, bolas, você não precisa se preocupar com o tipo adjacente ao qual todas esses <em>T</em>s estarão associados no futuro. Você só precisa entender: se <em>Pessoa</em> implementa <em>IComparable&lt;Pessoa&gt;</em>, quer dizer que a classe <em>Pessoa</em> possui um método <em>CompareTo(Pessoa outra)</em>, que vai dar modos a <em>Sort&lt;Pessoa&gt;</em> da coleção <em>List&lt;Pessoa&gt;</em> de ordenar todos os itens. Troque todas as <em>Pessoa</em> por <em>Prato</em>, e a lógica é a mesma. Ou por <em>Carro</em>. Ou por <a href="http://www.youtube.com/watch?v=oHg5SJYRHA0" target="_blank">Cantor</a>.</p>
<p><pre class="brush: csharp;">
class Pessoa : IComparable&lt;Pessoa&gt;
{
    public Pessoa(string nome)
    {
        Nome = nome;
    }

    public string Nome { get; set; }

    public int CompareTo(Pessoa other)
    {
        return Nome.CompareTo(other.Nome);
    }
}

class Program
{
    static void Main(string[] args)
    {
        List&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;();

        pessoas.Add(new Pessoa(&quot;João&quot;));
        pessoas.Add(new Pessoa(&quot;Maria&quot;));
        pessoas.Add(new Pessoa(&quot;José&quot;));
        pessoas.Sort();

        // Mostra na ordem: João, José, Maria
        foreach (Pessoa p in pessoas)
        {
            Console.WriteLine(p.Nome);
        }
    }
}</pre></p>
<p>E, sim, você pode encontrar <strong>métodos </strong>precisando de argumentos de tipo. Utilíssimo quando você quer criar um método que faz coisas genéricas que servem para qualquer coisa – e ainda assim conservar a beleza da tipagem.</p>
<p>Imagine, por exemplo, um método para trocar valores de variáveis. Um método como esse:</p>
<p><pre class="brush: csharp;">
void Swap(ref object esquerda, ref object direita)
{
	object temp = esquerda;
	esquerda = direta;
	direita = temp;
}</pre></p>
<p>Veja, esse método parece uma boa… mas não funciona. O que você acha que acontece se eu fizer isso:</p>
<p><pre class="brush: csharp;">
int a = 1;
int b = 2;

Console.WriteLine(&quot;{0} - {1}&quot;, a, b); // 1 - 2

Swap(ref a, ref b); // uhh.. erro

Console.WriteLine(&quot;{0} - {1}&quot;, a, b);</pre></p>
<p>Isso é erro na certa. Por que Swap precisa de referências de object, e <em>ref a</em> certamente não é uma. Ok, poderíamos usar objects na declaração dos números, mas daí é adeus a checagem de tipo: nada impede de um espírito de porco tentar fazer swap de uma string com um número… e por aí vai.</p>
<p>Generics nos oferece uma solução muitíssimo mais elegante:</p>
<p><pre class="brush: csharp;">
void Swap&lt;T&gt;(ref T esquerda, ref T direita)
{
    T temp = esquerda;
    esquerda = direita;
    direita = temp;
}</pre></p>
<p>Veja a elegância desse código. Ele faz o que deveria fazer: troca os valores de duas variáveis. O tipo das variáveis não importa – o usuário do método decide na hora. E o uso?</p>
<p><pre class="brush: csharp;">
int a = 1;
int b = 2;

Console.WriteLine(&quot;{0} - {1}&quot;, a, b); // 1 - 2

Swap&lt;int&gt;(ref a, ref b); // agora sim

Console.WriteLine(&quot;{0} - {1}&quot;, a, b); // 2 - 1</pre></p>
<p>E a sintaxe de brinde é a seguinte: você não precisa especificar o tipo na hora de usar o método. O compilador infere o tipo e compila pra você:</p>
<p><pre class="brush: csharp;">
Swap(ref a, ref b); // superb</pre></p>
<p>Ah sim, você não precisa criar uma classe Generics para usar métodos Generics. Você pode começar a fazer com métodos Generics com suas classes feinhas do jeito que elas estão. Exato, agora mesmo.</p>
<h2>Resumão</h2>
<ul>
<li>Com Generics, você nunca erra o tipo</li>
<li>Com Generics, você não precisa implementar classes específicas para cada caso</li>
<li>Com Generics, coleções não têm nem a possibilidade de virar bagunça</li>
<li>Com Generics, você nunca terá que fazer casting ao obter objetos de coleção</li>
<li>Com Generics, seus métodos ficam turbinados.</li>
<li>Com Generics, você escreve menos código</li>
<li>Com Generics, seu código fica mais rápido</li>
<li>Com Generics, a natureza fortemente tipada do .NET fica menos irritante</li>
</ul>
<p>Como quase todas as coisas legais no .NET Framework,  Generics está disponível para a gente a partir da versão 2.0.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/89/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=89&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/05/17/classes-especializadas-com-generics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>

		<media:content url="http://fsomalia.files.wordpress.com/2010/05/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Nullables em C# e artimanhas com nulidades</title>
		<link>http://fsomalia.wordpress.com/2010/05/15/nullables-em-c-e-artimanhas-com-nulidades/</link>
		<comments>http://fsomalia.wordpress.com/2010/05/15/nullables-em-c-e-artimanhas-com-nulidades/#comments</comments>
		<pubDate>Sat, 15 May 2010 22:49:34 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://fsomalia.wordpress.com/?p=65</guid>
		<description><![CDATA[Minha tia uma vez pediu para em criar uma classe Pessoa em um sistema de cadastro de clientes. Depois de um pequeno bate papo, cheguei com essa infalível classe em C#: Consciência limpa, trabalho feito, fui mostrar a classe para minha tia. Qual não foi minha surpresa quando o seguinte diálogo se secedeu: Minha tia: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=65&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Minha tia uma vez pediu para em criar uma classe Pessoa em um sistema de cadastro de clientes. Depois de um pequeno bate papo, cheguei com essa infalível classe em C#:</p>
<p><pre class="brush: csharp;">
class Pessoa
{
   public string Nome { get; set; }
   public int Idade { get; set; }
}
</pre></p>
<p>Consciência limpa, trabalho feito, fui mostrar a classe para minha tia. Qual não foi minha surpresa quando o seguinte diálogo se secedeu:</p>
<p>Minha tia: &#8220;E se eu não tiver uma idade para informar?&#8221;<br />
Eu: &#8220;Como assim, toda pessoa tem uma idade!&#8221;<br />
Minha tia: &#8220;Nem toda.&#8221;<br />
Eu: &#8220;Exemplifique..&#8221;<br />
Minha tia: &#8220;Tenho umas clientes que não gostam de informar a idade..&#8221;</p>
<p>Pois é. Minha classe infalível tinha a mancha de uma falha. Que fazer?<span id="more-65"></span></p>
<p>A saída foi usar os <strong>Nullables</strong>. Os Nullables estão presentes no .NET Framework desde a versão 2.0. Basicamente, eles permitem que variáveis do tipo <strong>de valor</strong> (em contraste com os tipo <em>de referência</em>) possam receber valores nulos.</p>
<p>Em C#, você declara uma variável Nullable colocando um ponto de interrogação (também conhecido como <em>?</em>) depois do tipo, na declaração da variável. Assim:</p>
<p><pre class="brush: csharp;">int? numeroNullable;

numeroNullable = null;

</pre></p>
<p>Fantástico, ahm? Os Nullables são ótimos para valores que podem receber nulos, sem a necessidade de <em>boxing</em>. Em C#,  isso quer dizer que não é preciso tratar a variável como object só porque ela pode receber nulos.</p>
<p>Minha classe estava salva então:</p>
<p><pre class="brush: csharp;">
class Pessoa
{
   public string Nome { get; set; }
   public int? Idade { get; set; }
}
</pre></p>
<h2>Conversões ??</h2>
<p>Por algum motivo sombrio, minha tia queria também que eu somasse a idade de todas as pessoas do sistema dela. A primeira idéia que me passou pela cabeça parecia correta, então implementei:</p>
<p><pre class="brush: csharp;">
int soma = 0;
foreach (Pessoa p in pessoas)
{
    soma += p.Idade; // parece uma boa, mas não é
}</pre></p>
<p>Quando implementei isso, o compilador simplesmente riu da minha cara. O problema é que, embora exista conversão implícita de um tipo de valor para seu Nullable correspondente, não existe conversão implícita de valor Nullable para seu tipo simples. Eu tive, e você terá, que usar o método <a href="http://msdn.microsoft.com/en-us/library/58x571cw(VS.90).aspx" target="_blank">GetValueOrDefault()</a> se quiser obter o valor simples do Nullable.  <span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;line-height:18px;font-size:12px;white-space:pre;"> </span></p>
<p><pre class="brush: csharp;">int soma = 0;
foreach (Pessoa p in pessoas)
{
    soma += p.Idade.GetValueOrDefault(); // agora sim
}</pre></p>
<p>E se  a variável Nullable for null? Nesse caso, <a href="http://msdn.microsoft.com/en-us/library/83fhsxwc(VS.90).aspx" target="_blank">o valor padrão</a> do tipo é retornado. Para inteiros, o valor padrão é 0. Mas GetValueOrDefault() também pode receber um valor como parâmetro. Esse valor é retornado pelo método, caso o Nullable seja null:</p>
<p><pre class="brush: csharp;">int? nullable = null;
int valor = nullable.GetValueOrDefault(42); // valor agora é 42!
nullable = valor;
valor = nullable.GetValueOrDefault(23); // valor continua sendo 42
</pre></p>
<p>E como existem pessoas boas no mundo, alguém achou que criar um operador para esse método ia ser uma boa. Eu te digo mais, é uma ótima! Eis o operador <em>??</em>:</p>
<p><pre class="brush: csharp;">int soma = 0;
foreach (Pessoa p in pessoas)
{
    //soma += p.Idade.GetValueOrDefault(); // nah, muito grande
    soma += p.Idade ?? 0; // ah, bem elegante!
}
</pre></p>
<h2>Tem valor? Me dê o valor</h2>
<p>Minha tia queria também que eu criasse um método para obter as pessoas com uma certa idade (determinado por um parâmetro). Só que ela queria aproveitar o método para trazer todas as pessoas caso ela não apresentasse uma idade. Dá pra usar Nullables na veia (veia, não véia):</p>
<p><pre class="brush: csharp;">List&lt;Pessoa&gt; TrazerPessoas(int? idade)
{
    // Algo vai acontecer aqui
}</pre></p>
<p>Como pode ver, Nullables podem ser usados em declaração de parâmetros também.  Para fazer o método funcionar, lembre-se que todo Nullable também possui duas propriedades: <a href="http://msdn.microsoft.com/en-us/library/sksw8094(VS.90).aspx" target="_blank">HasValue</a> e <a href="http://msdn.microsoft.com/en-us/library/ydkbatt6(VS.90).aspx" target="_blank">Value</a>. HasValue indica se há valor na variável (retornando true) ou se a variável é null (retornando false). Se houver valor, ele estará na propriedade Value. Mas lembre-se que chamar Value quando HasValue é false acaba em uma excessão.</p>
<p><pre class="brush: csharp;">List&lt;Pessoa&gt; TrazerPessoas(int? idade)
{
    List&lt;Pessoa&gt; pessoas = ObterPessoasDoRepositorio();
    if (!idade.HasValue)
    {
        return pessoas; // Não passou idade, retornar tudo
    }

    // Nesse ponto, idade possui valor. Filtrar
    List&lt;Pessoa&gt; filtradas = new List&lt;Pessoa)();
    foreach (Pessoa p in pessoas)
    {
        if (p.Idade == idade.Value)
        {
            filtradas.Add(p);
        }
    }
    return filtradas;
}</pre></p>
<h2>bool?</h2>
<p>Veja bem, você pode usar operadores lógicos (&amp;&amp;, ||, !) com variáveis bool Nullables. Só preste atenção na tabela verdade, porque null entra na jogada. Por exemplo, <em>false || null</em> é false, mas <em>true || null</em> é true. Confuso?</p>
<p>Use as regras para não se perder:</p>
<ul>
<li>O operador &amp;&amp; só pode retornar true se ambas as partes for true
<ul>
<li>Se uma das partes for false, então a resposta é false não importando a outra parte</li>
<li>Para todas as outras opções, o resultado é null</li>
</ul>
</li>
<li>O operador || só pode retornar false se ambas as partes forem false
<ul>
<li>Se uma das partes for true, então a resposta é true não importando a outra parte</li>
<li>Para todas as outras opções, o resultado é null</li>
</ul>
</li>
<li>!null é null
<ul>
<li>!true é false, e !false é true mesmo.</li>
</ul>
</li>
</ul>
<h2>Resumão</h2>
<p>Pra acabar, um resumão de Nullables:</p>
<ul>
<li>Nullables representam variáveis de valor que podem receber <strong>null</strong></li>
<li>Você pode criar um Nullable com qualquer tipo <strong>de valor</strong>
<ul>
<li>tipos simples (números e char)</li>
<li>enums</li>
<li>structs</li>
</ul>
</li>
<li>Você <strong>não</strong> pode criar Nullables com variáveis de referência (não existe string?)</li>
<li>Você declara um tipo Nullable com a sintaxe <em>T?</em>, onde T é o tipo simples de valor</li>
<li>Você pode atribuir valores a Nullables como se fossem tipos simples (como em <em>int? a = 10</em>)</li>
<li>Use GetValueOrDefault() para converter valores Nullables em tipos simples. Use <em>??</em> para converter valores Nullables em tipos simples (como em <em>int a = nullable ?? 0</em>)</li>
<li>Use HasValue para saber se existe valor na variável</li>
<li>Use Value para obter o valor simples do Nullable, <span style="text-decoration:underline;">mas só se HasValue for true</span></li>
<li>A tabela verdade de <em>bool?</em> é confusa</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=65&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/05/15/nullables-em-c-e-artimanhas-com-nulidades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>
	</item>
		<item>
		<title>Futura &#8211; 3</title>
		<link>http://fsomalia.wordpress.com/2010/01/02/futura-3/</link>
		<comments>http://fsomalia.wordpress.com/2010/01/02/futura-3/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 02:42:26 +0000</pubDate>
		<dc:creator>fsomalia</dc:creator>
				<category><![CDATA[Ficção]]></category>
		<category><![CDATA[futura]]></category>

		<guid isPermaLink="false">http://fsomalia.wordpress.com/?p=62</guid>
		<description><![CDATA[Meses se passaram até que a espessa camada de poeira e cinzas se assentasse da atmosfera. Anos até que os primeiros grupos de humanos pudessem se encontrar. No primeiro senso, 23 anos após o choque, contabilizava cerca de 500 milhões de humanos, muito pouco, em relação aos nove bilhões de 2035. O planeta estava destruído [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=62&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Meses se passaram até que a espessa camada de poeira e cinzas se assentasse da atmosfera. Anos até que os primeiros grupos de humanos pudessem se encontrar. No primeiro senso, 23 anos após o choque, contabilizava cerca de 500 milhões de humanos, muito pouco, em relação aos nove bilhões de 2035. O planeta estava destruído e a sociedade, dizimada. Poucas cidades sobreviveram ao cometa e estas, logo foram escolhidas para serem as cidades capitais da Nova Terra. Em 2055 foi eleito em Tântris, continente Pacífico, o Conselho Superior de Nova Terra, com suas principais metas: 1- reunir os povos do mundo devastado e 2- conseguir meios de evitar que a raça desaparecesse.<span id="more-62"></span></p>
<p>As buscas por gente e as pesquisas no campo da geografia revelaram um planeta árido, com poucas condições de sobrevivência a curto prazo. O Conselho tomou talvez a mais importante decisão política de toda a história. Ao invés de desenvolver pesquisas para recuperar as áreas afetadas, o Conselho criou um programa de sobrevivência espacial e retomou o programa SETI &#8211; Busca por Inteligência Extra Terrestre.</p>
<p>Já possuíamos a tecnologia espacial antes do desastre. Possuíamos colônias na Lua, Marte e em duas de suas luas. Colônias não habitadas, mas ainda assim, com potencial para tal. Modifica-las ia ser relativamente barato, caro seria reconstruir a infra-estrutura para lançar objetos para o espaço. Enquanto isso o programa SETI, que havia desativado em 2028 por falta resultados, agora estava a todo vapor procurando com tecnologia avançadíssima todo o espectro de luz em busca de sinal de vida alienígena.</p>
<p>Duzentos anos são suficientes para os humanos se reerguerem. Em 2260, o meu povo comemorava o duocentenário da sobrevivência humana com a inauguração da segunda colônia habitada, em Io, lua de Marte. Três milhões de habitantes na Terra, alguns poucos milhares em Marte. A sociedade naquela época era pacífica. Graças a tecnologia, tinham sobrevivido à armadilha do acaso e podiam sonhar com o futuro. Não havia guerras entre povos, mas os recursos naturais iam se esvaindo. O planeta estava quente, efeito dos imensos desertos que cobriam mais de trinta por cento da superfície e o desaparecimento gradual de florestas e águas. Os homens se mantinham graças aos dispositivos óptico-eletrônicos de alto desempenho, como computadores que nunca precisavam ser recarregados, sistemas de refrigeração sem emissão de gases poluentes, geradores de energia de fontes retornáveis.</p>
<p>Quando os primeiros seres extra-terrestres fizeram contato com os humanos, poucos ainda vivam no planeta. A maior parte dos 15 bilhões de humanos vivia em luas de planetas vizinhos ou em estações orbitais, como essa em que estou agora. Eram, de certa forma, extraterrestres também. A data era 30 de décimo de 2846. A primeira raça alienígena a entrar em contato fora do setor de Alpha-Centauri, estrela que ficava a apenas 50 anos-luz do nosso Sol. Eram pacíficos, tinham tecnologia superior, no entanto, logo se descobriu que em nada o nível intelectual se superava ao nosso, entretanto, tinham uma capacidade superior para se adaptar. Tanto que, em cinqüenta anos, a maior parte dos habitantes da Terra era provinda do setor Centaurino.</p>
<p>Na virada do quarto milênio já contabilizávamos relações comerciais com mais de 30 raças alienígenas, que nos trouxeram tecnologia superior e cultura muito diversa que se poderia imaginar 20 décadas atrás. A tecnologia nos fez espalhar por mais de dois mil planetas, viver mais de 180 anos, sobreviver nas condições mais bizarras de ambiente, construir naves, cápsulas, armas. A convivência com esses povos nos trouxe sua cultura, religião, alimentação, e principalmente, um crescimento no modo de enxergar as coisas com os olhos dos outros. Os humanos eram muito mais conscientes de seu lugar no universo do que 500 anos antes.</p>
<p>Mas tinham o mesmo espírito de 5000 anos antes. Não precisarei descrever a participação da raça em vários combates setoriais, e até sua participação ativa na Terceira Guerra Intergaláctica. Guerra traz tecnologia. E a tecnologia era base do progresso humano. Graças à tecnologia o homem era o que era naquele tempo.</p>
<p>Não haveria homem sem a ajuda das máquinas, então o homem pensou se poderia haver máquina sem homem. Na verdade, essa idéia perdurava desde os primeiros autômatos de 1950, e o sonho de o homem criar uma máquina que não necessitasse mais dele era algo quase que inexplicável. Essa idéia era evidente desde os primeiros robôs de auxílio doméstico, os autômatos de entretenimento, os bichos de estimação simulados. Mas por mais que a tecnologia conseguisse reproduzir fielmente o comportamento de um gato, ou os sentimentos de mulogh, os humanos ainda esbarravam na limitação do fato de que essas coisas ainda precisavam ser criadas. Para o homem, a perfeição só iria ocorrer quando a máquina produzisse a própria máquina, através de decisões próprias, e não programadas.</p>
<p>Fizemos bons avanços nessa área. Em 3827, foi mostrado a público o Miracle II, que era capaz de se reprogramar por própria vontade. Na verdade ele ainda foi um computador fabricado pelo homem, mas as rotinas que usaram nele foram ínfimas, ele próprio ajudou em sua construção. O Miracle VII, que tornaria a ter o nome da incrível máquina de 80 anos atrás, tinha a principal característica de ser totalmente autônoma, podendo viajar através das redes interestelares e fazer quase todo tipo de atividade que um software poderia fazer, inclusive modificar seu hardware para chegar a uma solução do problema. Ainda havia uma limitação a esses engenhos. Eram construídos com alguma base de certeza do que poderiam fazer, e depois de prontos, não iam além. Ou seja, não eram capazes de criar, tampouco de fazer decisões próprias verdadeiras.</p>
<p>Em 3963, o universo, humano ou alienígena, já era bem conhecido. Teoricamente, toda a ciência física já havia sido inventada. Mas ainda não conseguíamos resolver uma questão: de onde viemos e para onde iremos. Não sabíamos como o universo criou-se a si mesmo, e se não se criou, não podíamos responder o que havia antes. Mas já havíamos estado em boa parte do universo conhecível, e se não, não era problema ir até um lugar totalmente inexplorado. Graças a tecnologia quântica-relativista, a idéia de quarta dimensão foi provada na prática e com isso as facilidades de locomoção desapareceram.</p>
<p>Foi nesse ano em que foi apresentado à comunidade humana o Miriad, o computador que seria o primeiro computador com a capacidade de tomar decisões próprias verdadeiras, ou seja, sem que precisasse ser programado para enfrentar a questão. A tecnologia em torno da construção do Miriad envolvia óptica, quântica, e muita engenhosidade. Segundo os engenheiros, a capacidade de processamento dele seria a de deus, se esse existisse. Dizia-se que o Miriad poderia tomar qualquer decisão sobre qualquer coisa, tanto que nem os próprios construtores sabiam realmente o que ele faria. E ao ser inicializado, o Miriad não fez nada.</p>
<p>Nenhuma resposta por cinco dias. O assunto foi motivo de pilhéria, mas a indústria se mostrou confiante e reafirmou várias vezes que aquilo era esperado. Ao final desses cinco dias, O monitor do computador central do Miriad em Tântris começou a mostrar um timer contando horas, minutos e segundos, regressivamente. Três dias depois, esse timer poderia ser visto em monitores, implantes cerebrais visuais, e qualquer tipo de aparelho óptico dos setores mais próximos. Um ano depois, ele poderia ser visto em qualquer lugar para onde um ser vivo olhasse. Até tentou-se desligar o computador, que parecia estar infectado com algum tipo de vírus que ele próprio tinha criado, mas mesmo após o shut-down do computador central, o timer permanecia ligado.</p>
<p>Logo que surgiu, verificou-se que o timer indicava quanto tempo restava para a passagem do ano 4000 terrestre. Por algum motivo inexplicável, o Miriad imprimiu esse timer em todo dispositivo visual do universo conhecido, e fez o carregamento de seu próprio sistema para as redes de informação, fazendo-se onipresente.</p>
<p>As ondas de boatos em torno ao significado da mensagem logo atiçaram a ira contra as máquinas, que, não raras, eram destruídas por grupos rebeldes, que provocou guerras e guerras ao longo dos anos. Somente em 3993, trinta anos depois do aparecimento, tivemos idéia da razão do contador regressivo. Nos primeiros anos pareceu como uma enorme formação estelar, como um imenso buraco negro. Só a três anos atrás, devido a pesquisas, descobrimos que não havia formação nenhuma, aliás, quase todo o universo não habitável não existia mais.</p>
<p>A conclusão foi fácil de se chegar. Até a virada do ano 4000 terrestre, graças ao processamento de decisões próprias do Miriad, todo o universo se dissolverá em cordas subatômicas, dando fim a este universo.</p>
<p>Esta mensagem eu colocarei numa cápsula de transporte que idealizei nesses últimos anos. De acordo com a teoria da esponja de universos, ela reaparecerá em algum lugar, algum tempo, e talvez servirá para que alguma civilização tome conhecimento do que fomos nós, e do perigo que isso pode representar. Vou desligar agora as máquinas do módulo orbital. Já não tenho contato com quase mais ninguém.</p>
<p>O que fica é uma questão inquietante: Deus criou o homem, que criou Deus, que destruiu o homem. Por quê?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fsomalia.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fsomalia.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fsomalia.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fsomalia.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fsomalia.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fsomalia.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fsomalia.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fsomalia.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fsomalia.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fsomalia.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fsomalia.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fsomalia.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fsomalia.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fsomalia.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fsomalia.wordpress.com&amp;blog=4568066&amp;post=62&amp;subd=fsomalia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fsomalia.wordpress.com/2010/01/02/futura-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fsomalia</media:title>
		</media:content>
	</item>
	</channel>
</rss>
