﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel>
    <title>Cassio Rogerio Eskelsen</title>
    <description>.Net, NeoGeo, C#, Arquitetura de Sistemas</description>
    <link>http://www.bizness.com.br/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.14</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.bizness.com.br/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>My name</dc:creator>
    <dc:title>Cassio Rogerio Eskelsen</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <item>
      <title>Criando meu próprio servidor Linux na “nuvem”</title>
      <description>&lt;p&gt;Como comecei a trabalhar com projetos em Java a pouco tempo comecei a sentir uma certa dificuldade para hospedar meus projetos. Não que não existem bons hosts java, mas estava começando a ficar preocupado com a dispersão das minhas coisas: eu tinha um provedor para os sites em asp.net, tenho projetos hospedados no Google App Engine e pagava um serviço para hospedar meus fontes SVN.&lt;/p&gt;  &lt;p&gt;Somado à necessidade de poder fazer alguns testes mais &lt;em&gt;hardcore, &lt;/em&gt;resolvi contratar um VPS (virtual private server) em Linux e centralizar nele os sites asp.net, java e os meus fontes SVN. &lt;/p&gt;  &lt;p&gt;Você deve estar pensando: “como assim? sites asp.net em Linux?”. Sim, para quem ainda não conhece, isso é possível com o &lt;a href="http://mono-project.com/Main_Page" target="_blank"&gt;Projeto Mono&lt;/a&gt; que hoje é mantido pela Novell.&lt;/p&gt;  &lt;p&gt;Vou relatar nesse post um pouco sobre minha aventura.&lt;/p&gt;  &lt;h4&gt;1a Etapa: escolher um serviço de host VPS&lt;/h4&gt;  &lt;p&gt;Eu sei que a qualidade dos serviços é diretamente proporcional ao custo da hospedagem, não vou enganar pensando que existe milagre, então o que procurei foi um equilíbrio entre preço e confiabilidade.&lt;/p&gt;  &lt;p&gt;Existem muitos serviços de VPS nos Estados Unidos mas não me sentia muito seguro pois sei que alguns são revenda da revenda.&lt;/p&gt;  &lt;p&gt;No Brasil eu conhecia o serviço da Locaweb. Eles disponibilizam um serviço que eles classificam como “Cloud Computing”, o que tecnicamente discordo que seja cloud. É apenas o antigo VPS com outro termo. Não é objetivo desse post explicar as diferenças entre VPS e Cloud, mas o que posso adiantar é que hoje os outros serviços de Cloud Computing que seguem a risca a definição são o Microsoft Azure e o Google App Engine.&lt;/p&gt;  &lt;p&gt;Procurando por “opiniões cloud locaweb” no Twitter acabei encontrando uma referência ao serviço de “cloud” da &lt;a href="http://www.tecla.com.br" target="_blank"&gt;tecla.com.br&lt;/a&gt; que vim a descobrir é um braço da &lt;a href="http://www.alog.com.br" target="_blank"&gt;http://www.alog.com.br&lt;/a&gt;ALOG que conheço de longa data, desde a época da Comdomonio (o nome era assim mesmo, com “m”). Sempre gostei muito da qualidade do serviço deles e não tive dúvidas em fechar um VPS, ops, “cloud” com eles. Escolhi o &lt;a href="http://tecla.com.br/cloud-computing/cloud-computing.asp" target="_blank"&gt;pacote mais básico&lt;/a&gt;, que contempla 2 processadores de 300 Mhz, 512 de RAM e 40 Gb de disco. Fechei a compra umas 3 da tarde, paguei o boleto, enviei o comprovante via email e no final da tarde já estava com meu server no ar (obrigado ao pessoal do suporte que teve paciência com a minha ansiedade!)&lt;/p&gt;  &lt;p&gt;Agora começava a…&lt;/p&gt;  &lt;h4&gt;2a. Etapa: configurações básicas&lt;/h4&gt;  &lt;p&gt;Eu escolhi um servidor com Ubuntu 9 pré-instalado, mas sem nenhum pacote adicional.&lt;/p&gt;  &lt;p&gt;A primeira coisa que precisei fazer foi entrar no painel de controle deles e conectar via ssh através do applet java que está no painel. Essa é a única forma de se conectar inicialmente já que o server vem bloqueado por questões de segurança e você precisa alterar a senha para liberar o acesso remoto.&lt;/p&gt;  &lt;p&gt;Liberado o acesso, pude começar a conectar remotamente via ssh.&lt;/p&gt;  &lt;p&gt;Primeiramente instalei o famoso pacote Apache + PHP + MySql. Você pode ver um tutorial básico aqui: &lt;a href="http://www.ubuntugeek.com/how-to-install-apache2-webserver-with-phpcgi-and-perl-support-in-ubuntu-server.html"&gt;http://www.ubuntugeek.com/how-to-install-apache2-webserver-with-phpcgi-and-perl-support-in-ubuntu-server.html&lt;/a&gt; e aqui: &lt;a href="http://www.vivaolinux.com.br/dica/Instalando-servidor-Apache-+-PHP-+-MySQL-+-phpMyadmin-+-noip-no-Ubuntu-6.10-Server"&gt;http://www.vivaolinux.com.br/dica/Instalando-servidor-Apache-+-PHP-+-MySQL-+-phpMyadmin-+-noip-no-Ubuntu-6.10-Server&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(nesse post não vou entrar em detalhes, mas vou deixar links com as informações)&lt;/p&gt;  &lt;h5&gt;Java&lt;/h5&gt;  &lt;p&gt;Para meus projetos em Java eu instalei o Tomcat, seguindo as dicas deste tutorial:&lt;/p&gt;  &lt;p&gt;Installing Tomcat 6 on Ubuntu: &lt;a href="http://www.howtogeek.com/howto/linux/installing-tomcat-6-on-ubuntu/"&gt;http://www.howtogeek.com/howto/linux/installing-tomcat-6-on-ubuntu/&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;3a. Etapa: migrando o servidor de SVN&lt;/h4&gt;  &lt;p&gt;Até o momento utilizava o serviço da &lt;a href="http://www.codespaces.com"&gt;www.codespaces.com&lt;/a&gt; . O serviço é excelente, só estou tirando de lá por uma questão de centralização e racionalização de custos com hospedagem.&lt;/p&gt;  &lt;p&gt;Para montar um servidor SVN segui os passos descritos nesse link: &lt;a href="http://stackoverflow.com/questions/60736/how-to-setup-a-subversion-svn-server-on-gnu-linux-ubuntu"&gt;http://stackoverflow.com/questions/60736/how-to-setup-a-subversion-svn-server-on-gnu-linux-ubuntu&lt;/a&gt;. Como não tenho um certificado de segurança recebo sempre uma observação nos clientes de que o certificado não é confiável, vou tentar resolver isso mais adiante.&lt;/p&gt;  &lt;p&gt;Servidor instalado, subi o backup dos repositórios do SVN que a codespaces disponibiliza. &lt;/p&gt;  &lt;p&gt;Nas estações onde desenvolvo usei o comando Relocate para apontar para a nova localização e fazer uma migração transparente.&lt;/p&gt;  &lt;p&gt;Ao fazer o primeiro commit no novo local descobri que a codespaces.com usa um hook de post-commit que acaba gerando um warning no novo local pois ele não vem no backup. Para resolver isso basta entrar em cada repositório no diretório hooks e comentar dentro do arquivo post-commit a linha que chama o hook.&lt;/p&gt;  &lt;h4&gt;4a. Etapa: instalando o Mono&lt;/h4&gt;  &lt;p&gt;Tentei instalar o Mono de várias formas.&amp;#160; O Ubuntu que é instalado pela Alog possui um Mono muito antigo.&lt;/p&gt;  &lt;p&gt;Alternativamente pode-se tentar instalar via &lt;a href="http://badgerports.org/o"&gt;http://badgerports.org/o&lt;/a&gt; que comigo não funcionou muito bem.&lt;/p&gt;  &lt;p&gt;Tentei instalar baixando o trunk dos fontes do Mono, mas como era de se esperar, existem muitos erros.&lt;/p&gt;  &lt;p&gt;Por último, resolvi baixar os tarballs com fontes estáveis: &lt;a href="http://ftp.novell.com/pub/mono/sources-stable/"&gt;http://ftp.novell.com/pub/mono/sources-stable/&lt;/a&gt; as instruções para compilar você pode encontrar em “&lt;a href="http://www.mono-project.com/Compiling_Mono_From_Tarball" target="_blank"&gt;compiling mono from tarball&lt;/a&gt;” . Tenha paciência, o processo de compilação pode demorar bastante tempo dependendo da configuração da máquina.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/CriandomeuprprioservidorLinuxnanuvem/4B3531EC/image.png" width="671" height="236" /&gt; &lt;/p&gt;  &lt;h4&gt;5a. Etapa: migrando os sites&lt;/h4&gt;  &lt;p&gt;Essa etapa irá demorar um pouco. Meus sites atuais estão no BlogEngine e quero mudar para um engine próprio baseado em asp.net MVC e algum banco NoSQL. &lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2010/06/20/Criando-meu-proprio-servidor-Linux-na-e2809cnuveme2809d.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2010/06/20/Criando-meu-proprio-servidor-Linux-na-e2809cnuveme2809d.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=4c825665-4088-4da0-80f6-a84680bc06c3</guid>
      <pubDate>Sun, 20 Jun 2010 12:08:58 +0200</pubDate>
      <category>asp.net</category>
      <category>Web</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=4c825665-4088-4da0-80f6-a84680bc06c3</pingback:target>
      <slash:comments>95</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=4c825665-4088-4da0-80f6-a84680bc06c3</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2010/06/20/Criando-meu-proprio-servidor-Linux-na-e2809cnuveme2809d.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=4c825665-4088-4da0-80f6-a84680bc06c3</wfw:commentRss>
    </item>
    <item>
      <title>Android: Trabalhando facilmente com campos data no SQLite</title>
      <description>&lt;p&gt;Ao trabalhar com os primeiros campos data no Sqlite para Android, percebi que a classe Cursor não possui um método do tipo getDate() como existem os getString, getInt, getLong, etc.    &lt;br /&gt;Você até pode retornar a data com getString() e depois converter para um tipo data através de algumas classes, mas o código acaba ficando muito extenso.&lt;/p&gt;  &lt;p&gt;Uma forma rápida de contornar isso é armazenar a data em milissegundos em um campo do tipo long:&lt;/p&gt;  &lt;p&gt;Exemplo de gravação na base SQLite:&lt;/p&gt;  &lt;div style="background-color: #eee"&gt;   &lt;pre&gt;SQLiteDatabase db = SQLiteHelper.getDataBase();

ContentValues values = new ContentValues();&lt;br /&gt;values.put(&amp;quot;datainicio&amp;quot;, meuObjetoQualquer.getDataInicio().getTime());  &lt;br /&gt;db.insert(“nomeTabela”, null, values);&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método getTime() retorna a quantidade de milissegundos desde 01/01/1970&lt;/p&gt;



&lt;p&gt;Exemplo de leitura da base SQLite:&lt;/p&gt;



&lt;div style="background-color: #eee"&gt;

  &lt;pre&gt;int id = 1;

String sql = &amp;quot;select id, datainicio from tabela&amp;quot;;

Cursor c = db.rawQuery(sql, new String[] { Integer.toString(id) });

if (c.getCount() &amp;gt; 0) {

   c.MoveToFirst();

   MinhaClasse meuObjeto = new MinhaClasse();

   meuObjeto.setDataInicio(new Date(c.getLong(1)));

}&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como imaginado, instanciando um objeto do tipo Date passando como parâmetro a quantidade de milissegundos, automaticamente temos o valor convertido.&lt;/p&gt;



&lt;p&gt;Deixo bem claro que é uma solução que jamais adotaria em uma base de dados &amp;quot;corporativa&amp;quot; pois isso dificultaria a legibilidade dos dados por outros sistemas. No entanto, em uma aplicação Android apenas nossa aplicação irá acessar os dados e com a falta de um método específico para retornar um campo Date, a solução acima se torna elegante.&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2010/04/06/Android-Trabalhando-facilmente-com-campos-data-no-SQLite.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2010/04/06/Android-Trabalhando-facilmente-com-campos-data-no-SQLite.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=989e11f7-1ac9-4702-a804-ab23e7759aeb</guid>
      <pubDate>Tue, 06 Apr 2010 18:12:40 +0200</pubDate>
      <category>Android</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=989e11f7-1ac9-4702-a804-ab23e7759aeb</pingback:target>
      <slash:comments>210</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=989e11f7-1ac9-4702-a804-ab23e7759aeb</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2010/04/06/Android-Trabalhando-facilmente-com-campos-data-no-SQLite.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=989e11f7-1ac9-4702-a804-ab23e7759aeb</wfw:commentRss>
    </item>
    <item>
      <title>Gerenciando as versões de bases Sqlite no Android</title>
      <description>&lt;p&gt;No meu &lt;a href="http://www.bizness.com.br/weblog/post/2010/04/01/Android-Abrindo-um-database-SQLite-sem-um-Context.aspx" target="_blank"&gt;post anterior&lt;/a&gt; eu demonstrei como trabalhar com arquivos SQLite sem ter um contexto associado, ou seja, sem estar amarrado à uma Activity específica. &lt;/p&gt;  &lt;p&gt;Isso acabou me trazendo uma consequência inesperada que é a impossibilidade de utilizar a classe &lt;strong&gt;android.database.sqlite.SQLiteOpenHelper&lt;/strong&gt; que contém dois eventos interessantes: &amp;quot;onCreate&amp;quot; que é disparado quando um database é criado pelo método &amp;quot;openOrCreate&amp;quot; e o evento &amp;quot;onUpdate&amp;quot; que é disparado quando deve ser procedida uma atualização do banco de dados. &lt;/p&gt;  &lt;div style="background-color: #eee"&gt;   &lt;p&gt;&lt;em&gt;O evento de atualização de base ocorre quando é definida uma versão para o banco de dados maior que a atual, através do método database.setVersion(numero_da_versao) &lt;/em&gt;&lt;/p&gt; &lt;/div&gt; Sem o SQLiteOpenHelper qual será nossa estratégia?   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Tomando como base a classe SQLiteHelper do post anterior temos a seguinte linha de código: &lt;/p&gt;  &lt;div style="background-color: #eee"&gt;   &lt;pre&gt;SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(path+databaseName, null);&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa linha tenta abrir o banco de dados. Se não encontrar o arquivo definido nas varíaveis &amp;quot;path+databaseName&amp;quot;, cria o arquivo com estrutura zerada e versão definida como 0(zero).&lt;/p&gt;



&lt;p&gt;O que faremos é, logo após essa linha, chamar um método que verificará/atualizará a estrutura do banco novo com o comando: &lt;/p&gt;



&lt;div style="background-color: #eee"&gt;

  &lt;pre&gt;initialize(db);&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para evitar que essa verificação seja feita a cada vez que precisamos acessar o banco, criaremos uma variável estática na classe : private static boolean initialized = false; . Uma variável estática tem escopo de aplicação, ou seja, manterá seu valor enquanto a aplicação estiver no ar. Então, alteraremos a linha acima para:&lt;/p&gt;



&lt;div style="background-color: #eee"&gt;

  &lt;pre&gt;if (!initialized) {

    initialize(db);

}&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código abaixo será um tanto prolixo para facilitar o entendimento:&lt;/p&gt;



&lt;div style="background-color: #eee"&gt;

  &lt;pre&gt;	

    private static void initialize(SQLiteDatabase db) {

	int versao = db.getVersion();

	Log.v(&amp;quot;database&amp;quot;,&amp;quot;Versão inicial: &amp;quot;+Integer.toString(versao));

	if(versao&amp;lt;1){

	   try{

	      RodaScripts(ScriptsVersao1(),db);

	      db.setVersion(1);

	      Log.v(&amp;quot;database&amp;quot;,&amp;quot;Criada estrutura inicial&amp;quot;);

	   }catch(Exception e){

	      Log.e(&amp;quot;database&amp;quot;,e.getMessage());

	   }

	}

	if(versao&amp;lt;1){

	  try{

	      RodaScripts(ScriptsVersao2(),db);

	      db.setVersion(2);

	      Log.v(&amp;quot;database&amp;quot;,&amp;quot;Alterada a estrutura do banco&amp;quot;);

	   }catch(Exception e){

	      Log.e(&amp;quot;database&amp;quot;,e.getMessage());

	   }

	}		

	versao = db.getVersion();

	Log.v(&amp;quot;database&amp;quot;,&amp;quot;Versão após script inicial: &amp;quot;+Integer.toString(versao));

	initialized =true;

    }

 &lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que esse código faz é verificar versão por versão se o banco é compatível com a versão esperada pelo seu sistema. Perceba a utilização do método &lt;strong&gt;getVersion&lt;/strong&gt; para pegar a versão atual do banco e &lt;strong&gt;setVersion&lt;/strong&gt; para atualizar o número da versão. &lt;/p&gt;



&lt;p&gt;ScriptsVersao1() e ScriptsVersao2() são métodos que retornam uma array de Strings com comandos para criação/alteração de estruturas de tabelas. Você pode também adicionar Inserts de massas de dados iniciais:&lt;/p&gt;



&lt;div style="background-color: #eee"&gt;

  &lt;pre&gt;private static String[] ScriptsVersao1() {

   String[] scripts = new String[] {				

	&amp;quot;CREATE TABLE \&amp;quot;contatos\&amp;quot; ( &amp;quot;

      + &amp;quot;[id] integer primary key autoincrement, &amp;quot;

      + &amp;quot;[nome] VARCHAR(50), &amp;quot;,

	&amp;quot;CREATE TABLE \&amp;quot;contato\&amp;quot; ( &amp;quot;

      + &amp;quot;[id] integer primary key autoincrement, &amp;quot; 

      + &amp;quot;[idContato] integer,&amp;quot;

      + &amp;quot;[telefone] VARCHAR(12), &amp;quot;

   };

   return scripts;

}

	

private static String[] ScriptsVersao2() {

   String[] scripts = new String[] {				

   &amp;quot;alter table contato add column [datanascimento] datetime&amp;quot;

   };

   return scripts;

}&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método que &amp;quot;roda&amp;quot; os scripts é esse:&lt;/p&gt;



&lt;div style="background-color: #eee"&gt;

  &lt;pre&gt;private static void RodaScripts(String[] scriptsVersao1, SQLiteDatabase db) {

   for(int i=0;i&amp;lt;scriptsVersao1.length;i++){

	String sql = scriptsVersao1[i];

	db.execSQL(sql);            

   }        

}&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E como vamos usar esse código?&lt;/p&gt;



&lt;p&gt;Vamos usá-lo direto em uma activity para exemplificar:&lt;/p&gt;



&lt;div style="background-color: #eee"&gt;

  &lt;pre&gt;package com.acme.ExemploVersaoBD;



import com.acme.ExemploVersaoBD.SQLite.SQLiteHelper;



import android.app.Activity;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;



public class MainActivity extends Activity { 

	@Override

	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);



		SQLiteDatabase db = SQLiteHelper.getDataBase();

		try {

			String sql = &amp;quot;select * from contatos&amp;quot;;

			Cursor c = db.rawQuery(sql, null);



			// (...) demais operações...

		} finally {

			db.close();

		}

		Log.v(&amp;quot;database&amp;quot;,&amp;quot;Testando se nao esta inicializando novamente&amp;quot;);

		SQLiteDatabase db2 = SQLiteHelper.getDataBase();

	}

}&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode verificar pelo LogCat que ele está funcionando conforme esperado:&lt;/p&gt;



&lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/62953a411806/06158327/log_eclipse.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="log_eclipse" border="0" alt="log_eclipse" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/62953a411806/3517BEFE/log_eclipse_thumb.png" width="604" height="212" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Verificando pelo Sqlite Expert Personal, podemos ver que a estrutura criada é a esperada:&lt;/p&gt;



&lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/62953a411806/381401DE/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/62953a411806/351E9D2B/image_thumb.png" width="604" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Você pode baixar o exemplo completo no link:&lt;/p&gt;



&lt;p&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-de2be6a340fa59b9.skydrive.live.com/embedicon.aspx/CodigosFonte/Android/ExemploVersaoBD.rar" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;



&lt;p&gt;Esse exemplo foi desenvolvido utilizando o &lt;a href="http://developer.motorola.com/docstools/motodevstudio/" target="_blank"&gt;Motodev Studio&lt;/a&gt;. &lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2010/04/06/Gerenciando-as-versoes-de-bases-Sqlite-no-Android.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2010/04/06/Gerenciando-as-versoes-de-bases-Sqlite-no-Android.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=5a869c6f-2aad-4c2a-be1d-fd764c1bca52</guid>
      <pubDate>Tue, 06 Apr 2010 17:22:43 +0200</pubDate>
      <category>Android</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=5a869c6f-2aad-4c2a-be1d-fd764c1bca52</pingback:target>
      <slash:comments>158</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=5a869c6f-2aad-4c2a-be1d-fd764c1bca52</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2010/04/06/Gerenciando-as-versoes-de-bases-Sqlite-no-Android.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=5a869c6f-2aad-4c2a-be1d-fd764c1bca52</wfw:commentRss>
    </item>
    <item>
      <title>Android : Abrindo um database SQLite sem um Context</title>
      <description>&lt;p&gt;Quem está começando a desenvolver com o SDK para Android já deve ter percebido que todos os exemplos de aplicações com banco de dados utilizam o Context de uma Activity para&amp;#160; abrir uma conexão com uma base SQLite, por exemplo:&lt;/p&gt;  &lt;pre&gt;  SQLiteDatabase db = ctx.openOrCreateDatabase(&amp;quot;meubanco&amp;quot;, Context.MODE_PRIVATE, null)&lt;/pre&gt;



&lt;p&gt;Isso funciona perfeitamente quando você pode deixar o código de acesso ao banco amarrado a uma Activity, mas é problemático quando você não tem um Context disponível – isso pode ocorrer, por exemplo, quando você deseja separar sua aplicação em camadas.&lt;/p&gt;



&lt;p&gt;Você pode abrir um banco de dados utilizando o método “openOrCreateDatabase” da própria classe SQLiteDatabase, mas para isso você terá que informar o caminho completo do arquivo com os dados.&lt;/p&gt;



&lt;p&gt;Os arquivos SQLite do Android ficam na&lt;strong&gt; &lt;/strong&gt;pasta&lt;strong&gt; /data/data/&lt;em&gt;package_da_aplicacao&lt;/em&gt;/databases/&lt;em&gt;nomeDoArquivo&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Tendo isso em mente, podemos criar uma classe helper para retornar uma instância de SQLiteDatabase:&lt;/p&gt;



&lt;pre&gt;package br.com.bizness.MinhaApp.Repositories.SQLite;



import android.app.Application;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;



public class SQLiteHelper  {

	

	private static String path =&amp;quot;/data/data/br.com.bizness.MinhaApp/databases/&amp;quot;;

	private static String databaseName = &amp;quot;nome_do_database&amp;quot;;

	

	public static SQLiteDatabase getDataBase(){

		 

		SQLiteDatabase db = &lt;br /&gt;SQLiteDatabase.openOrCreateDatabase(path+databaseName, null);

		 

		return db;

	 

	}

}&lt;/pre&gt;



&lt;p&gt;Obviamente que &amp;quot;br.com.bizness.MinhaApp&amp;quot; é o caminho da minha aplicação e você deve alterar para refletir sua situação.&lt;/p&gt;



&lt;h5&gt;Android…&lt;/h5&gt;



&lt;p&gt;Bom, esse é meu primeiro post sobre desenvolvimento para Android. Provavelmente virão muitos pela frente ainda, pois estou apenas começando no desenvolvimento para Android. 

  &lt;br /&gt;Minhas primeiras experiências estão sendo altamente positivas. Sinto um pouco de dificuldade pelo fato de vir do mundo .Net, mas o SDK em si é fantástico. 



  &lt;br /&gt;Como IDE, estou usando o &lt;a href="http://developer.motorola.com/docstools/motodevstudio/" target="_blank"&gt;MOTODEV Studio&lt;/a&gt; da Motorola, que é baseado em Eclipse.&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2010/04/01/Android-Abrindo-um-database-SQLite-sem-um-Context.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2010/04/01/Android-Abrindo-um-database-SQLite-sem-um-Context.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=6f9e711a-5d83-468d-9813-e28dd876591f</guid>
      <pubDate>Thu, 01 Apr 2010 14:17:48 +0200</pubDate>
      <category>Android</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=6f9e711a-5d83-468d-9813-e28dd876591f</pingback:target>
      <slash:comments>116</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=6f9e711a-5d83-468d-9813-e28dd876591f</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2010/04/01/Android-Abrindo-um-database-SQLite-sem-um-Context.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=6f9e711a-5d83-468d-9813-e28dd876591f</wfw:commentRss>
    </item>
    <item>
      <title>Nova ferramenta publicada : Ruas atingidas por enchentes</title>
      <description>&lt;p&gt;Dando continuidade à &lt;a href="http://www.bizness.com.br/weblog/post/2009/09/29/Alertas-Climaticos-SC.aspx" target="_blank"&gt;série de ferramentas&lt;/a&gt; que estou criando para acompanhamento de crises climáticas, publiquei recentemente o site &lt;a href="http://cotasenchente.appspot.com" target="_blank"&gt;Cotas Enchentes Blumenau&lt;/a&gt;. Esse site mostra quais as ruas são atingidas a cada nível de excesso no principal rio que cruza a cidade. O site permite simular vários níveis diferentes. &lt;/p&gt;  &lt;p&gt;Um detalhe importante: esse site foi desenvolvido utilizando Java no back-end! Apesar de já ter contato com o Java de uma forma ou de outra desde 1998, foi o primeiro sistema sério que desenvolvi utilizando ele. &lt;/p&gt;  &lt;p&gt;A relação de ruas com suas respectivas posições /cotas está hospedada no &lt;a href="http://tables.googlelabs.com/Home" target="_blank"&gt;Google Fusion Tables&lt;/a&gt;. Esse é um serviço recente do Google que me deixou muito surpreso em termos de flexibilidade e performance.&lt;/p&gt;  &lt;p&gt;O site está hospedado na estrutura de Cloud Computing da Google, o &lt;a href="http://code.google.com/intl/pt-BR/appengine/" target="_blank"&gt;Google App Engine&lt;/a&gt;. Confesso que no começo apanhei um pouco para entender sua filosofia, mas passada a dificuldade inicial, estou extremamente satisfeito com o serviço. &lt;/p&gt;  &lt;p&gt;O serviço está pronto para mostrar o nível do rio no momento, baseando no sistema &lt;a href="http://www.comiteitajai.org.br/alerta/" target="_blank"&gt;SIBI/Furb&lt;/a&gt;, mas deixo isso desativado nos momentos em que não estamos passando por um enchente (espero nunca precisar ativar!).&lt;/p&gt;  &lt;p&gt;Espero que o serviço seja útil.&lt;/p&gt;  &lt;p&gt;Gestão/Acompanhamento de crises é um assunto de meu interesse. Se você tem alguma idéia de aplicativo nessa área, por favor, sinta-se a vontade para sugerir!&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2010/02/24/Nova-ferramenta-publicada-Ruas-atingidas-por-enchentes.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2010/02/24/Nova-ferramenta-publicada-Ruas-atingidas-por-enchentes.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=e0614146-bb3c-49bd-8aaf-4d5b0b4ff0e3</guid>
      <pubDate>Wed, 24 Feb 2010 21:35:50 +0200</pubDate>
      <category>Geo</category>
      <category>Gestão de Crises</category>
      <category>Google Maps</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=e0614146-bb3c-49bd-8aaf-4d5b0b4ff0e3</pingback:target>
      <slash:comments>19</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=e0614146-bb3c-49bd-8aaf-4d5b0b4ff0e3</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2010/02/24/Nova-ferramenta-publicada-Ruas-atingidas-por-enchentes.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=e0614146-bb3c-49bd-8aaf-4d5b0b4ff0e3</wfw:commentRss>
    </item>
    <item>
      <title>Criando eventos em objetos Javascript</title>
      <description>&lt;p&gt;Uma necessidade muito comum na programação orientada a objetos é o disparo de trechos de código quando determinado evento acontece.    &lt;br /&gt;Usamos isso no dia-a-dia sem pensar muito, tomando como exemplo o evento onClick dos botões ou o evento onLoad da página.&lt;/p&gt;  &lt;p&gt;Mas e quando criamos nossos próprios objetos javascript como adicionamos eventos a eles? Bom, existem várias maneiras e nesse post vou mostrar uma forma muito fácil que utiliza a &lt;a href="http://developer.yahoo.com/yui/2/" target="_blank"&gt;bilbioteca YUI&lt;/a&gt; da Yahoo.&lt;/p&gt;  &lt;p&gt;Primeiramente vamos criar o nosso objeto em um arquivo a parte chamado MeuObjeto.js:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; MeuObjeto(){

    &lt;span class="kwrd"&gt;this&lt;/span&gt;.OnFinish = &lt;span class="kwrd"&gt;new&lt;/span&gt; YAHOO.util.CustomEvent(&lt;span class="str"&gt;'Terminou'&lt;/span&gt;);

    &lt;span class="kwrd"&gt;this&lt;/span&gt;.Start = start;

}



&lt;span class="kwrd"&gt;function&lt;/span&gt; start(){

    &lt;span class="kwrd"&gt;this&lt;/span&gt;.onFinish.fire();

}&lt;/pre&gt;

&lt;style type="text/css"&gt;











.csharpcode, .csharpcode pre

{

	font-size: small;

	color: black;

	font-family: consolas, "Courier New", courier, monospace;

	background-color: #ffffff;

	/*white-space: pre;*/

}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 

{

	background-color: #f4f4f4;

	width: 100%;

	margin: 0em;

}

.csharpcode .lnum { color: #606060; }&lt;/style&gt; 



&lt;p&gt;Perceba que estou referenciando uma classe da Yahoo. Essa classe está em um js que iremos incluir na página que utilizará o nosso objeto.&lt;/p&gt;



&lt;p&gt;A function &lt;strong&gt;MeuObjeto()&lt;/strong&gt; cria uma nova classe chamada MeuObjeto. 



  &lt;br /&gt;&lt;strong&gt;this.OnFinish&lt;/strong&gt; declara um novo evento para esse objeto. 



  &lt;br /&gt;&lt;strong&gt;this.Start&lt;/strong&gt;&amp;#160; cria um novo método para nosso objeto. Quanto esse método é invocado chama a function start.&lt;/p&gt;



&lt;p&gt;A function start()&amp;#160; chama o método &lt;strong&gt;fire&lt;/strong&gt; de nosso evento onFinish. Esse método &lt;strong&gt;fire&lt;/strong&gt; (da YUI) manda uma mensagem para todos os métodos que estão assinando o nosso evento.&lt;/p&gt;



&lt;p&gt;Claro que aqui temos um exemplo muito simples, mas você pode usar isso nas mais variadas situações. Por exemplo, imagine que você crie um objeto que monta um controle visual que permite alterar um valor através de um botão que pode ser movido para os lados (também conhecido como slider). Você pode criar três eventos para essa situação: um para quando o usuário começar a arrastar o botão, outro que é disparado enquanto o botão está sendo movido e um para quando o usuário parou de arrastar o botão, algo como: &lt;/p&gt;



&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; start(){

   &lt;span class="kwrd"&gt;this&lt;/span&gt;.onStartMove.fire();

}



&lt;span class="kwrd"&gt;function&lt;/span&gt; move(){

   &lt;span class="kwrd"&gt;this&lt;/span&gt;.onMove.fire();

}



&lt;span class="kwrd"&gt;function&lt;/span&gt; end(){

   &lt;span class="kwrd"&gt;this&lt;/span&gt;.onFinishMove.fire();

}&lt;/pre&gt;

&lt;style type="text/css"&gt;









.csharpcode, .csharpcode pre

{

	font-size: small;

	color: black;

	font-family: consolas, "Courier New", courier, monospace;

	background-color: #ffffff;

	/*white-space: pre;*/

}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 

{

	background-color: #f4f4f4;

	width: 100%;

	margin: 0em;

}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;p&gt;Perceba que é você, dentro do objeto, que está dizendo “olhem, assinantes, aconteceu alguma coisa”.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;(Você pode ver um outro exemplo de evento &lt;/em&gt;&lt;a href="http://www.dustindiaz.com/basement/dd-subscribers.html" target="_blank"&gt;&lt;em&gt;nessa página&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Perceba que os dois quadrados trocam de cor quando você pára de move-los.&lt;/em&gt; )&lt;/p&gt;



&lt;p&gt;E como vamos usar isso? Para exemplificar, vou criar uma página HTML bem simples:&lt;/p&gt;



&lt;div class="csharpcode"&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;HTML&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;a href="http://www.w3.org/TR/html4/strict.dtd"&gt;http://www.w3.org/TR/html4/strict.dtd&lt;/a&gt;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;http-equiv&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/html; charset=iso-8859-1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Teste Eventos JavaScript&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo-min.js&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;br /&gt;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;http://yui.yahooapis.com/2.8.0r4/build/event/event-min.js&amp;quot;&lt;/span&gt; &amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &amp;lt;script src=&lt;span class="str"&gt;&amp;quot;scripts/MeuObjeto.js&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &amp;lt;script language=JavaScript&amp;gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;              &lt;span class="kwrd"&gt;function&lt;/span&gt; MostraAlerta(){              &lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                   alert(&lt;span class="str"&gt;'terminou!!!'&lt;/span&gt;)&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;              }&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;              &lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;              &lt;span class="kwrd"&gt;var&lt;/span&gt; minhaInstancia = &lt;span class="kwrd"&gt;new&lt;/span&gt; MeuObjeto();&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;              minhaInstancia.OnFinish.subscribe(MostraAlerta);&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;              minhaInstancia.Start();&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;             &lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;style type="text/css"&gt;









.csharpcode, .csharpcode pre

{

	font-size: small;

	color: black;

	font-family: consolas, "Courier New", courier, monospace;

	background-color: #ffffff;

	/*white-space: pre;*/

}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 

{

	background-color: #f4f4f4;

	width: 100%;

	margin: 0em;

}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;p&gt;Nas linhas 6 e 7 estou chamando os javascripts direto do site do Yahoo. São necessários dois javascripts: o básico e o relativo aos eventos. Você também pode &lt;a href="http://developer.yahoo.com/yui/download/" target="_blank"&gt;descarregar os javascripts&lt;/a&gt;&amp;#160; e colocá-los em seu site.&lt;/p&gt;



&lt;p&gt;Na linha 8 estou chamando o javascript com meu objeto.&lt;/p&gt;



&lt;p&gt;As linhas 10 a 12 criam um evento que chamarei&amp;#160; quanto o evento for disparado.&lt;/p&gt;



&lt;p&gt;A linha 14 cria uma nova instância do meu objeto.&lt;/p&gt;



&lt;p&gt;A linha 15 “assina” o evento. Ou seja, sempre que o evento &lt;strong&gt;OnFinish&lt;/strong&gt; for disparado, a function MostraAlerta é chamada.&lt;/p&gt;



&lt;p&gt;A linha 16 chamada o método Start() que simula o disparo de um evento.&lt;/p&gt;



&lt;p&gt;Quando você chama Start(), o objeto invoca a função start() que dispara (fire) o evento onFinish(). Com isso todos os assinantes são notificados. No nosso caso temos apenas um assinante, a objeto minhaInstancia. Nessa assinatura específica dissemos que queremos que o método MostraAlerta() seja chamado.&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2010/01/02/Criando-eventos-em-objetos-Javascript.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2010/01/02/Criando-eventos-em-objetos-Javascript.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=0b1339e5-f8fa-44db-bced-efbffe0ac48a</guid>
      <pubDate>Sat, 02 Jan 2010 09:53:39 +0200</pubDate>
      <category>Web</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=0b1339e5-f8fa-44db-bced-efbffe0ac48a</pingback:target>
      <slash:comments>138</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=0b1339e5-f8fa-44db-bced-efbffe0ac48a</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2010/01/02/Criando-eventos-em-objetos-Javascript.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=0b1339e5-f8fa-44db-bced-efbffe0ac48a</wfw:commentRss>
    </item>
    <item>
      <title>Usando o Google Maps para exibir o clima no Brasil</title>
      <description>&lt;p&gt;Por indicação do &lt;a href="http://silverlightbrasil.ning.com/" target="_blank"&gt;Djonatas Tenfen&lt;/a&gt; achei esse &lt;a href="http://www.silverlightshow.net/items/Create-a-Silverlight-Europe-weather-map.aspx" target="_blank"&gt;link&lt;/a&gt; que descreve como exibir a previsão do tempo na Europa usando o Bing Maps. &lt;/p&gt;  &lt;p&gt;Com esse artigo pretendo mostrar como fazer para exibir o clima no Brasil, obviamente usando o Google Maps!&lt;/p&gt;  &lt;p&gt;A primeira dificuldade é encontrar um serviço com o clima em todo o Brasil e que seja relativamente fácil de ser utilizado (sem necessidade de fazer engenharia reversa de páginas web). Por sorte acabei encontrando o &lt;a href="http://www.cptec.inpe.br/" target="_blank"&gt;serviço&lt;/a&gt; do INPE (instituto Nacional de Pesquisas Espaciais) que traz a previsão em formato RSS.&lt;/p&gt;  &lt;h5&gt;1. Criando a Aplicação&lt;/h5&gt;  &lt;p&gt;Vou criar um projeto ASP.NET MVC utilizando o Visual Studio 2008. Utilizarei um &lt;a href="http://www.asp.net/MVC/Gallery/View.aspx?itemid=6430&amp;amp;amp;supportsjs=true" target="_blank"&gt;template&lt;/a&gt; para substituir o layout default e não perder muito tempo com layout.&lt;/p&gt;  &lt;p&gt;O foco desse artigo é o Google Maps e não o C#/.Net então não entrarei em muitos detalhes em relação à parte server do projeto (a não ser o tratamento do RSS)&lt;/p&gt;  &lt;h5&gt;2. Inserindo o Google Maps&lt;/h5&gt;  &lt;p&gt;Para cada projeto Google Maps você precisa &lt;a href="http://code.google.com/apis/maps/signup.html" target="_blank"&gt;solicitar uma chave&lt;/a&gt; para utilizar a API do Google Maps (a partir da versão 3 da API isso não será mais necessário). Essa chave é relativa à URL do servidor, o que significa que você precisa de uma chave para o desenvolvimento local e outra para a publicação.&lt;/p&gt;  &lt;p&gt;Para facilitar a utilização da chave correta criei uma classe helper que analisando a URL do servidor pega a chave correta do web.config:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Configuration;

&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;



&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Weather.Helpers

{

    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GMapsApi

    &lt;/span&gt;{

        &lt;span style="color: blue"&gt;public static string &lt;/span&gt;GetMapsAPI()

        {

            &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.Url.Host.ToLower().Contains(&lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;))

            {

                &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.AppSettings[&lt;span style="color: #a31515"&gt;&amp;quot;GMapsLocalKey&amp;quot;&lt;/span&gt;];

            }

            &lt;span style="color: blue"&gt;else

            &lt;/span&gt;{

                &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.AppSettings[&lt;span style="color: #a31515"&gt;&amp;quot;GMapsPublicKey&amp;quot;&lt;/span&gt;];

            } 

        }

    }

}&lt;/pre&gt;



&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Obviamente no web.config preciso configurar essas duas chaves:&lt;/p&gt;



&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;appSettings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;

  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;key&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;GMapsLocalKey&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;sua chave para localhost&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;

  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;key&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;GMapsPublicKey&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;sua chave para o servidor onde irá publicar&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;

&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;appSettings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



&lt;p&gt;O primeiro passo para inserir um mapa do Google Maps é chamar o javascript com a API do Google Maps. Isso deve ser feito colocando a seguinte chamada na tag &amp;lt;head&amp;gt; da página:&lt;/p&gt;



&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;http://maps.google.com/maps?file=api&amp;amp;amp;v=2&amp;amp;amp;&lt;br /&gt;        key=&lt;/span&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;=Weather.Helpers.GMapsApi.GetMapsAPI() &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;amp;sensor=true&amp;quot;

        &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

Os parâmetros são: 



&lt;p&gt;&lt;strong&gt;v=2&lt;/strong&gt;: indica que estamos usando a versão 2 da API do Google Maps; 



  &lt;br /&gt;&lt;strong&gt;key&lt;/strong&gt;: sua chave da API. Perceba que estou chamando aqui a minha função que determina qual a chave a ser utilizada (na versão 3 do Google Maps ela não é mais necessária) 



  &lt;br /&gt;&lt;strong&gt;sensor=true&lt;/strong&gt;: indica que o Google Maps deve tentar determinar a posição do usuário (indicado para aplicações mobile)&lt;/p&gt;



&lt;p&gt;Procure chamar a API apenas onde ela será utilizada. Por isso não indico colocar no site.master de suas aplicações ASP.NET MVC. O mais indicado é usar o placeholder HeadContent. &lt;/p&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;Irei criar uma função javascript de nome initialize() que deve instanciar o objeto mapa e definir qual elemento DOM que conterá o mapa. Normalmente o elemento DOM é uma DIV.&lt;/p&gt;



&lt;p&gt;Dentro do place holder MainContent irei adicionar um elemento div:&lt;/p&gt;



&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;map&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;style&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color: red"&gt;width&lt;/span&gt;: &lt;span style="color: blue"&gt;100%&lt;/span&gt;; &lt;span style="color: red"&gt;height&lt;/span&gt;: &lt;span style="color: blue"&gt;750px&lt;/span&gt;;&lt;span style="color: blue"&gt;&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &lt;/span&gt;&lt;/pre&gt;

Colocar uma div ocupando 100% da altura merece um post a parte, então irei fixar aqui em 750 pixels de altura! 



&lt;p&gt;Agora já podemos definir a função initialize():&lt;/p&gt;



&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot; &amp;gt;&lt;br /&gt;            var mapa;

            function &lt;/span&gt;initialize() {

                &lt;span style="color: blue"&gt;var &lt;/span&gt;map = &lt;span style="color: blue"&gt;new &lt;/span&gt;GMap2(document.getElementById(&lt;span style="color: #a31515"&gt;&amp;quot;map&amp;quot;&lt;/span&gt;));

                mapa.setCenter(&lt;span style="color: blue"&gt;new &lt;/span&gt;GLatLng(-16.684185, -50.28125), 5);

                mapa.addControl(&lt;span style="color: blue"&gt;new &lt;/span&gt;GLargeMapControl());

                mapa.enableScrollWheelZoom();

                mapa.setMapType(G_DEFAULT_MAP_TYPES[2]);

            }

        &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

Agora a brincadeira começou a ficar interessante! 



&lt;p&gt;A 2a. linha cria uma variável de nome “mapa”. Criamos ela fora de initialize para que tenhamos escopo na página 

  &lt;br /&gt;A 4a. linha &lt;a href="http://code.google.com/intl/en/apis/maps/documentation/introduction.html#Map_DOM_Elements" target="_blank"&gt;inicializa um objeto mapa&lt;/a&gt; dentro da div “map” 



  &lt;br /&gt;A 5a. define a posição central inicial (calculei as coordenadas para que sejam exibidas a maioria das capitais brasileiras em uma resolução de 1024x768). O valor “5” define o zoom inicial. 



  &lt;br /&gt;A 6a. linha insere no mapa o controle que permite alterar o zoom e os botões que fazem o “pan” para os lados e para cima e para baixo. 



  &lt;br /&gt;A 7a. linha informa que deve ser habilitado o zoom in/ou com a rodinha do mouse. 



  &lt;br /&gt;A 8a. linha define que o &lt;a href="http://code.google.com/intl/en/apis/maps/documentation/introduction.html#MapTypes" target="_blank"&gt;tipo inicial&lt;/a&gt; do mapa deve ser o híbrido.&lt;/p&gt;



&lt;p&gt;Quando iremos chamar a função initialize? Usaremos o jQuery para chamá-la apenas quando toda a página estiver montada.&lt;/p&gt;



&lt;p&gt;No final, a página ficará com esse código:&lt;/p&gt;



&lt;pre class="code"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: #a31515"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Views/Shared/Site.Master&amp;quot; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;System.Web.Mvc.ViewPage&amp;quot; &lt;/span&gt;&lt;span style="background: #ffee62"&gt;%&amp;gt;



&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;indexTitle&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TitleContent&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;

    &lt;/span&gt;Tempo no Brasil

&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;

&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;head&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HeadContent&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;



    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;../../Scripts/jquery-1.3.2.js&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;



    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;src&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;http://maps.google.com/maps?file=api&amp;amp;amp;v=2&amp;amp;amp;&lt;br /&gt;key=&lt;/span&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;=Weather.Helpers.GMapsApi.GetMapsAPI() &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;amp;sensor=true&amp;quot;

        &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;



    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;

        var &lt;/span&gt;mapa;

        &lt;span style="color: blue"&gt;function &lt;/span&gt;initialize() {

            mapa = &lt;span style="color: blue"&gt;new &lt;/span&gt;GMap2(document.getElementById(&lt;span style="color: #a31515"&gt;&amp;quot;map&amp;quot;&lt;/span&gt;));

            mapa.setCenter(&lt;span style="color: blue"&gt;new &lt;/span&gt;GLatLng(-16.684185, -50.28125), 5);

            mapa.addControl(&lt;span style="color: blue"&gt;new &lt;/span&gt;GLargeMapControl());

            mapa.enableScrollWheelZoom();

            mapa.setMapType(G_DEFAULT_MAP_TYPES[1]);



        }



    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;



&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;

&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;body&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;

    &lt;/span&gt;onUnload=&amp;quot;GUnload()&amp;quot;

&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;

&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;indexContent&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;MainContent&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;

    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;map&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;style&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color: red"&gt;width&lt;/span&gt;: &lt;span style="color: blue"&gt;100%&lt;/span&gt;; &lt;span style="color: red"&gt;height&lt;/span&gt;: &lt;span style="color: blue"&gt;780px&lt;/span&gt;;&lt;span style="color: blue"&gt;&amp;quot;&amp;gt;

    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;



    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;

        &lt;/span&gt;$(document).ready(&lt;span style="color: blue"&gt;function&lt;/span&gt;() {

            initialize();



        });



    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;



&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;



&lt;p&gt;Perceba que estou chamando a função &lt;strong&gt;GUnload()&lt;/strong&gt; da própria API do Google Maps que tem como objetivo limpar da memória todo o mapa assim que o usuário sair da página, diminuindo dessa forma a chance de eventuais problemas com gasto excessivo de memória. &lt;/p&gt;



&lt;p&gt;O resultado será esse: &lt;/p&gt;



&lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/UsandooGoogleMapsparaexibiroclimanoBrasi/755E6EB3/image.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/UsandooGoogleMapsparaexibiroclimanoBrasi/0C20DE66/image_thumb.png" width="603" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;



&lt;p&gt;&lt;/p&gt;



&lt;h5&gt;3. Construindo o “Banco de Dados” de cidades&lt;/h5&gt;



&lt;p&gt;Como o objetivo desse post é mostrar a construção do mapa, vou usar um modelo de dados bem simples, colocando em uma lista de memória as capitais dos estados do Brasil.&lt;/p&gt;



&lt;p&gt;Obviamente você pode estender esse modelo colocando as maiores cidades, gravando os dados em um banco de dados, etc.&lt;/p&gt;



&lt;p&gt;Para o exemplo irei usar a classe abaixo, contendo o ID da cidade no INPE, o nome da capital, a sigla do estado e as coordenadas geográficas da cidade.&lt;/p&gt;



&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;



&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Weather.Models

{

    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City

    &lt;/span&gt;{

        &lt;span style="color: blue"&gt;public int &lt;/span&gt;Id { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }



        &lt;span style="color: blue"&gt;public string &lt;/span&gt;Name { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }



        &lt;span style="color: blue"&gt;public decimal &lt;/span&gt;Latitude { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }



        &lt;span style="color: blue"&gt;public decimal &lt;/span&gt;Longitude { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }



        &lt;span style="color: blue"&gt;public string &lt;/span&gt;StateAcronym { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }



        &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;&amp;gt; GetCities()

        {

            &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;&amp;gt; cities = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;&amp;gt;();



            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 238, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Porto Velho&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;RO&amp;quot;&lt;/span&gt;,

                Latitude = -8.7624674766M, Longitude = -63.9044876278M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 240, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Rio Branco&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;AC&amp;quot;&lt;/span&gt;,

                Latitude = -9.9754648208M, Longitude = -67.8105087280M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 234, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Manaus&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;AM&amp;quot;&lt;/span&gt;,

                Latitude = -3.1024484634M, Longitude = -60.0254669189M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 223, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Boa Vista&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;RR&amp;quot;&lt;/span&gt;,

                Latitude = 2.8195800781M, Longitude = -60.6734657287M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 221, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Belém&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;PA&amp;quot;&lt;/span&gt;,

                Latitude = -1.4564432713M, Longitude = -48.5043983304M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 232, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Macapá&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;AP&amp;quot;&lt;/span&gt;,

                Latitude = 0.0385661366M, Longitude = -51.0664177261M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 236, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Palmas&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;TO&amp;quot;&lt;/span&gt;,

                Latitude = -10.1674923853M, Longitude = -48.3334037018M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 243, Name = &lt;span style="color: #a31515"&gt;&amp;quot;São Luís&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;MA&amp;quot;&lt;/span&gt;,

                Latitude = -2.5304510629M, Longitude = -44.3033714168M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 245, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Teresina&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;PI&amp;quot;

                &lt;/span&gt;, Latitude = -5.0894684783M, Longitude = -42.8023605331M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 229, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Fortaleza&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;CE&amp;quot;&lt;/span&gt;,

                Latitude = -3.7174611763M, Longitude = -38.5433273026M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 235, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Natal&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;RN&amp;quot;&lt;/span&gt;,

                Latitude = -5.7954773774M, Longitude = -35.2093048098M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 231, Name = &lt;span style="color: #a31515"&gt;&amp;quot;João Pessoa&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;PB&amp;quot;&lt;/span&gt;,

                Latitude = -7.1154866001M, Longitude = -34.8633003854M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 239, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Recife&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;PE&amp;quot;&lt;/span&gt;,

                Latitude = -8.0544929496M, Longitude = -34.8813018808M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 233, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Maceió&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;AL&amp;quot;&lt;/span&gt;,

                Latitude = -9.6665029515M, Longitude = -35.7353096042M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 220, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Aracaju&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;SE&amp;quot;&lt;/span&gt;,

                Latitude = -10.9115095226M, Longitude = -37.0723190324M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 242, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Salvador&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;BA&amp;quot;&lt;/span&gt;,

                Latitude = -12.9715194702M, Longitude = -38.5113372802M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 222, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Belo Horizonte&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;MG&amp;quot;&lt;/span&gt;,

                Latitude = -19.8175430307M, Longitude = -43.9563903769M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 246, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Vitória&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;ES&amp;quot;&lt;/span&gt;,

                Latitude = -20.3195533734M, Longitude = -40.3383636479M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 241, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Rio de Janeiro&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;RJ&amp;quot;&lt;/span&gt;,

                Latitude = -22.9035564806M, Longitude = -43.2083928627M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 244, Name = &lt;span style="color: #a31515"&gt;&amp;quot;São Paulo&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;SP&amp;quot;&lt;/span&gt;,

                Latitude = -23.5485496519M, Longitude = -46.6364212029M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 227, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Curitiba&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;PR&amp;quot;&lt;/span&gt;,

                Latitude = -25.4285487993M, Longitude = -49.2734451079M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 228, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Florianópolis&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;SC&amp;quot;&lt;/span&gt;,

                Latitude = -27.5975551455M, Longitude = -48.5494461504M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 237, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Porto Alegre&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;RS&amp;quot;&lt;/span&gt;,

                Latitude = -30.0335502624M, Longitude = -51.2304801940M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 225, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Campo Grande&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;MS&amp;quot;&lt;/span&gt;,

                Latitude = -20.4435195922M, Longitude = -54.6464691162M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 226, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Cuiabá&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;MT&amp;quot;&lt;/span&gt;,

                Latitude = -15.5965022580M, Longitude = -56.0974616760M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 230, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Goiânia&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;GO&amp;quot;&lt;/span&gt;,

                Latitude = -16.6795196708M, Longitude = -49.2544251117M });

            cities.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;() { Id = 224, Name = &lt;span style="color: #a31515"&gt;&amp;quot;Brasília&amp;quot;&lt;/span&gt;, StateAcronym = &lt;span style="color: #a31515"&gt;&amp;quot;DF&amp;quot;&lt;/span&gt;,

                Latitude = -15.7805194860M, Longitude = -47.9304084804M });



            &lt;span style="color: blue"&gt;return &lt;/span&gt;cities;

        }

    }

}&lt;/pre&gt;



&lt;h5&gt;4. Buscando as informações do INPE&lt;/h5&gt;



&lt;p&gt;A partir daqui entramos no território sem lei dos XMLs. 

  &lt;br /&gt;Temos que buscar o RSS das cidades desejadas e salvar localmente. Depois temos que ler os XMLs e extrair as informações desejadas.&lt;/p&gt;



&lt;p&gt;Criei um helper para efetuar esse download (\Helpers\INPEHelper.cs). A parte principal do helper é esta:&lt;/p&gt;



&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;

&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;

&lt;span style="color: blue"&gt;using &lt;/span&gt;System.IO;

&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Net;

&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;

&lt;span style="color: blue"&gt;using &lt;/span&gt;Weather.Models;

&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;



&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Weather.Helpers

{

    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;INPEHelper

    &lt;/span&gt;{

        &lt;span style="color: blue"&gt;private string &lt;/span&gt;URL = &lt;span style="color: #a31515"&gt;&amp;quot;http://servicos.cptec.inpe.br/RSS/cidade/{0}/previsao.xml&amp;quot;&lt;/span&gt;;

        &lt;span style="color: blue"&gt;public &lt;/span&gt;INPEHelper()

        {

        }



        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Forecast&lt;/span&gt;&amp;gt; GetForecasts(&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;City&lt;/span&gt;&amp;gt; cities)

        {

            &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Forecast&lt;/span&gt;&amp;gt; forecs = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Forecast&lt;/span&gt;&amp;gt;();



            &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;City &lt;/span&gt;city &lt;span style="color: blue"&gt;in &lt;/span&gt;cities)

            {

                GetRSS(city.Id);

                &lt;span style="color: #2b91af"&gt;RSS &lt;/span&gt;rs = &lt;span style="color: #2b91af"&gt;RSS&lt;/span&gt;.Load((&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Server.MapPath(&lt;span style="color: #a31515"&gt;&amp;quot;~/app_data/&amp;quot; &lt;/span&gt;+ &lt;br /&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0}.xml&amp;quot;&lt;/span&gt;, city.Id))));



                &lt;span style="color: blue"&gt;var &lt;/span&gt;dataXml = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Parse(rs.channel.item[0].pubDate[0]);



                &lt;span style="color: blue"&gt;var &lt;/span&gt;previsao = rs.channel.item[0].description[0];

                &lt;span style="color: blue"&gt;var &lt;/span&gt;imagem = previsao.Substring(previsao.IndexOf(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;img&amp;quot;&lt;/span&gt;), &lt;br /&gt;previsao.IndexOf(&lt;span style="color: #a31515"&gt;&amp;quot;/&amp;gt;&amp;quot;&lt;/span&gt;) - 1);



                &lt;span style="color: #2b91af"&gt;Forecast &lt;/span&gt;fore = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Forecast&lt;/span&gt;();

                fore.City = city;

                fore.ForecastImageUrl = imagem;

                fore.ForecastTemperature = previsao.Substring(previsao.IndexOf(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/b&amp;gt;&amp;quot;&lt;/span&gt;) + 8);

                fore.ForecastTemperature = fore.ForecastTemperature.&lt;br /&gt;Remove(fore.ForecastTemperature.IndexOf(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;));



                &lt;span style="color: blue"&gt;string &lt;/span&gt;data = previsao.Substring(previsao.IndexOf(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;) + 4);

                data = data.Remove(data.IndexOf(&lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/b&amp;gt;&amp;quot;&lt;/span&gt;));



                fore.ForecastDate = GetForeDate(dataXml, data);

                &lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Delete(&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Server.MapPath(&lt;span style="color: #a31515"&gt;&amp;quot;~/app_data/&amp;quot; &lt;/span&gt;+ &lt;br /&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0}.xml&amp;quot;&lt;/span&gt;, city.Id)));



            }



            &lt;span style="color: blue"&gt;return &lt;/span&gt;forecs;

        }



        &lt;span style="color: blue"&gt;private void &lt;/span&gt;GetRSS(&lt;span style="color: blue"&gt;int &lt;/span&gt;cityCode)

        {

            DownloadFile(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(URL, cityCode.ToString()), &lt;br /&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Server.MapPath(&lt;span style="color: #a31515"&gt;&amp;quot;~/app_data/&amp;quot; &lt;/span&gt;+ cityCode.ToString() + &lt;span style="color: #a31515"&gt;&amp;quot;.xml&amp;quot;&lt;/span&gt;));



        }&lt;/pre&gt;

&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;



&lt;p&gt;O método DownloadFile está nesse mesmo fonte.&lt;/p&gt;



&lt;p&gt;Estou salvando os xml no app_data pois é uma pasta que normalmente tem permissão de gravação.&lt;/p&gt;



&lt;p&gt;Um detalhe importante: para pesquisar no XML do RSS eu estou usando o Linq to XML. &lt;a href="http://www.bizness.com.br/weblog/post/2008/08/12/Acessando-um-XML-com-LINQ-e-XSD.aspx" target="_blank"&gt;Já fiz um post tempos atrás&lt;/a&gt; sobre como utilizar esse framework. De qualquer forma já estará tudo pronto para você utilizar no código que irei disponibilizar para download. Você pode tratar o XML direto também, existem várias alternativas.&lt;/p&gt;



&lt;p&gt;O RSS do INPE retorna a previsão do dia de amanhã (ou de hoje) e mais alguns dias para frente. A previsão de amanhã (ou de hoje) é dada através de uma imagem. As demais através de uma string. Por hora, irei pegar apenas a previsão de amanhã (ou de hoje) e exibir direto a imagem.&lt;/p&gt;



&lt;h5&gt;5. Exibindo as informações no Mapa&lt;/h5&gt;



&lt;p&gt;Agora que passamos a parte mais chatinha, falta apenas exibir os dados no mapa, o que será muito fácil de fazer em se tratando de Google Maps!&lt;/p&gt;



&lt;p&gt;Utilizaremos a classe GIcon da API do Google Maps para criar um marcador personalizado com a imagem da previsão e a classe GMarker para colocar a previsão no mapa.&lt;/p&gt;



&lt;p&gt;Poderíamos fazer o controller Index retornar uma lista de objetos &lt;span style="color: #2b91af"&gt;Forecast &lt;/span&gt;e iterarmos sobre essa lista.&amp;#160; Mas aqui teríamos um problema: o objeto mapa pode não estar criado ainda e você irá tentar adicionar marcadores em um objeto nulo. Então para garantir que não teremos problemas iremos invocar os dados apenas após a chamada do método initialize:&lt;/p&gt;



&lt;div class="csharpcode"&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        $(document).ready(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            initialize();&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;var&lt;/span&gt; url = &lt;span class="str"&gt;&amp;quot;/Home/GetForecasts&amp;quot;&lt;/span&gt;;&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            $.getJSON(url, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;function&lt;/span&gt;(data) {&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                $.each(data, &lt;span class="kwrd"&gt;function&lt;/span&gt;(index, forec) {&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;var&lt;/span&gt; forecIcon = &lt;span class="kwrd"&gt;new&lt;/span&gt; GIcon(G_DEFAULT_ICON);&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                    forecIcon.image = forec.ForecastImageUrl;&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                    forecIcon.iconSize = &lt;span class="kwrd"&gt;new&lt;/span&gt; GSize(73, 59);&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                    forecIcon.shadow = &lt;span class="str"&gt;&amp;quot;http://maps.google.com/mapfiles/water.gif&amp;quot;&lt;/span&gt;;&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                    forecIcon.shadowSize = &lt;span class="kwrd"&gt;new&lt;/span&gt; GSize(83, 59);&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                    markerOptions = { icon: forecIcon, title: forec.City.Name + &lt;span class="str"&gt;'/'&lt;/span&gt; + &lt;br /&gt;forec.City.StateAcronym + &lt;span class="str"&gt;' Temperatura: '&lt;/span&gt; + forec.ForecastTemperature };                    &lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;var&lt;/span&gt; point = &lt;span class="kwrd"&gt;new&lt;/span&gt; GLatLng(forec.City.Latitude, forec.City.Longitude)&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                    mapa.addOverlay(&lt;span class="kwrd"&gt;new&lt;/span&gt; GMarker(point, markerOptions));                  &lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                });&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            });&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        });&lt;/pre&gt;



  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;



  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;style type="text/css"&gt;









.csharpcode, .csharpcode pre

{

	font-size: small;

	color: black;

	font-family: consolas, "Courier New", courier, monospace;

	background-color: #ffffff;

	/*white-space: pre;*/

}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 

{

	background-color: #f4f4f4;

	width: 100%;

	margin: 0em;

}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;p&gt;A linha 7 utiliza ajax para chamar um método no servidor que retornará um json com os dados. O método está no controller Home (mais abaixo colo ele)&lt;/p&gt;



&lt;p&gt;A partir da linha 8 eu itero sobre cada elemento json que retornou.&lt;/p&gt;



&lt;p&gt;Nas linhas 9,10,11,12,13 eu crio um icone personalizado contendo a imagem do INPE. Como a imagem vai ficar meio ilegível, apliquei um fundo (o resultado final não é dos mais belos, mas serve para nossos fins didáticos).&lt;/p&gt;



&lt;p&gt;Na linha 14 crio uma array contendo o ícone personalizado e um título contendo o nome da cidade e a temperatura.&lt;/p&gt;



&lt;p&gt;Por último, nas linhas 15 e 16 eu crio um marcador utilizando a latitude e longitude da cidade e o ícone personalizado.&lt;/p&gt;



&lt;p&gt;O resultado final é esse:&lt;/p&gt;



&lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/UsandooGoogleMapsparaexibiroclimanoBrasi/5A961709/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/UsandooGoogleMapsparaexibiroclimanoBrasi/7B111ABE/image_thumb.png" width="565" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;a href="http://cid-de2be6a340fa59b9.skydrive.live.com/embedicon.aspx/CodigosFonte/Weather.zip" target="_blank"&gt;No link&lt;/a&gt; você pode baixar todo o código fonte da solução. Apenas não esqueça de gerar sua chave de API no Google Maps!&lt;/p&gt;



&lt;p&gt;Qualquer dúvida, deixe um comentário!&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2009/12/05/Usando-o-Google-Maps-para-exibir-o-clima-no-Brasil.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2009/12/05/Usando-o-Google-Maps-para-exibir-o-clima-no-Brasil.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=61d6967c-5316-40d4-be28-4f8eee6fdecf</guid>
      <pubDate>Sat, 05 Dec 2009 18:00:25 +0200</pubDate>
      <category>Google Maps</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=61d6967c-5316-40d4-be28-4f8eee6fdecf</pingback:target>
      <slash:comments>125</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=61d6967c-5316-40d4-be28-4f8eee6fdecf</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2009/12/05/Usando-o-Google-Maps-para-exibir-o-clima-no-Brasil.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=61d6967c-5316-40d4-be28-4f8eee6fdecf</wfw:commentRss>
    </item>
    <item>
      <title>IIS Smooth Streaming</title>
      <description>&lt;p&gt;O &lt;a href="http://www.iis.net/expand/SmoothStreaming" target="_blank"&gt;IIS Smooth Streaming&lt;/a&gt; é uma das maiores novidades que surgiram em termos de distribuição de mídia na internet, seja para mídia ao vivo, seja sob demanda.&amp;#160; Particularmente achei a tecnologia tão fantástica que até resolvi escrever um post sobre ela em meu blog, sendo que é um assunto que foge do escopo usual do blog.&lt;/p&gt;  &lt;p&gt;Descobri a tecnologia assistindo ao vivo os Keynotes da &lt;a href="http://www.microsoftpdc.com" target="_blank"&gt;PDC 2009&lt;/a&gt;, que é um evento da Microsoft destinado a desenvolvedores. Os keynotes foram assistidos por milhares de pessoas no mundo todo, durante o horário comercial, e mesmo assim a transmissão fluiu muito bem, sem bufferizações e sem gargalos.     &lt;br /&gt;O player funcionava como um legítimo TIVO, ou seja, você podia pausar a qualquer momento e voltar para qualquer ponto. Já assisti muitas transmissões ao vivo usando o Adobe Flash e nunca tive a mesma experiência.&lt;/p&gt;  &lt;p&gt;Você pode experimentar a tecnologia vendo essa transmissão &lt;em&gt;on demand: &lt;/em&gt;&lt;a href="http://www.iis.net/media/experiencesmoothstreaming"&gt;http://www.iis.net/media/experiencesmoothstreaming&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Atenção!! Você pode ver também através do seu IPhone!! &lt;a href="http://www.iis.net/iphone" target="_blank"&gt;http://www.iis.net/iphone&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h5&gt;Mas o que é o IIS Smooth Streaming afinal?&lt;/h5&gt;  &lt;p&gt;O IIS SS é uma tecnologia de transmissão de vídeo “adaptativa”, ou seja, ela analisa constamente as condições da sua banda larga e a performance local de renderização de vídeo para transmitir o vídeo na melhor qualidade possível sem gargalar.&lt;/p&gt;  &lt;p&gt;Se você tiver uma boa banda larga (superior a 3 Mbits, o que não é raro hoje em dia) e uma placa de vídeo razoável, você será capaz de ver &lt;strong&gt;vídeo em Full HD 1080p!&lt;/strong&gt;&lt;/p&gt;  &lt;h5&gt;Requerimentos&lt;/h5&gt;  &lt;p&gt;Para funcionar, a tecnologia depende dos seguintes componentes:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Do lado cliente:&lt;/strong&gt;     &lt;br /&gt;&lt;a href="http://www.microsoft.com/silverlight/get-started/install/default.aspx" target="_blank"&gt;- Plugin do Silverlight&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Do lado servidor:&lt;/strong&gt;     &lt;br /&gt;- Windows Vista SP1 ou Windows 7 ou Windows Server 2008     &lt;br /&gt;- IIS (servidor WEB que normalmente já vem com o sistema operacional, bastando ativá-lo)     &lt;br /&gt;- &lt;a href="http://misfitgeek.com/blog/iis-media-services-3-0/" target="_blank"&gt;IIS Media Services&lt;/a&gt;: a extensão do IIS que faz o “milagre”. Existem versões de &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=DC4E95B0-E4DE-456E-8254-A5047EABCD01&amp;amp;displaylang=en" target="_blank"&gt;32&lt;/a&gt; e &lt;a href="http://www.microsoft.com/downloads/info.aspx?na=47&amp;amp;p=2&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=dc4e95b0-e4de-456e-8254-a5047eabcd01&amp;amp;u=details.aspx%3ffamilyid%3d21C12A04-7E36-4B63-B4EF-EEDB6273CF54%26displaylang%3den" target="_blank"&gt;64&lt;/a&gt; bits&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Produção:&lt;/strong&gt;     &lt;br /&gt;- Os vídeos devem ser convertidos para um formato específico usando-se o &lt;a href="http://www.microsoft.com/Expression/products/Encoder_Overview.aspx" target="_blank"&gt;Microsoft Expression Encoder&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Montando um servidor local de mídia&lt;/h5&gt;  &lt;p&gt;Se você possuir um computador com Vista, Windws 7 ou 2008, basta baixar e instalar o IIS Media Server conforme indicado acima (versão 32 ou 64 bits, dependendo da versão do seu servidor).&lt;/p&gt;  &lt;p&gt;Caso ainda não tenha feito, não esqueça de ativar o Servidor IIS antes de prosseguir. Você pode fazer isso indo em Painel de Controle-&amp;gt;Programas-&amp;gt;Ativar/Desativar recursos do Windows.&lt;/p&gt;  &lt;p&gt;Se a instalação tiver sido feita com sucesso, você terá alguns novos ícones no gerenciador do IIS: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/4559ED94/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/344599E4/image_thumb.png" width="454" height="407" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Caso você não tenha o Expression Encode e quiser fazer apenas um teste, &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e44b0a2d-2e0c-48ff-bf57-3d05a20e2f6a&amp;amp;displaylang=en" target="_blank"&gt;você pode baixar o vídeo&lt;/a&gt; Big Bunny Video já convertido para o formato do Smooth Streaming. Baixe os dois arquivos disponíveis no link.&lt;/p&gt;  &lt;p&gt;Uma vez baixado, descompacte os arquivos em algum diretório qualquer ou direto dentro do diretório do IIS (c:\inetpub\wwwroot).    &lt;br /&gt;Se você não colocou no diretório default terá que criar um diretório virtual no IIS. Para isso, no gerenciador do IIS, clique com o botão direito sobre Default Web Site e selecione Add Virtual Directory. Preencha conforme abaixo, substituindo pelo caminho físico correto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/10DFF979/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/79654547/image_thumb.png" width="458" height="372" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Agora a demonstração já está disponível no link &lt;a href="http://localhost/bunny/default.html"&gt;http://localhost/bunny/default.html&lt;/a&gt;, mas antes de abrir, altere o arquivo default.html adicionando o player que você acabou de baixar (o arquivo menor), conforme abaixo:&lt;/p&gt;  &lt;p&gt;&amp;lt;div&amp;gt; Silverlight Player:&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;select id=&amp;quot;SilverlightPlayer&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;SmoothStreamingBlackGlass.xap&amp;quot; selected&amp;gt;Black Glass (Default)&amp;lt;/option&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;option value=&amp;quot;SmoothStreamingUXSimulator.xap&amp;quot;&amp;gt;User Experience Simulator&amp;lt;/option&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;&amp;lt;option value=&amp;quot;SmoothStatsTracker.xap&amp;quot;&amp;gt;Sample Client Refresh&amp;lt;/option&amp;gt;      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/select&amp;gt;     &lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;  &lt;p&gt;Pronto! Agora abra o site (não clique direto em default.html, você deve acessar através de http para que o IIS e a extensão intermediem o vídeo para você). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/5DE04344/image.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/29BB7E24/image_thumb.png" width="657" height="414" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Na página que irá abrir, selecione a opção SAMPLE CLIENT REFRESH e clique em Start Playing!.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/396AED5B/image.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/IISSmoothStreaming/758340DE/image_thumb.png" width="661" height="433" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Veja que por default essa demonstração traz algumas informações adicionais sobre o vídeo, como por exemplo, a banda máxima de download possível e a banda sendo consumida no momento (no canto superior direito). Obviamente, como é um video local, estaremos usando a banda máxima. O interessante é que você pode ajustar dinamicamente a banda consumida!&lt;/p&gt;  &lt;p&gt;O gráfico no canto inferior esquerdo mostra os &lt;em&gt;bit rates &lt;/em&gt;disponíveis e qual está sendo usado no momento (no servidor o arquivo é replicado em vários bit rates diferentes, como você pode perceber no arquivo contendo o exemplo de mídia codificada.&lt;/p&gt;  &lt;h4&gt;Opinião&lt;/h4&gt;  &lt;p&gt;O IIS Smooth Streaming possui qualidades suficientes para possibilitar a transmissão de TV via internet, inclusive ela foi criada inicialmente para transmissão das Olimpíadas através de um site americano.&lt;/p&gt;  &lt;p&gt;Juntamente com a popularização do Silverlight provavelmente veremos cada vez mais conteúdo sendo disponibilizado nesse formato.&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2009/11/28/IIS-Smooth-Streaming.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2009/11/28/IIS-Smooth-Streaming.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=4109a1c2-8df2-480a-b8ba-e31be7a18a65</guid>
      <pubDate>Sat, 28 Nov 2009 13:01:43 +0200</pubDate>
      <category>Silverlight</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=4109a1c2-8df2-480a-b8ba-e31be7a18a65</pingback:target>
      <slash:comments>125</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=4109a1c2-8df2-480a-b8ba-e31be7a18a65</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2009/11/28/IIS-Smooth-Streaming.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=4109a1c2-8df2-480a-b8ba-e31be7a18a65</wfw:commentRss>
    </item>
    <item>
      <title>Alertas Climáticos SC</title>
      <description>&lt;p&gt;Com objetivo de ajudar quem quer informações sobre o nível dos rios e outros dados climáticos sobre a região do Alto Vale do Itajaí, estou criando alguns twitters automatizados, que de hora em hora trazem a situação dos rios atualizada:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitter.com/alertasblumenau" target="_blank"&gt;http://twitter.com/alertasblumenau&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/alertasbrusque" target="_blank"&gt;http://twitter.com/alertasbrusque&lt;/a&gt; (em fase de implantação)     &lt;br /&gt;&lt;a href="http://twitter.com/alertasindaial" target="_blank"&gt;http://twitter.com/alertasindaial&lt;/a&gt; (em fase de implantação)&lt;/p&gt;  &lt;p&gt;Os dados vem do do &lt;a href="http://sibi.furb.br/alerta/" target="_blank"&gt;SIBI (Sistema de Informações da Bacia do Itajaí ),&lt;/a&gt;mantido pela FURB.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;(Ps aos colegas de profissão: o serviço roda em asp.net)&lt;/em&gt;&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2009/09/29/Alertas-Climaticos-SC.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2009/09/29/Alertas-Climaticos-SC.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=a84561ea-ea11-43e7-89fb-b6a608ada214</guid>
      <pubDate>Tue, 29 Sep 2009 03:11:49 +0200</pubDate>
      <category>Geo</category>
      <category>Gestão de Crises</category>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=a84561ea-ea11-43e7-89fb-b6a608ada214</pingback:target>
      <slash:comments>97</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=a84561ea-ea11-43e7-89fb-b6a608ada214</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2009/09/29/Alertas-Climaticos-SC.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=a84561ea-ea11-43e7-89fb-b6a608ada214</wfw:commentRss>
    </item>
    <item>
      <title>MSN Next, o MSN  em Silverlight</title>
      <description>&lt;p&gt;Recebi ontem via Microsoft Connect o convite para ser beta tester do novo MSN.com.&lt;/p&gt;  &lt;p&gt;O site está disponível em &lt;a href="http://next.br.msn.com"&gt;http://next.br.msn.com&lt;/a&gt; .Não sei se está disponível apenas para convidados.&lt;/p&gt;  &lt;p&gt;O&amp;#160; interessante do site é que agora ele está rodando em Silverlight para quem tem o player instalado.&lt;/p&gt;  &lt;p&gt;Veja abaixo como ficou:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/MSNNextoMSNemSilverlight_11A7E/image_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://www.bizness.com.br/weblog/image.axd?picture=WindowsLiveWriter/MSNNextoMSNemSilverlight_11A7E/image_thumb.png" width="492" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Veja na área apontada pela seta branca que existem janelas com destaques. Essas janelas são “rotatórias”, ou seja, quando você clica em uma janela que está atrás, ela vem para frente.&lt;/p&gt;  &lt;p&gt;Na área delimitada pelo frame vermelho existem widgets que mostram as ultimas mensagens do hotmail, as últimas atualizações do Messenger e a previsão do tempo. Acredito que no futuro possa se colocar mais widgets.&lt;/p&gt;  &lt;p&gt;Parece que está ficando interessante, mas por enquanto me lembra muito o Windows Mobile: por mais que se faça uma cara bonitinha, o passado está atras ainda. Por exemplo, quando você vai logar com seu usuário, você é redirecionado para aquela velha página de login em html, que é a mesma desde os tempos do MSN Passport.&lt;/p&gt;  &lt;p&gt;Vamos torcer para que fique legal. Quanto mais opções de portais informativos, melhor!&lt;/p&gt;</description>
      <link>http://www.bizness.com.br/post/2009/05/14/MSN-Next-o-MSN-em-Silverlight.aspx</link>
      <author>admin</author>
      <comments>http://www.bizness.com.br/post/2009/05/14/MSN-Next-o-MSN-em-Silverlight.aspx#comment</comments>
      <guid>http://www.bizness.com.br/post.aspx?id=a73de44d-5316-45f2-bcf6-ea7349e380ce</guid>
      <pubDate>Thu, 14 May 2009 21:05:49 +0200</pubDate>
      <dc:publisher>admin</dc:publisher>
      <pingback:server>http://www.bizness.com.br/pingback.axd</pingback:server>
      <pingback:target>http://www.bizness.com.br/post.aspx?id=a73de44d-5316-45f2-bcf6-ea7349e380ce</pingback:target>
      <slash:comments>82</slash:comments>
      <trackback:ping>http://www.bizness.com.br/trackback.axd?id=a73de44d-5316-45f2-bcf6-ea7349e380ce</trackback:ping>
      <wfw:comment>http://www.bizness.com.br/post/2009/05/14/MSN-Next-o-MSN-em-Silverlight.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.bizness.com.br/syndication.axd?post=a73de44d-5316-45f2-bcf6-ea7349e380ce</wfw:commentRss>
    </item>
  </channel>
</rss>