Nova ferramenta publicada : Ruas atingidas por enchentes

by Cássio R Eskelsen 24. fevereiro 2010 21:35

Dando continuidade à série de ferramentas que estou criando para acompanhamento de crises climáticas, publiquei recentemente o site Cotas Enchentes Blumenau. 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.

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.

A relação de ruas com suas respectivas posições /cotas está hospedada no Google Fusion Tables. Esse é um serviço recente do Google que me deixou muito surpreso em termos de flexibilidade e performance.

O site está hospedado na estrutura de Cloud Computing da Google, o Google App Engine. Confesso que no começo apanhei um pouco para entender sua filosofia, mas passada a dificuldade inicial, estou extremamente satisfeito com o serviço.

O serviço está pronto para mostrar o nível do rio no momento, baseando no sistema SIBI/Furb, mas deixo isso desativado nos momentos em que não estamos passando por um enchente (espero nunca precisar ativar!).

Espero que o serviço seja útil.

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!

Tags:

Geo | Gestão de Crises | Google Maps

Criando eventos em objetos Javascript

by Cássio R Eskelsen 2. janeiro 2010 09:53

Uma necessidade muito comum na programação orientada a objetos é o disparo de trechos de código quando determinado evento acontece.
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.

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 bilbioteca YUI da Yahoo.

Primeiramente vamos criar o nosso objeto em um arquivo a parte chamado MeuObjeto.js:

function MeuObjeto(){
    this.OnFinish = new YAHOO.util.CustomEvent('Terminou');
    this.Start = start;
}

function start(){
    this.onFinish.fire();
}
Leia mais...

Tags:

Web

Usando o Google Maps para exibir o clima no Brasil

by Cássio R Eskelsen 5. dezembro 2009 18:00

Por indicação do Djonatas Tenfen achei esse link que descreve como exibir a previsão do tempo na Europa usando o Bing Maps.

Com esse artigo pretendo mostrar como fazer para exibir o clima no Brasil, obviamente usando o Google Maps!

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 serviço do INPE (instituto Nacional de Pesquisas Espaciais) que traz a previsão em formato RSS.

1. Criando a Aplicação

Vou criar um projeto ASP.NET MVC utilizando o Visual Studio 2008. Utilizarei um template para substituir o layout default e não perder muito tempo com layout.

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)

2. Inserindo o Google Maps

Para cada projeto Google Maps você precisa solicitar uma chave 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.

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:

using System.Configuration;
using System.Web;

namespace Weather.Helpers
{
    public class GMapsApi
    {
        public static string GetMapsAPI()
        {
            if (HttpContext.Current.Request.Url.Host.ToLower().Contains("localhost"))
            {
                return ConfigurationManager.AppSettings["GMapsLocalKey"];
            }
            else
            {
                return ConfigurationManager.AppSettings["GMapsPublicKey"];
            } 
        }
    }
}

Obviamente no web.config preciso configurar essas duas chaves:

<appSettings>
  <add key="GMapsLocalKey" value="sua chave para localhost"/>
  <add key="GMapsPublicKey" value="sua chave para o servidor onde irá publicar"/>
</appSettings>

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 <head> da página:

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;
key=
<%=Weather.Helpers.GMapsApi.GetMapsAPI() %>&sensor=true" type="text/javascript"></script>
Os parâmetros são:

v=2: indica que estamos usando a versão 2 da API do Google Maps;
key: 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)
sensor=true: indica que o Google Maps deve tentar determinar a posição do usuário (indicado para aplicações mobile)

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.

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.

Dentro do place holder MainContent irei adicionar um elemento div:

<div id="map" style="width: 100%; height: 750px;"></div> 
Colocar uma div ocupando 100% da altura merece um post a parte, então irei fixar aqui em 750 pixels de altura!

Agora já podemos definir a função initialize():

<script type="text/javascript" >
var mapa; function
initialize() { var map = new GMap2(document.getElementById("map")); mapa.setCenter(new GLatLng(-16.684185, -50.28125), 5); mapa.addControl(new GLargeMapControl()); mapa.enableScrollWheelZoom(); mapa.setMapType(G_DEFAULT_MAP_TYPES[2]); } </script>
Agora a brincadeira começou a ficar interessante!

A 2a. linha cria uma variável de nome “mapa”. Criamos ela fora de initialize para que tenhamos escopo na página
A 4a. linha inicializa um objeto mapa dentro da div “map”
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.
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.
A 7a. linha informa que deve ser habilitado o zoom in/ou com a rodinha do mouse.
A 8a. linha define que o tipo inicial do mapa deve ser o híbrido.

Quando iremos chamar a função initialize? Usaremos o jQuery para chamá-la apenas quando toda a página estiver montada.

No final, a página ficará com esse código:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> Tempo no Brasil </asp:Content> <asp:Content ID="head" ContentPlaceHolderID="HeadContent" runat="server"> <script src="../../Scripts/jquery-1.3.2.js" type="text/javascript"></script> <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;
key=
<%=Weather.Helpers.GMapsApi.GetMapsAPI() %>&sensor=true" type="text/javascript"></script> <script type="text/javascript"> var mapa; function initialize() { mapa = new GMap2(document.getElementById("map")); mapa.setCenter(new GLatLng(-16.684185, -50.28125), 5); mapa.addControl(new GLargeMapControl()); mapa.enableScrollWheelZoom(); mapa.setMapType(G_DEFAULT_MAP_TYPES[1]); } </script> </asp:Content> <asp:Content ID="body" ContentPlaceHolderID="BodyPlaceHolder" runat="server"> onUnload="GUnload()" </asp:Content> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <div id="map" style="width: 100%; height: 780px;"> </div> <script type="text/javascript"> $(document).ready(function() { initialize(); }); </script> </asp:Content>

Perceba que estou chamando a função GUnload() 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.

O resultado será esse:

image

3. Construindo o “Banco de Dados” de cidades

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.

Obviamente você pode estender esse modelo colocando as maiores cidades, gravando os dados em um banco de dados, etc.

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.

using System.Collections.Generic;

namespace Weather.Models
{
    public class City
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public decimal Latitude { get; set; }

        public decimal Longitude { get; set; }

        public string StateAcronym { get; set; }

        public static List<City> GetCities()
        {
            List<City> cities = new List<City>();

            cities.Add(new City() { Id = 238, Name = "Porto Velho", StateAcronym = "RO",
                Latitude = -8.7624674766M, Longitude = -63.9044876278M });
            cities.Add(new City() { Id = 240, Name = "Rio Branco", StateAcronym = "AC",
                Latitude = -9.9754648208M, Longitude = -67.8105087280M });
            cities.Add(new City() { Id = 234, Name = "Manaus", StateAcronym = "AM",
                Latitude = -3.1024484634M, Longitude = -60.0254669189M });
            cities.Add(new City() { Id = 223, Name = "Boa Vista", StateAcronym = "RR",
                Latitude = 2.8195800781M, Longitude = -60.6734657287M });
            cities.Add(new City() { Id = 221, Name = "Belém", StateAcronym = "PA",
                Latitude = -1.4564432713M, Longitude = -48.5043983304M });
            cities.Add(new City() { Id = 232, Name = "Macapá", StateAcronym = "AP",
                Latitude = 0.0385661366M, Longitude = -51.0664177261M });
            cities.Add(new City() { Id = 236, Name = "Palmas", StateAcronym = "TO",
                Latitude = -10.1674923853M, Longitude = -48.3334037018M });
            cities.Add(new City() { Id = 243, Name = "São Luís", StateAcronym = "MA",
                Latitude = -2.5304510629M, Longitude = -44.3033714168M });
            cities.Add(new City() { Id = 245, Name = "Teresina", StateAcronym = "PI"
                , Latitude = -5.0894684783M, Longitude = -42.8023605331M });
            cities.Add(new City() { Id = 229, Name = "Fortaleza", StateAcronym = "CE",
                Latitude = -3.7174611763M, Longitude = -38.5433273026M });
            cities.Add(new City() { Id = 235, Name = "Natal", StateAcronym = "RN",
                Latitude = -5.7954773774M, Longitude = -35.2093048098M });
            cities.Add(new City() { Id = 231, Name = "João Pessoa", StateAcronym = "PB",
                Latitude = -7.1154866001M, Longitude = -34.8633003854M });
            cities.Add(new City() { Id = 239, Name = "Recife", StateAcronym = "PE",
                Latitude = -8.0544929496M, Longitude = -34.8813018808M });
            cities.Add(new City() { Id = 233, Name = "Maceió", StateAcronym = "AL",
                Latitude = -9.6665029515M, Longitude = -35.7353096042M });
            cities.Add(new City() { Id = 220, Name = "Aracaju", StateAcronym = "SE",
                Latitude = -10.9115095226M, Longitude = -37.0723190324M });
            cities.Add(new City() { Id = 242, Name = "Salvador", StateAcronym = "BA",
                Latitude = -12.9715194702M, Longitude = -38.5113372802M });
            cities.Add(new City() { Id = 222, Name = "Belo Horizonte", StateAcronym = "MG",
                Latitude = -19.8175430307M, Longitude = -43.9563903769M });
            cities.Add(new City() { Id = 246, Name = "Vitória", StateAcronym = "ES",
                Latitude = -20.3195533734M, Longitude = -40.3383636479M });
            cities.Add(new City() { Id = 241, Name = "Rio de Janeiro", StateAcronym = "RJ",
                Latitude = -22.9035564806M, Longitude = -43.2083928627M });
            cities.Add(new City() { Id = 244, Name = "São Paulo", StateAcronym = "SP",
                Latitude = -23.5485496519M, Longitude = -46.6364212029M });
            cities.Add(new City() { Id = 227, Name = "Curitiba", StateAcronym = "PR",
                Latitude = -25.4285487993M, Longitude = -49.2734451079M });
            cities.Add(new City() { Id = 228, Name = "Florianópolis", StateAcronym = "SC",
                Latitude = -27.5975551455M, Longitude = -48.5494461504M });
            cities.Add(new City() { Id = 237, Name = "Porto Alegre", StateAcronym = "RS",
                Latitude = -30.0335502624M, Longitude = -51.2304801940M });
            cities.Add(new City() { Id = 225, Name = "Campo Grande", StateAcronym = "MS",
                Latitude = -20.4435195922M, Longitude = -54.6464691162M });
            cities.Add(new City() { Id = 226, Name = "Cuiabá", StateAcronym = "MT",
                Latitude = -15.5965022580M, Longitude = -56.0974616760M });
            cities.Add(new City() { Id = 230, Name = "Goiânia", StateAcronym = "GO",
                Latitude = -16.6795196708M, Longitude = -49.2544251117M });
            cities.Add(new City() { Id = 224, Name = "Brasília", StateAcronym = "DF",
                Latitude = -15.7805194860M, Longitude = -47.9304084804M });

            return cities;
        }
    }
}
4. Buscando as informações do INPE

A partir daqui entramos no território sem lei dos XMLs.
Temos que buscar o RSS das cidades desejadas e salvar localmente. Depois temos que ler os XMLs e extrair as informações desejadas.

Criei um helper para efetuar esse download (\Helpers\INPEHelper.cs). A parte principal do helper é esta:

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web;
using Weather.Models;
using System.Text;

namespace Weather.Helpers
{
    public class INPEHelper
    {
        private string URL = "http://servicos.cptec.inpe.br/RSS/cidade/{0}/previsao.xml";
        public INPEHelper()
        {
        }

        public List<Forecast> GetForecasts(List<City> cities)
        {
            List<Forecast> forecs = new List<Forecast>();

            foreach (City city in cities)
            {
                GetRSS(city.Id);
                RSS rs = RSS.Load((HttpContext.Current.Server.MapPath("~/app_data/" + 
string.Format("{0}.xml", city.Id)))); var dataXml = DateTime.Parse(rs.channel.item[0].pubDate[0]); var previsao = rs.channel.item[0].description[0]; var imagem = previsao.Substring(previsao.IndexOf("<img"),
previsao.IndexOf("/>") - 1); Forecast fore = new Forecast(); fore.City = city; fore.ForecastImageUrl = imagem; fore.ForecastTemperature = previsao.Substring(previsao.IndexOf("</b>") + 8); fore.ForecastTemperature = fore.ForecastTemperature.
Remove(fore.ForecastTemperature.IndexOf("<br>")); string data = previsao.Substring(previsao.IndexOf("<br>") + 4); data = data.Remove(data.IndexOf("</b>")); fore.ForecastDate = GetForeDate(dataXml, data); File.Delete(HttpContext.Current.Server.MapPath("~/app_data/" +
string.Format("{0}.xml", city.Id))); } return forecs; } private void GetRSS(int cityCode) { DownloadFile(string.Format(URL, cityCode.ToString()),
HttpContext.Current.Server.MapPath("~/app_data/" + cityCode.ToString() + ".xml")); }

O método DownloadFile está nesse mesmo fonte.

Estou salvando os xml no app_data pois é uma pasta que normalmente tem permissão de gravação.

Um detalhe importante: para pesquisar no XML do RSS eu estou usando o Linq to XML. Já fiz um post tempos atrás 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.

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.

5. Exibindo as informações no Mapa

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!

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.

Poderíamos fazer o controller Index retornar uma lista de objetos Forecast e iterarmos sobre essa lista.  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:

   1:      <script type="text/javascript">
   2:          $(document).ready(function() {
   3:              initialize();
   4:   
   5:   
   6:              var url = "/Home/GetForecasts";
   7:              $.getJSON(url, null, function(data) {
   8:                  $.each(data, function(index, forec) {
   9:                      var forecIcon = new GIcon(G_DEFAULT_ICON);
  10:                      forecIcon.image = forec.ForecastImageUrl;
  11:                      forecIcon.iconSize = new GSize(73, 59);
  12:                      forecIcon.shadow = "http://maps.google.com/mapfiles/water.gif";
  13:                      forecIcon.shadowSize = new GSize(83, 59);
  14:                      markerOptions = { icon: forecIcon, title: forec.City.Name + '/' + 
forec.City.StateAcronym + ' Temperatura: ' + forec.ForecastTemperature };
  15:                      var point = new GLatLng(forec.City.Latitude, forec.City.Longitude)
  16:                      mapa.addOverlay(new GMarker(point, markerOptions));                  
  17:   
  18:                  });
  19:              });
  20:   
  21:          });
  22:   
  23:      </script>

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)

A partir da linha 8 eu itero sobre cada elemento json que retornou.

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).

Na linha 14 crio uma array contendo o ícone personalizado e um título contendo o nome da cidade e a temperatura.

Por último, nas linhas 15 e 16 eu crio um marcador utilizando a latitude e longitude da cidade e o ícone personalizado.

O resultado final é esse:

image

No link 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!

Qualquer dúvida, deixe um comentário!

Tags: , , , ,

Google Maps

IIS Smooth Streaming

by Cássio R Eskelsen 28. novembro 2009 13:01

O IIS Smooth Streaming é 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.  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.

Descobri a tecnologia assistindo ao vivo os Keynotes da PDC 2009, 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.
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.

Você pode experimentar a tecnologia vendo essa transmissão on demand: http://www.iis.net/media/experiencesmoothstreaming

Atenção!! Você pode ver também através do seu IPhone!! http://www.iis.net/iphone

Mas o que é o IIS Smooth Streaming afinal?

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.

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 vídeo em Full HD 1080p!

Requerimentos

Para funcionar, a tecnologia depende dos seguintes componentes:

Do lado cliente:
- Plugin do Silverlight

Do lado servidor:
- Windows Vista SP1 ou Windows 7 ou Windows Server 2008
- IIS (servidor WEB que normalmente já vem com o sistema operacional, bastando ativá-lo)
- IIS Media Services: a extensão do IIS que faz o “milagre”. Existem versões de 32 e 64 bits

Produção:
- Os vídeos devem ser convertidos para um formato específico usando-se o Microsoft Expression Encoder

Montando um servidor local de mídia

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).

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->Programas->Ativar/Desativar recursos do Windows.

Se a instalação tiver sido feita com sucesso, você terá alguns novos ícones no gerenciador do IIS:

image

Caso você não tenha o Expression Encode e quiser fazer apenas um teste, você pode baixar o vídeo Big Bunny Video já convertido para o formato do Smooth Streaming. Baixe os dois arquivos disponíveis no link.

Uma vez baixado, descompacte os arquivos em algum diretório qualquer ou direto dentro do diretório do IIS (c:\inetpub\wwwroot).
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:

image

Agora a demonstração já está disponível no link http://localhost/bunny/default.html, mas antes de abrir, altere o arquivo default.html adicionando o player que você acabou de baixar (o arquivo menor), conforme abaixo:

<div> Silverlight Player: 
    <select id="SilverlightPlayer">
        <option value="SmoothStreamingBlackGlass.xap" selected>Black Glass (Default)</option>
        <option value="SmoothStreamingUXSimulator.xap">User Experience Simulator</option>
        <option value="SmoothStatsTracker.xap">Sample Client Refresh</option>
    </select>
</div>

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ê).

image

Na página que irá abrir, selecione a opção SAMPLE CLIENT REFRESH e clique em Start Playing!.

image

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!

O gráfico no canto inferior esquerdo mostra os bit rates 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.

Opinião

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.

Juntamente com a popularização do Silverlight provavelmente veremos cada vez mais conteúdo sendo disponibilizado nesse formato.

Tags: , , ,

Silverlight

Alertas Climáticos SC

by Cássio R Eskelsen 29. setembro 2009 03:11

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:

http://twitter.com/alertasblumenau
http://twitter.com/alertasbrusque (em fase de implantação)
http://twitter.com/alertasindaial (em fase de implantação)

Os dados vem do do SIBI (Sistema de Informações da Bacia do Itajaí ),mantido pela FURB.

(Ps aos colegas de profissão: o serviço roda em asp.net)

Tags:

Geo | Gestão de Crises

MSN Next, o MSN em Silverlight

by Cássio R Eskelsen 14. maio 2009 21:05

Recebi ontem via Microsoft Connect o convite para ser beta tester do novo MSN.com.

O site está disponível em http://next.br.msn.com .Não sei se está disponível apenas para convidados.

O  interessante do site é que agora ele está rodando em Silverlight para quem tem o player instalado.

Veja abaixo como ficou:

image

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.

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.

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.

Vamos torcer para que fique legal. Quanto mais opções de portais informativos, melhor!

Tags:

Report Viewer não renderiza no IIS 7

by Cássio R Eskelsen 26. março 2009 14:24

Se você usa o Report Services e pretende utilizar (ou usa) o Report Viewer  em apliações ASP.Net, pode receber o seguinte erro ao executar a web app em um servidor com IIS: The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

Isso ocorre pois o IIS 7 não possui um handler para Reserved.ReportViewerWebControl.axd . Resolver isso é fácil e existem duas formas:

Via Gerenciador do IIS (Painel de Controle/Ferramentas Adm):


Selecione o seu site e abra a opção Handler Mappings:

image

Depois, no lado direito, selecione Add Managed Handler:

Leia mais...

Tags:

.Net | asp.net

Offtopic: Domínios .tel

by Cássio R Eskelsen 24. março 2009 22:40

Recentemente foi criado um novo top level domain, o .tel. A idéia não é ser apenas mais um domínio, e sim, agregar vários serviços.

Um exemplo do que se pretende é a possibilidade de você passar o seu domínio no lugar do seu telefone. Os celulares, devidamente habilitados, poderão resolver dinamicamente o seu número de telefone. Com isso, você pode definir em qual número você quer atender no momento.

Já existem clients para IPhone, Windows Mobile, Symbian, etc. E aqui você encontra informações de como desenvolver aplicações usando a api da Telnic.

Garanta o seu nome.tel na

Domain Name Registration
Domain Name Registration

O meu, cassio.tel, já está garantido!

Tags:

General

Minha experiência com o Windows Azure

by Cássio R Eskelsen 22. março 2009 16:45

Sei que esse é um YAWAP (yet another Windows Azure post) já que existem por aí bom artigos sobre o Azure, mas talvez possa trazer alguns elementos novos para quem, assim como eu, está começando a viver nas nuvens!

O Windows Azure

Para quem ainda não conhece, o Windows Azure é uma plataforma da Microsoft para rodar aplicações em esquema de Cloud Computing, ou seja, rodando em um farm de servidores. Obviamente não basta pegar qualquer aplicação é subí-la para o datacenter: ela precisa estar preparada para rodar na nuvem. No caso específico do Windows Azure, essas aplicações deverão ser feitas em .Net. Quem já tem aplicações muito bem estruturadas em termos de arquitetura não terá muito problema para rodar sua aplicação na nuvem, apenas terá um trabalho pesado na layer de persistência.

A aplicação que pretendo fazer

image Pretendo colocar nas nuvens uma aplicação que modelei a quase 10 anos atrás e da qual já existe uma versão rodando feita em Delphi e que é mantida pela empresa onde fui sócio. Tenho toda análise pronta, incluindo algoritmos (sim, milagre!), então não precisarei me preocupar com regras de negócio. Como na  época a OO ainda era algo novo para mim, talvez tenha que fazer alguns ajustes agora.

Essa aplicação calcula os custos de uma empresa de serviços utilizando a metodologia RKW. Essa metodologia também é conhecida como Método dos Centros de Custos, Método das Seções Homogêneas, Mapa de Localização de Custos ou ainda, Custeio Pleno. Essa metodologia foi criada na primeira metade do século 20 na Alemanha, por isso tem como nome as iniciais do conselho governamental alemão para assuntos econômicos (Reichskuratorium für Wirtschaftlichtkeit).

Saliento que esse post é focado na descrição da minha experiência com o Azure em uma aplicação LoB e não em detalhes da implementação da solução em si, já que necessitaria de vários posts para isso!

Esse post estou escrevendo enquanto desenvolvo a aplicação, então ainda não sei se tudo que pretendo funcionará no Azure.

Leia mais...

Tags: , ,

Arquitetura | .Net

Engenharia de Software Conference

by Cássio R Eskelsen 17. março 2009 23:06

banner_ESconference_220x105-35kbA DevMedia, editora das revistas Java Magazine, Engenharia de Software Magazine, SQL Magazine, .NET Magazine, WebMobile e Clubedelphi estará produzindo, nos dias 22 e 23 de Maio, em São Paulo, o evento “Engenharia de Software Conference”.

O Conteúdo do evento é exclusivamente voltado para gerentes. Serão três tracks simultâneos onde os melhores palestrantes do mercado discutirão os principais temas da Engenharia de Software atual. Acontecerão mais de 30 palestras que vão desde o projeto até os últimos testes de um software, passando pelos diversos conceitos de gerenciamento. A Keynote do evento será a brasileira Ana Regina Rocha, uma das responsáveis pela criação do MPS.BR, uma metodologia de gerenciamento desenvolvida especialmente para as empresas brasileiras.

Veja algumas das palestras:

Alexandre Magno - Atribuições do Product Owner na Gerência de Projetos com Scrum
Ana Regina Rocha - Processos de software com MPS.BR
Antonio Mendes da Silva Filho - Descubra como os Requisitos podem Impactar na Arquitertura de sua Aplicação
Arilo Cláudio Dias Neto - Elaborando Casos e Procedimentos de Teste na Prática -Partes 1 e 2
Carlos Eduardo Vazquez - Estimativas de Software - Fundamentos, Técnicas e Modelos... e o principal, integrando isso tudo!
Claudia Hazan - Palestra: Como melhorar a previsibilidade de Custo de Prazo de Projetos de Software e Como evitar problemas na gestão de contratos de software
Cidinha Gouveia - Palestra: Estruturas Organizacionais de Teste - Uma Experiência Prática Palestra: Boas Práticas de Testes
Dairton Bassi - Palestra: Planejamento Ágil de Projetos Palestra: XP na Prática
Fabio Kon - Desenvolvimento de Software de Qualidade com Métodos Ágeis e Software Livre
Fabiano Milani - Elaboração e Manutenção de um Product Backlog com Qualidade e Garantia de ROI (Return of Investment)
Fabio Câmara - SCRUM e VSTS, o melhor de dois mundos
Isabella Fonseca - Gerenciamento Ágil de Projetos com SCRUM - Partes 1 e 2
Juan Esteban Bernabó - Desmistificando Scrum & Agile: Better, Cheaper, Faster & Cooler Software Projects
Marcelo Costa - Uma Experiência na implantação de CMMI em sites distribuídos
Marcos Kalinowski - Palestra: Melhorando Produtos através de Revisões de Software e Melhorando Processos de Software através de Análise Causal de Defeitos
Mariano Angel Montoni - Palestra: MPS.BR - Implantando o nível G - Partes 1 e 2
Melissa Pontes - Palestra: Elaborando Casos e Procedimentos de Teste na Prática - Partes 1 e 2
Nikolai Dimitrii - Você precisa desenvolver uma metodologia de gerenciamento de projetos de software?
Paulo Pires - Desenvolvimento de sistemas com MDA: Conceitos e Estado da Arte
Rodrigo Spínola - Escrevendo Casos de Uso Efetivos
Sérgio Akio Tanaka - Metodologias Ágeis: Estágio Atual e Perspectivas Futuras

Veja maiores informações em http://www.devmedia.com.br/es_conference/index.html

Tags: ,

Arquitetura