Capturar pontos no mapa com C# e Google Maps

Category : Hacks, Tips and Tricks

Vocês devem ter reparado que a muito tempo não ando escrevendo nada técnico. Andei pensando em fazer uma reformulação no blog, e dedicar uma sessão exclusiva a pequenos trechos de códigos. Mas acabei não dando prioridade a essa mudança, então aqui estou eu novamente.

Durante os últimos meses recebi alguns e-mails falando do artigo sobre como construir mapas com .NET e Google Maps. Alguns eram pedindo dicas, outros pediam ajuda com implementação mais complexas. Então recentemente recebi um comentário sobre uma funcionalidade que já havia implementado a muito tempo. Então estou aqui para compartilhar o trecho de código.

A duvida em questão é, como capturar pontos clicados no google maps. Na verdade, é bem simples, mas antes você precisa entender como funciona a construir mapas utilizando google maps e a biblioteca Artem, para .NET e C#. Para saber o básico, clique aqui.

O funcionamento é simples e será explicado em alguns passos.

  1. Crie um textbox chamado txtLatitude e outro chamado txtLongitude
  2. Adicione o controle do Google Maps a pagina, com a propriedade de OnClientClick, apontando para a função javascript

    <artem:GoogleMap ID=”GMaps” runat=”server” OnClientClick=”__showInfo” ></artem:GoogleMap>

  3. Adicione a função javascript que irá capturar os valores do ponto clicado e preencher os textboxes
    <script type=”text/javascript”>
    function __showInfo(overlay, point) {
    if (point) {
    var infoLatitude = document.getElementById(‘<%= txtLatitude.ClientID %>’);
    infoLatitude.value = point.lat();
    var infoLongitude = document.getElementById(‘<%= txtLongitude.ClientID %>’);
    infoLongitude.value = point.lng();
    }
    }
    </script>

Pronto! Agora com esse código você já pode clicar no mapa e observar os valores sendo refletidos nas suas caixas de texto. O código javascript é bem simples e auto explicativo, então acho que não tem segredo. Qualquer dúvida, basta deixar um comentário.

Could not load file or assembly ‘XXXX’ or one of its dependencies. An attempt was made to load a program with an incorrect format.

Category : Hacks, Tips and Tricks

Você já viu esse erro antes?

Could not load file or assembly ‘XXXX’ or one of its dependencies. An attempt was made to load a program with an incorrect format.

O problema se dar por conta da versão de compilação da aplicação e versão aceita pelo IIS. Provavelmente você está tentando rodar a aplicação em um ISS numa maquina de 64bits.

A DLL em questão está compilada para 32 bits. Para verificar, vá ao Visual Studio, clique no projeto em questão, vá em propriedades e na aba “Build”, verifique a seguinte configuração:

Veja que na sessão “Plataform target”, está marcado x86, o que significa que a compilação é para 32bits. Por algum motivo você pode realmente precisar compilar sua aplicação dessa forma e eu não irei discutir isso, mas o que realmente está causando o problema é uma configuração no IIS.

O problema real é que o IIS na maquina 64Bits está usando um  Application Pool que não permite que uma DLL de 32bits seja processada.

Abra o IIS Manager encontre o application pool para o site que apresenta o problema e selecione Advanced Settings. Você verá a tela acima.

Veja que existe uma opção chamada “Enable 32-Bit Applications” isso é o que está causando o erro. Habilite essa opção e tudo deve voltar ao normal.

Usando o NUnit no Visual Studio 2010 em 3 passos

Category : Hacks, Tips and Tricks

Se você tentou usar o NUnit para fazer teste unitário no Visual Studio 2010 e não conseguiu, pode ter ficado um pouco frustrado. Basta ler a mensagem que você vai perceber que o NUnit está tentando executar com uma versão do framework, diferente da usada pelo Visual Studio. A mensagem deve ser a seguinte:

This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded. You may be attempting to load an assembly build with a later version of the CLR than the version under which NUnit is currently running.

Você como bom programador, sabe que os fontes do NUnit estão disponíveis na internet, então sai correndo para recompila-lo no Visual Studio 2010. Mas tenha um pouco de calma, não é preciso nada disso. Basta seguir esses 3 passos:

1- Abra o arquivo .config do NUnit(está na mesma pasta do executável)

2- Dentro da tag <configuration> adicione o seguinte:
<startup>
<requiredRuntime version=”v4.0.20506″ />
</startup>

3- Dentro da tag <runtime> adicione:
<loadFromRemoteSources enabled=”true” />

Essa dica rápida pode lhe poupar alguns minutos.

Consistência de hive do registro de contador de desempenho

11

Category : Hacks, Tips and Tricks

Hoje o MS SQL Server 2008 e o Windows 7 resolveram me stressar um pouco com esse erro, pouco comun.

Consistência de hive do registro de contador de desempenho

Isso acontece porque o aplicativo tentou acessar uma chave no registro responsável pelo contador de desempenho e não encontrou essa chave.

Se você teve esse mesmo erro ao tentar instalar o SQL Server 2008, não se desespera e não fique no google 2 horas procurando a solução como eu fiz.

O “fix” para esse problema é muito simples, mas até chegar a esse ponto, tive que percorrer inúmeros foruns e sites de support da microsoft.

1- Faça um programa de console qualquer em C# para imprimir o resultado do seguinte código:

string.Format(“{0,3}”, CultureInfo.InstalledUICulture.Parent.LCID.ToString(“X”)).Replace(” “, “0″);

O resultado da minha execução foi 016, então vamos levar esse valor em consideração no nosso exemplo.

2- Vá até o regedit na chave

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib

3- Crie uma nova chave com o valor que foi retornado do aplicativo console, no meu caso, 016

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\016

4- Agora basta ir a chave 009 que se encontra no mesmo caminho, e copiar os registros Counter e Helper para dentro da nova chave que acabou de ser criada.

Pronto!

Agora basta rodar denovo o instalador do SQL 2008 e tudo vai funcionar perfeitamente.

Microsoft PDC09 Transmitida ao vivo

Category : Geek Talk, Inteligência Digital

Apenas uma nota rápida para os amantes de tecnologia e desenvolvimento de software. Está acontecendo nesse exato momento, a Microsoft Professionals Developers Confenrence, que é um dos eventos mais importantes do ano.

Nele são apresentadas as tendências e futuros lançamentos da Microsoft. Já foi falado de IE 9, Silverlight 4, Windows Azure, Visual Studio 2010 e muito mais.

Aconselho dar uma passada no site http://microsoftpdc.com que está transmitindo o evento ao vivo!

ray-ozzie-microsoft-420x0

Google Maps e ASP.NET – Marcando pontos no mapa

1

Category : Hacks, Tips and Tricks

Algum tempo atrás, ensinei como construir mapas no ASP.NET usando o Google Maps. Agora vou ensinar como fazer com que sua aplicação saiba qual foi o ponto do mapa clicado pelo usuário.

Na verdade isso é bem simples de ser feito. E pode servir perfeitamente para sua aplicação, caso o usuário tenha que interagir com a aplicação para cadastrar uma nova localidade por exemplo.

Vamos levar em conta o seguinte cenário: Um usuário vai selecionar um ponto no mapa e os valores de latitude e longitude desse ponto, irão automaticamente preencher as caixas de texto com as respectivas informações.

Supondo que tenhamos 2 textboxs com os nomes, txtLatitude e txtLongitude como no código abaixo.

<asp:TextBox ID=”txtLatitude” runat=”server”></asp:TextBox>

<asp:TextBox ID=”txtLongitude” runat=”server”></asp:TextBox>

Se você já leu o artigo anterior que ensina como construir o mapa, sabe que teremos um um controle do Google Maps mais ou menos assim:

<artem:GoogleMap ID=”GMaps” runat=”server” OnClientClick=”__showInfo” ></artem:GoogleMap>

A diferença entre esse controle e o que foi falado no artigo anterior, é o evento de OnClientClick. Fazendo isso, estamos dizendo que um javascript chamado “__showInfo()” será executado quando ocorrer algum click por parte do usuário.

Agora, tudo que você precisa é adicionar esse script a sua pagina.

<script type=”text/javascript”>
function __showInfo(overlay, point) {
if (point) {
var infoLatitude = document.getElementById(‘<%= txtLatitude.ClientID %>’);
infoLatitude.value = point.lat();
var infoLongitude = document.getElementById(‘<%= txtLongitude.ClientID %>’);
infoLongitude.value = point.lng();
}
}
</script>

Nesse script, estamos capturando os valores da latitude e longitude  clicados no mapa e atribuindo aos textboxs.

A sintaxe do código abaixo pode parecer estranha para alguns, mas em tempo de execução o ASP.NET irá substituir o valor “<%= txtLatitude.ClientID %>” pelo ID da caixa de texto de latitude.

document.getElementById(‘<%= txtLatitude.ClientID %>’)

Acho que agora você já é capaz de montar sua própria pagina de cadastro de localidades usando o google maps. Qualquer duvida, basta deixar um comentário ou enviar um e-mail.

Erro ao rodar o Code Analysis no Visual Studio Team System 2008

Category : Geek Talk, Inteligência Digital

Se você tinha um ambiente completamente montado para o Visual Studio 2008 Professional, assim como eu, e de repente teve que instalar o Visual Studio Team System, pode ter se deparado com uma serie de problemas, que vão desde erro na aba do TeamExplorer para se conectar ao servidor de colaboração, até problemas ao rodar o code analysis.

Se você recebeu um erro como esse, ao tentar rodar o code analysis no seu projeto, não fique preocupado.

An unknown error occurred running Code Analysis. Please contact Microsoft Product Support Services.

Nem tudo está perdido. Para acertar os ponteiros do seu Visual Studio novamente, basta re-instalar o Service Pack 1 da ferramenta. Se você está com preguiça de procurar o link do SP1, basta clicar aqui

Infelizmente o Visual Studio 2008 tem dessas coisas. A ordem de instalação importa para o resultado final do produto. Mas a suite Team System é incrível. Muitos recursos legais. Dependendo da metodologia aplicada ao projeto, você realmente consegue desenvolver todo ele, usando apenas essa ferramenta. Desde a parte de gerência, passando por arquitetura e chegando a codificação. Eu recomendo!

Usando captcha no ASP.NET

3

Category : Hacks, Tips and Tricks

Se você está procurando uma alternativa de captcha para usar nas suas paginas asp.net, pode ficar despreocupado. O reCaptcha vai cuidar de toda a implementação do captcha para você.

Para usar é muito simples.  Vamos seguir passo a passo.

1- Baixe o plugin do reCaptcha para .NET aqui.

Lembrando que você terá que se cadastrar na pagina pois precisará de uma chave para utilizar o serviço. E essa chave é gerada durante o seu cadastro e o cadastro do domínio que irá usar o captcha na pagina do próprio serviço.

2- Adicione a dll que você baixou como referencia no seu projeto web

3- Registre o controle do captcha na pagina em que ele será usado.

<%@ Register TagPrefix=”recaptcha” Namespace=”Recaptcha” Assembly=”Recaptcha” %>

4-Adicione o código do controle captcha no seu webform

<recaptcha:RecaptchaControl
ID=”recaptcha”
runat=”server”
PublicKey=”"
PrivateKey=”"
/>

Os atributos de PublicKey e PrivateKey são as chaves que você recebe ao se cadastrar no serviço do recaptcha no site deles.

5- Codificar a validação do reCaptcha

Na verdade você não tem que codificar a validação do reCaptcha, é apenas uma linha de código para saber se o usuário digitou o valor certo ou não no captcha. Supondo que na sua pagina, você tem um botão chamado btnOK que dispara um evento de click onde é necessário saber se o usuario passou pela validação do captcha ou não para fazer o redirecionamento para a próxima pagina. Em um cenário como esse, o código seria algo assim:

protected void btnOK_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
Response.Redirect(“Default.aspx”);
}
}

O único trabalho que precisa existir é verificar se a pagina é valida, através do atributo da pagina, IsValid. Uma implementação simples e rápida. Você ainda pode customizar a aparencia do controle do reCaptcha. Mas essa explicação fica para um outro momento…

Espero ter ajudado.

Treinamento ASP.NET e Segurança em aplicações na UniJorge

Category : Inteligência Digital

De 28 a 30 de outubro, vai acontecer na UniJorge em Salvador – Bahia o 4º encontro interdisciplinar de cultura, tecnologias e educação. Estarei no evento junto com um parceiro de projetos, Ivan Clay. Nós iremos ministrar juntos o treinamento de ASP.NET e eu irei ministrar também um treinamento de “Vulnerabilidades em aplicações web 2.0, causadas pelas más praticas de programação”.

Sobre o evento:

O IV Encontro Interdisciplinar de Cultura e Educação – INTERCULTE, congresso institucional do Centro Universitário Jorge Amado – UNIJORGE tem como tema Culturas, Ciências e Tecnologias: novas configurações territoriais.

Com esse tema, buscamos pensar a comunidade através dos elementos de  ”[...] territorialidade, permanência, [e] ligação entre existência de formas próprias de comunicação. O sentimento de pertencimento, ou “pertença”, seria a noção de que o indivíduo é parte de todo, coopera para uma finalidade comum com os demais membros; a territorialidade, o lócus da comunidade; a permanência, condição essencial para o estabelecimento das relações sociais” (Palácios apud Recuero, s/d, p. 04).

O INTERCULTE tem como objetivo estimular a comunidade acadêmica na produção, socialização e divulgação de conhecimentos científicos no campo educacional, promovendo intercâmbios entre alunos e pesquisadores, entre instituições de ensino e outras parcerias da comunidade.

Este objetivo demarca algumas diferenças quando do fortalecimento da produção intelectual e do compromisso na formação de profissionais pesquisadores, como por exemplo: a) a mediação nos processos de ensinar, aprender e construir conhecimentos e; b) o sentimento de pertença (ou pertencimento?) quando se trata de uma comunidade científica e acadêmica.

O evento é pago e vocês podem ter mais informações clicando aqui

Agurado vocês por lá.

PS: Para quem vai participar dos cursos, existe um formulário de satisfação sobre o curso, disponível aqui

Thread Lock – Trancando recursos para execução de threads usando Lock com C# e .NET

Category : Geek Talk

As vezes é necessário que suas Threads acessem os mesmos objetos e modifiquem valores nesses objetos.
Porém se você estiver trabalhando com um computador multi-processado, por vezes os resultados serão errados, pois uma thread vai desfazer o que a outra já fez.

Vou explicar melhor essa historia.

Exemplo Clássico:
Temos um contador numa classe X

int contador = 0;

Só existe uma instância da classe X no seu programa, e toda vez que suas threads fizerem determinada atividade, elas deve incrementar em 1 esse contador.

Nada mais normal do que a classe X possuir um método assim:

public void AtualizaContador(){
contador++;
}

Para esse simples exemplo não estamos levando em conta as boas praticas e questões de encapsulamento que são muito importantes também.

Agora num ambiente multi-processado, imagine 2 Threads no mesmo momento tentando fazer a atualização do contador.

Supondo que nesse ponto o contador tenha o valor 10.
De maneira genérica, para fazer a atualização, os passos dados pelo processador seriam:

  1. Salvar o valor 10 no registrador do processador
  2. Incrementar o valor contido no registrador em 1
  3. retornar o valor para memória

Voltando ao exemplo…

Se duas Threads pegassem ao mesmo tempo o valor 10, as duas iam incrementar o valor para 11, porem na hora de salvar em memória, uma delas ia salvar primeiro o valor 11, por conseqüência a outra deveria salvar o valor 12 mas isso não acontece, ela salva o valor 11 novamente por cima do valor 11 que já estava lá. Causando uma inconsistência nos dados da nossa aplicação.

Temos diversas formas de tratar isso, principalmente porque “incrementação” é uma operação thread safe,então temos classes e métodos para tratar especificamente dessa situação.

Mas vamos tratar aqui como se fosse uma situação genérica. Dessa forma usaremos o lock do C#
De maneira muito simples de usar, o lock irá bloquear os recursos do objeto até que a thread que está utilizando o trecho do código acabe de processa-lo

Teríamos então o seguinte código:

public void AtualizaContador(){

lock(this){
contador++;
}
}

O lock recebe como parâmetro o this que é uma palavra reservada do C#, que referencia o objeto em questão. No caso, como o método está dentro da classe X, o this então, representa a classe X. É como se a própria classe estivesse se referenciando.

Espero ter conseguido passar um pouco da importância do lock.
Existem outras formas de fazer isso, mas teríamos que entrar em outras discussões como dead lock e etc… Então trarei isso em um outro post.
Talvez vocês não enxerguem a importância disso num exemplo simples como esse, mas em ambientes complexos isso toma proporções enormes.

Espero ter ajudado
Até a próxima.

 

You need to log in to vote

The blog owner requires users to be logged in to be able to vote for this post.

Alternatively, if you do not have an account yet you can create one here.

Powered by Vote It Up