quinta-feira, 30 de julho de 2015

Distributed Logging with log4net e MSMQ

What is Log4net?

Log4net is an open source library that allows .NET applications to log output to a variety of sources (e.g., The console, SMTP or files). Log4net is a port of the popular log4J library used in Java. 




Architecture

The framework is built on the concept of layers and has 4 main components: Logger, Repository, Appender, and Layout.
Logging Levels

1 - OFF - nothing gets logged (cannot be called)
2 - FATAL
3 - ERROR
4 - WARN
5 - INFO
6 - DEBUG
7 - ALL - everything gets logged (cannot be called)

What Appender support?
Console Appender, File Appender, Rolling File Appender, ADO.NET Appender, MSMQ?

What is Microsoft Message Queuing (MSMQ)?

Message Queuing (MSMQ) technology enables applications running at different times to communicate across heterogeneous networks and systems that may be temporarily offline. Applications send messages to queues and read messages from queues. The following illustration shows how a queue can hold messages that are generated by multiple sending applications and read by multiple receiving applications.


Let's encode!!




Implement override AppenderSkeleton ...


Don't forget RenderLayout and two config (QueueName, LabelLayout)


Add a new appender for log4net

Let me know if you would like me to expound on any area listed above or if you have an issue using log4net.Record information on MSMQ allows you to distribute the actions to be taken at every level of log, it's great solution of enterprise application where exist big lots of message log.

Thanks, Happy coding :)

terça-feira, 28 de julho de 2015

WCF ClientBase and Command Dispatcher

What is WCF?

Windows Communication Foundation (WCF) is a unified, simplified and optimized evolution of a number of communication technologies into a single model. Most of the WCF functionalities are included in a single assembly called System.ServiceModel.dll in the System.ServiceModel namespace.


To run WCF service on the client side you have some options:

Option 1: Generate Adding Proxy Service Reference


Problem for enterprise application:

- Updates on service
- Changes in the service configuration


Option 2: Generate Proxy by implementing ClientBase<T> class


It is a good option, but in a great architecture generation can become unproductive and without much need.

Option 3: Generate Dynamic Command Dispatcher

Let's encode!!








Method overloading sending client credencial...



Method overloading sending custom header...



Async method run...



Usage!!



...With this implementation the service call is dynamic and independent enabling updates on unchanged in customer service.

Thanks, Happy coding :)

segunda-feira, 27 de julho de 2015

Using JSON Web Token

( Wikipedia ) JSON Web Token (JWT) is a JSON-based open standard (RFC 7519) for passing claims between parties in web application environment. The tokens are designed to be compact, URL-safe and usable especially in web browser single sign-on (SSO) context. JWT claims can be typically used to pass identity of authenticated users between an identity provider and a service provider, or any other type of claims as required by business processes. The tokens can also be authenticated and encrypted. JWT relies on other JSON-based standards: JWS (JSON Web Signature) RFC 7515 and JWE (JSON Web Encryption)

JWT is a recent open standard that is being driven by the international standards body IETF and has top-level backers from the technology sector (for example, Microsoft, Facebook, and Google).


What is JSON Web Token?
http://jwt.io/
http://tools.ietf.org/html/draft-jones-json-web-token-10
https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force

JWT is simple method send information authentication over a URL or other services transports. Let's not forget JWT does not encrypt the payload, it only signs it so you may want to consider using SSL for all communication between the application requesting authentication and the application granting authentication . You may also want to consider encrypting the JWT token.

The example code below demonstrates a fully working in C#:


Let's encode!!


JWT really does provide a very simple solution to communicating information across untrusted channels.

Don't forget Unit Test...

I hope, this article has given you sufficient information to start implementing. 

Thanks, Happy coding :)

link download:
https://onedrive.live.com/redir?resid=EB97825B1A5209E9%212009

quarta-feira, 10 de dezembro de 2014

Upload arquivos usando o AWS SDK for .NET (C#)

É bastante comum em diferentes tipos de projetos a necessidade de fazer upload de algum tipo de arquivo, sendo ele uma imagem ou algum outro. A forma mais fácil ou a mais utilizada seria fazer upload desse arquivo para uma determinada pasta do projeto, e se você estiver utilizando o IIS como servidor de pagina ou mesmo se for APACHE por exemplo de ambas as formas você estaria fazendo teu servidor entregar o conteúdo estático que nesse caso seria o arquivo que foi feito upload. Não vejo nenhum problema nisso quando falamos de poucos arquivos mas se a sua aplicação tiver uma necessidade maior de performance na entrega ou até mesmo a quantidade for bastante grande gerando um tamanho significante no disco do teu servidor você teria que optar por outra coisa.
Para isso a AMAZON AWS oferece um serviço bastante barato e rápido que pode ser utilizado para diversas outras funcionalidades. Apresentação do serviço no site oficial: http://aws.amazon.com/pt/s3/
A intenção desse post é exatamente mostrar como é simples a integração com o serviço "Simple Storage Service" ou como é conhecido AMAZON S3.

Primeiramente eu criei uma classe estática e nela vamos codificar o nosso método de uploadFile. A organização de onde ficaria melhor a classe fica a critério da arquitetura que você está trabalhando.
Antes de começar a codificar vamos fazer referencia ao SDK da amazon aws, você pode encontrar ele facilmente no Nuget.https://www.nuget.org/packages/AWSSDK/2.3.12 ou se você prefere por command.


   public static class UploadAmazon  
   {  
     private static IAmazonS3 client;  
     public static HttpStatusCode UploadFile(Stream file, string type, string nomeImagem)  
     {  
       using (client = AWSClientFactory.CreateAmazonS3Client("****key****", "***secret key****"))  
       {  
         PutObjectRequest request = new PutObjectRequest();  
         request.BucketName = "MeusArquivos";      //nome do bucket name  
         request.CannedACL = S3CannedACL.PublicRead;  //permissões  
         request.Key = "Arquivos/" + nomeImagem;    //diretorio e nome do arquivo  
         request.ContentType = type;         //type do arquivo  
         request.InputStream = file;         //Stream do arquivo  
         return client.PutObject(request).HttpStatusCode;  
       }  
     }  
   }  
Veja que o código é bastante simples =)
Apenas se atentar alguns detalhes, a propriedade "BucketName" eu coloquei fixa porém você poderia fazer uma verificação se esse "BucketName" se ele já não existe na sua storage, ficaria mais ou menos assim:
 private static bool IsCheckBucket(string bucketName)  
 {  
     ListBucketsResponse response = client.ListBuckets();  
     bool found = false;  
     foreach (S3Bucket bucket in response.Buckets)  
     {  
         if (bucket.BucketName == bucketName)  
         {  
           found = true;  
           break;  
         }  
      }  
      return found;  
  }  
(...) e para criar o BucketName
   public void CreateBucket(string bucketName)  
     {  
       if (!this.IsCheckBucket(bucketName))  
       {  
         client.PutBucket(new PutBucketRequest()  
         {  
           BucketName = bucketName,  
           UseClientRegion = true //Utiliza a mesma região que estiver como padrão no WS.  
         });  
       }  
     }  

Outra propriedade importante também seria "CannedACL" que indica o tipo de permissão que o arquivo terá no storage da amazon aws, nesse caso eu coloquei como "S3CannedACL.PublicRead" que esse arquivo poderá ser visto publicamente.
Para concluirmos você deve ter reparado que ao fazer a chamada da classe "AWSClientFactory" você precisa passar a ela a sua chave e também a chave secreta. Essas duas chaves você pode gerar através do painel de controle da Amazon AWS.
Ao acessar o console https://aws.amazon.com/ com o teu login, você vai ver no menu acima na aba escrita com seu nome a opção "Security Credencials".

Acesse:

Agora é só gerar a sua key e secret key e inserir na chamada.
Se obtiver sucesso no upload você pode acessar o console na opção de serviço S3, você vai perceber que o seu "BucketName" e dentro dele o arquivo enviado, ao clicar sobre o arquivo perceba nas propriedade que Amazon AWS gerou uma url publica de acesso ao seu arquivo que será algo parecido com isso: https://s3.amazonaws.com/MeusArquivos/Arquivos/nome_arquivo
Agora é só usufruir da performance que a storage vai te oferecer além disso com um valor muito pequeno.

Espero ter ajudado.
Abraço,

segunda-feira, 8 de dezembro de 2014

MongoDB + ASP.NET Web API 2

No dia-dia de um desenvolvedor é bem comum a necessidade de criar uma API com pequena ou baixa complexidade, ambientes que possam entregar informações a qualquer dispositivo e plataforma vem se tornando cada vez mais rotineiro.
Através dessa necessidade que a microsoft criou um Framework bastante fácil para desenvolver serviços HTTP http://www.asp.net/web-api





A primeira vez que tive contato com Web Api ainda na versão 1 fiquei muito animado porque consegui ver muitos ganhos principalmente em agilidade de desenvolvimento em relação aos serviços RESTful desenvolvidos com WCF até então.  
Para você que não teve a oportunidade de entrar nesse mundo de serviços RESTful te recomendo a começar com Web Api, é bastante fácil e com pouco programado você vai conseguir ver um resultado bastante interessante. Esse tutorial escrito por Mike Wasson http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api no site oficial do Asp Net vai perceber como é simples criar e consumir o teu serviço criado. Reforço a sua atenção no tutorial do Mike em que ele cria um client em Javascript para teste dos serviços, algo também muito utilizado ou talvez o mais utilizado ... fácil não? 



A minha intenção com esse post além de apresentar o Asp Net Web Api é mostrar a você que você pode também acoplar ele a um banco de dados NoSQL e tornar o seu serviço ainda mais rápido, é claro isso vai depender se a tua analise comporta um banco de dados NoSQL.

Sirva-se de um café e vamos codificar (...) Primeiramente iremos precisar criar um projeto Web Api. Eu optei por criar um projeto "Empty". 




Após criar o projeto já também criei um controller chamado "NOTICIA" e também um modelo também chamado "NOTICIA", perceba que me antecipei e já criei uma pasta chamada "MONGODB". A minha solution ficou mais ou menos assim ...

Se você executar o projeto vai ver que o serviço já esta funcionando porém você não implementou nenhum dos métodos no controller vai receber um erro ou se você optou por criar um controller já com as funções de read/write actions vai ter um template de alguns métodos previamente implementado, fica a sua escolha. 
Com o nosso serviço funcionando vamos agora implementar um pequeno repositório para facilitar a nossa vida ao escrever as nossas consultar no MongoDB.

 public interface IRepository<TEntity> where TEntity : EntityBase   
 {   
    bool Insert(TEntity entity);   
    List<TEntity> SearchFor(Expression<Func<TEntity, bool>> predicate);   
    List<TEntity> GetAll();   
    TEntity GetById(ObjectId id);   
 }   

 public abstract class EntityBase   
 {   
    [BsonId]   
    [BsonRepresentation(BsonType.ObjectId)]   
    public string Id { get; set; }   
 }   

Implementamos uma interface com os métodos que teremos disponíveis no repositório e também uma classe abstract para utilizar em nossos modelos, logo você vai perceber que não será necessário criar um atributo "Id" para nossos modelos sendo que apenas devemos herdar a nossa classe "EntityBase".

Exemplo:
 public class Noticia : EntityBase  
 {  
    public string Titulo { get; set; }  
    public string Conteudo { get; set; }  
    public string Autor { get; set; }  
 }  

Não devemos esquecer de baixar o pacote de DLL do drive do MongoDB para C# é bastante simples e pode ser baixado no
nuGet https://www.nuget.org/packages/mongocsharpdriver/1.9.2

   public class MongoDbRepository<TEntity> : IRepository<TEntity> where TEntity : EntityBase  
   {  
     private MongoDatabase _Database;  
     private MongoCollection<TEntity> _Collection;  
     public MongoDbRepository()  
     {  
       GetDatabase();  
       GetCollection();  
     }  
     private void GetDatabase()  
     {  
       var client = new MongoClient(GetConnectionString());  
       var server = client.GetServer();  
       _Database = server.GetDatabase(GetDatabaseName());  
     }  
     private string GetConnectionString()  
     {  
       return WebConfigurationManager.AppSettings["MongoDbConnectionString"].Replace("{DB_NAME}", GetDatabaseName());  
     }  
     private string GetDatabaseName()  
     {  
       return WebConfigurationManager.AppSettings["MongoDbDatabaseName"];  
     }  
     private void GetCollection()  
     {  
       _Collection = _Database  
         .GetCollection<TEntity>(typeof(TEntity).Name);  
     }  
     public bool Insert(TEntity entity)  
     {  
       entity.Id = ObjectId.GenerateNewId().ToString();  
       return _Collection.Insert(entity).Ok;  
     }  
     public List<TEntity> SearchFor(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate)  
     {  
       return _Collection  
           .AsQueryable<TEntity>()  
             .Where(predicate.Compile())  
               .ToList();  
     }  
     public List<TEntity> GetAll()  
     {  
       return _Collection.FindAllAs<TEntity>().ToList();  
     }  
     public TEntity GetById(ObjectId id)  
     {  
       return _Collection.FindOneByIdAs<TEntity>(id);  
     }  
   }  
Se você já teve oportunidade de trabalhar com repositórios com o EF por exemplo vai perceber alguma semelhança pois utilizamos de expressões linq para acesso aos documentos. Os três métodos privados ficam responsáveis pela configuração do servidor do mongo.
Eu implementei buscando dentro do web.config apenas para uma melhor organização isso não impediria em nada no funcionamento se estivesse diretamente no código a connection do banco.


O servidor do MongoDB poderia estar localmente instalado como escrevi um tutorial a algum tempo falando especificamente sobre essa instalalção no windows. http://jr-encode.blogspot.com.br/2013/03/instal-mongodb-no-windows-como-servico.html.
O processo de instalação é bastante simples mas temos uma outra opção se você não quiser instalar o serviço do mongoDB na sua rede você pode estar utilizando um serviço que inicialmente é gratuito até um certo tamanho de banco e tendo a opção de escalar conforme sua necessidade. É um serviço muito bom pude utilizar em um projeto recentemente e não tive problemas. Você pode estar lendo mais a respeito https://mongolab.com/, após criar um login e senha no Mongolab você terá que criar um novo database.


Recomendo a você a criar um single-node que tem uma opção de até 0.5G gratuito, você terá que informar ao mongolab o nome do seu database a próxima pagina o mongolab irá mostrar sua URL de acesso ao database onde você terá que substituir na config do repositório, depois disso é SUCESSO, você terá um banco NoSQL online tendo a opção de escalar muito dependendo da necessidade e crescimento da sua API.
Com o nosso repositório configurado podemos agora codificar os métodos do nosso controller de noticia.

   public class NoticiaController : ApiController  
   {  
     private IRepository<Noticia> _RepNoticia;  
     public NoticiaController()  
     {  
       _RepNoticia = new MongoDbRepository<Noticia>();  
     }  
     /// <summary>  
     /// Retorna todas as noticias.  
     /// </summary>  
     /// <returns></returns  
     [Route("")]  
     public IEnumerable<Noticia> Get()  
     {  
       return _RepNoticia.GetAll();  
     }  
     /// <summary>  
     /// Retorna uma noticia filtrada pelo Id  
     /// </summary>  
     /// <param name="id">Id</param>  
     /// <returns></returns>  
     [Route("{id}")]  
     public Noticia Get(ObjectId id)  
     {  
       return _RepNoticia.GetById(id);  
     }  
     /// <summary>  
     /// Retorna todas as noticias filtrando por alguma palavra contida no titulo.  
     /// </summary>  
     /// <param name="titulo">Titulo</param>  
     /// <returns></returns>  
     [Route("titulo/{titulo}")]  
     public IEnumerable<Noticia> Get(string titulo)  
     {  
       return _RepNoticia.SearchFor(f => f.Titulo.Contains(titulo)).ToList();  
     }  
     /// <summary>  
     /// Grava uma noticia  
     /// </summary>  
     /// <param name="value"></param>  
     [Route("")]  
     public HttpResponseMessage Post(Noticia noticia)  
     {  
       try  
       {  
         _RepNoticia.Insert(noticia);  
         return Request.CreateResponse(HttpStatusCode.OK, "Noticia gravada com sucesso");  
       }  
       catch (Exception ex)  
       {  
         return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);  
       }  
     }  
   }  
As chamadas para o repositório fica de forma limpa e de fácil entendimento, basicamente temos quatro métodos de teste, são eles: Get (retorna todos), Get (retorna filtrado por id), Get (retorna todos por alguma palavra contida titulo), Post (Grava uma noticia). Outro detalhe que possa parecer diferente é a utilização de "RoutePrefix" na anotação do controller. Isso irá mudar a URL de acesso no router que deverá ser acessada agora assim: http://localhost/api/public/v1/noticias/   dessa forma você consegue padronizar melhor as chamadas da sua API, acredito que isso é mais uma boa pratica porém se você tiver uma maior quantidade de controller vai perceber que começa a ficar "complicada" a organização da API. Segue um outro interessante tutorial falando sobre "RouterPrefix" também escrito pelo Mike Wasson http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

Outra dica interessante que costumo fazer é como geralmente utilizo retorno de formato JSON até porque é bem mais tranquilo para você trabalhar em Javascript por exemplo, removendo o retorno de XML e também formatando o retorno do JSON algo que vai te ajudar bastante na leitura em ambiente de desenvolvimento.

Global.asax.cs (Método register)

Espero ter ajudado, Fique a vontade para manter contato.
Abraço,

sexta-feira, 29 de março de 2013

Instalando MongoDB no Windows

Você que está antenado em novas tendencias já deve ter ouvido falar em NoSQL. Basicamente esse termo é utilizado para definir banco de dados não-relacionais, algo que rompe toda uma historia dos banco relacionais. 
Seu autor Carlo Strozzi tem uma frase que defini bem:
"é completamente distinto do modelo relacional e portanto deveria ser mais apropriadamente chamado "NoREL" ou algo que produzisse o mesmo efeito".
Aqueles que gostam de historia, te recomendo a dar uma navegada por esses sites:
O foco desse nosso POST é dar inicio a utilização de um banco de dados não-relacional, inicialmente irei mostrar como instalar o banco e configura-lo para ficar como um serviço do windows. 
Ao inicial o sistema operacional, juntamente com ele o serviço do nosso banco de dados. Venho estudando e utilizando em alguns projetos o banco "MongoDB". http://www.mongodb.org/.
MongoDB é uma aplicação de código aberto, de alta performance, sem esquemas, orientado à documentos.

Nesse mundo de NoSql ele é um cara bastante conhecido e utilizado por muita gente grande como Twitter, Facebook etc que por sua vez são sistemas que necessitam de alta escalabilidade nas consultas e utilização de compartilhamento de informações entre servidores. 
Suas bibliotecas são escritas em C++ e utiliza técnicas avançadas em recorrer totalmente a memoria para leitura dos dados.


Começamos fazendo o download da biblioteca que está disponível no site oficial http://www.mongodb.org/downloads.
Após teremos que criar duas pastas para apontar ao mongo aonde os arquivos do repositório será armazenado.

md data
md data\db
Depois de criada as pastas, teremos que navegar até a pasta em que baixamos e executar o Mongod.exe


Com a execução realidade com sucesso você poderá testar se o serviço está rodando corretamente. Vá até o seu navegador de preferencia e escreva a seguinte URL http://localhost:27017/





Se você reparar no gerenciador de processos da sua maquina vai ver um processo chamado mongod.exe. Muito fácil não é? isso já seria suficiente para começar a utilização do banco.
Mas como disse inicialmente vamos coloca-lo na inicialização do sistema operacional, para isso execute o seguinte comando:
C:\mongodb\bin\mongod.exe --config C:\mongodb\mongod.cfg --install

Fique atento se o arquivo mongod.cfg existe no diretório, caso contrario execute os seguintes comandos para criar o diretório de log.

md C:\mongodb\log
echo logpath=C:\mongodb\log\mongo.log > C:\mongodb\mongod.cfg


Agora o arquivo mongod.cfg foi gerado, após efetuado o procedimento com sucesso, execute novamente o comando para instalação do serviço.
Reinicie o sistema operacional e verá que o serviço será iniciado...

Acessando a URL http://localhost:28017/ terá um gerenciador bastante simplificado aonde é mostrado algumas atividades do banco.
Uma outra dica bastante produtiva seria a utilização de um gerenciador com uma interface gráfica um pouco mas amigável.
http://robomongo.org/ é uma biblioteca também de código aberto de muito fácil configuração e utilização, nela você terá um ambiente gráfico para gerenciar suas bases no MongoDB.


Apenas lembrando que testei esse procedimento de instalação nos sistema operacional windows 7 ultimamte 64 bits e windows server 2008 R2 Enterprise.

É isso ai! Espero ter ajudado.
Abraço =)

   "O sucesso nasce do querer, da determinação e persistência em se chegar a um objetivo. Mesmo não atingindo o alvo, quem busca e vence obstáculos, no mínimo fará coisas admiráveis."
José de Alencar

sábado, 17 de novembro de 2012

JQuery Mobile, Plante Aqui vs Google Maps API

Boa tarde caros "encodes" ...
sábado quente em Londrina pra variar! A um bom tempo sem escrever, prova de certificação bem próxima e o tempo vai ficando um pouco escasso, chega de desculpas baratas "HAHA" e vamos lá (...)
Post de hoje pretendo expor a vocês uma nova API que venho estudando e pude participar de um "Hackathon" com uma galera muito fera, que o intuito era apresentar essa API e suas funcionabilidades. Falando um pouco sobre a API, ela se chama Plante Aqui você pode encontrar mais sobre no Plante Aqui no Facebook ou se preferir no site oficial http://www.planteaqui.org/ lá você vai encontrar sobre a ideia da API e a proposta que a mesma está divulgando que é bastante interessante por sinal.
Aqui vou apresentar algo bastante básico e utilizar o recurso de consultas que a API (Plante Aqui) me fornece.
Após você ter dado uma lida nos links que repassei vamos explicar o nosso programa de exemplo:

1 - Desenvolver uma interface mobile com JQuery Mobile.
2 - Repassar os dados consultados a API(Plante Aqui).
3 - Com o retorno de sucesso da API(Plante Aqui) vamos utilizar a API(Google Maps) para mostrar os resultados em tela.

Considerando que você leu a ideia central do Plante Aqui a nossa interface cliente basicamente vai receber os dados de latitude e longitude informados pelo usuário que seria as coordenadas em que você quer saber se naquele ponto existe um local adequado para se plantar uma arvore se as coordenadas forem encontradas vamos repassar elas a nosso maps marcando o local.
Chega de papo e vamos codar =)
Começamos a implementar a parte visual:
 <!DOCTYPE html>  
 <html>  
 <head>  
      <meta charset="utf-8">  
      <title>Google Maps vs Plante Aqui</title>  
      <link rel="stylesheet" href="css/themes/default/jquery.mobile-1.2.0.css" />  
      <link rel="stylesheet" href="docs/_assets/css/jqm-docs.css" />  
      <script src="js/jquery.js"></script>  
      <script src="docs/_assets/js/jqm-docs.js"></script>  
      <script src="js/jquery.mobile-1.2.0.js"></script>  
 </head>  
 <script type="text/javascript">  
 </script>  
 <body>  
      <div class="ui-body ui-body-a">  
           <div data-role="fieldcontain">  
              <label for="latitude">Latitude:</label>  
              <input type="text" name="latitude" id="latitude" value="" />  
           </div>  
           <div data-role="fieldcontain">  
              <label for="longitude">Longitude:</label>  
              <input type="text" name="longitude" id="longitude" value="" />  
           </div>  
           <button type="button" data-theme="b" id="enviar" name="enviar" onclick="buscarEndereco();">Verificar Disponibilidade  
           </button>  
      </div>  
      <div id="map_canvas" style="width: 100%; height: 500px"></div>  
 </body>  
 </html>  
Como pode ver o código é bastante simples com JQuery Mobile.
O próximo passo seria implementar o codigo que será responsável em "desenhar" o mapa.
Não sei se você teve a oportunidade de trabalhar com alguma integração das API do google porém vai ver que é bastante simples de entender e aplicar nos seus programas as inúmeras funcionabilidades que a google apresenta.
Sobre o google maps em questão você vai encontrar a documentação aqui: https://developers.google.com/maps/documentation/javascript/v2/introduction neste link tem os exemplos de códigos e parametros que você pode utilizar para enriquecer teu programa.
Voltando a nosso exemplo implemente essa função.
   var map = null;  
   var geocoder = null;  
   function initialize() {  
    if (GBrowserIsCompatible()) {  
     map = new GMap2(document.getElementById("map_canvas"));  
     map.setCenter(new GLatLng(37.4419, -122.1419), 1);  
     map.setMapType(G_HYBRID_MAP);  
     map.setUIToDefault();  
     geocoder = new GClientGeocoder();  
    }  
   }  

Se você deu uma lida rápida no link que repassei sobre a API do Google Maps creio que ficou bastante fácil entender o meu código a seguir! "hehe" De modo geral eu instancio a classe GMap2() repassando para o construtor da classe o elemento HTML criado na minha pagina que irá receber o canvas do mapa gerado.
O restante do código se trata de configurações propriamente falando do mapa. O método SetMapType(G_HYBRID_MAP); por exemplo defini o tipo de mapa que será apresentando ao inicializar o programa, no meu caso eu escolhi o "SATÉLITE".
O nosso próximo passo seria adicionar a função a seguir no onload da pagina:
 <body onload="initialize()" onunload="GUnload()">  
...e também não podemos esquecer de adicionar a referencia a API do google:
 <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key="SUA_CHAVE"  
 type="text/javascript"></script>  
Perceba que no parametro "KEY" você deverá colocar a sua KEY gerada pela google no momento que você marcou a utilização de alguma API com o teu usuário google é claro.
Mais informações para obter a sua KEY:
https://developers.google.com/maps/documentation/javascript/tutorial
Fazendo isso você já verá algum resultado (...)

Vamos agora para a nossa próxima implementação que seria a função de busca das coordenadas informadas.
No evento onclick="" do button "Verificar Disponibilidade" vamos chamar a seguinte função:
 function buscarEndereco(button){  
           var iLatitude = $('#latitude').val();  
           var iLongitude = $('#longitude').val();  
           if(iLatitude != '' || iLongitude != ''){  
                $.getJSON('http://www.planteaqui.org/api/position?lat='+iLatitude+'&lon='+iLongitude+'',   
                     function(data) {  
                          // dados retornados do Plante Aqui  
                          point = new GLatLng(data[0].positions.lat,data[0].positions.lon);  
                          marker = new GMarker(point);  
                          map.addOverlay(marker);  
                     }  
                );  
           }else{  
                alert('Informe a Latitude e a Longitude para buscar!');  
           }  
  }  
Antes de explicarmos o nosso código vale ressaltar sobre a API Plante Aqui, pois se você a leu a documentação vai perceber que ela é baseada em REstFull desta forma utilizei a função $.getJSON(url,function() { } ); 
veja que a requisição é assíncrona e no segundo parâmetro você deve criar a sua função que receberá o retorno que no nosso caso é um JSON, após o retorno instancio a classe 
GLatLng(LATITUDE, LONGITUDE); 
repassando as coordenadas encontradas pela API Plante Aqui o retorno da função será guardada em uma VAR que será também repassada a classe GMarker(); que receberá as coordenadas retornando um ponto a ser marcado que por final será adicionado ao objeto principal do mapa. =)
Tranquilo né?
Pensando em ficar funcional para o usuário que estará fazendo a consulta não fico muito legal pois saber a latitude e longitude exata de um local é um pouquinho complicado "HAHA" porém este é o nosso primeiro exemplo utilizando API Plante Aqui, A ideia é evoluir e o próximo post que está praticamente pronto será implementado algumas alterações para corrigir isso. =)
A nível acadêmico alcançamos o nosso objetivo que seria mostrar como consumir uma API em RestFull e também a integração com o maps do google.
Fica o reforço da dica para você dar uma melhor olhada na API Plante Aqui veja que a documentação explica exatamente como "sugerir um local para se plantar" e outros métodos vale dizer também que a API está em constante alterações e novas melhorias vem ai.
Ficamos por aqui, com o agradecimento em especifico ao pessoal do Plante Aqui que abriu a oportunidade e a iniciativa.

Download do projeto completo
Até a próxima. :)