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.

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.

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.

Trocar senha de root no MySql

Category : Hacks, Tips and Tricks

É muito comum ferramentas que vem com a senha padrão em branco. É muito importante que os administradores de banco de dados ou até os desenvolvedores, tenham a noção da importância da troca de senha. É muito comum encontrar bancos de dados com senhas como “root” ou “sa”, ou até mesmo senhas em branco, que são o default do MySQL. Para mudar a senha não existe segredo, e o melhor de tudo é que caso você esqueça a senha, você pode iniciar o banco de dados e redefini-la.

Para trocar a senha do MySQL, basta digitar o seguinte comando:

mysqladmin -u root password suanovasenhaaqui

E se eu esquecer a senha?
É simples, bastar parar o servidor com esse comando:

/etc/init.d/mysqld stop

Iniciar o MySQL pulando a leitura das tabelas de permissões

mysqld_safe --skip-grant-tables &

Alterar a senha do root

mysqladmin -u root flush-privileges password novasenha

Reiniar o MySQL

/etc/init.d/mysqld restart

Simples, rápido e fácil. Essa dica te ajudou?

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.

Atualizando seu status do Twitter via Oracle

Category : Geek Talk, Hacks, Tips and Tricks

Hoje em dia o banco de dados tem uma enorme importância dentro das coorporações. Eles foram ficando cada vez mais robustos e adquirindo funções que antes só eram executadas pelos aplicativos. Hoje já é possivel, para algumas finalidades, transformar a aplicação em uma casca de exibição e deixar que o banco de dados faça todo o trabalho sujo e carregue toda a regra de negócio dentro dele.

Pesquisando um pouco pela internet para implementar algumas funcionalidade no meu projeto PostWordpress-UpdateSocialEngines, descobri uma procedure interessante, que faz conexão com a API do Twitter e atualiza seu status. Se você gosta de banco de dados, a esse ponto já deve estar muito curioso, então segue o código para quem quiser aproveitar


CREATE OR REPLACE PROCEDURE update_twitter(t_user IN VARCHAR2, t_pass IN VARCHAR2, t_update IN VARCHAR2) AS
http_req utl_http.req;
http_resp utl_http.resp;
h_name VARCHAR2(255);
h_value VARCHAR2(1023);
t_update_send VARCHAR2(4000);
res_value VARCHAR2(32767);
show_header NUMBER := 0;--0 False, 1 True
show_xml NUMBER := 1;--0 False, 1 True
BEGIN
t_update_send := 'status=' || SUBSTR(t_update, 1, 140) || '';
--utl_http.set_proxy('http://www,yourpoxy.com:80'); --If you need to specify a proxy un comment this line.
http_req := utl_http.begin_request('http://twitter.com/statuses/update.xml', 'POST', utl_http.http_version_1_1);
utl_http.set_response_error_check(TRUE);
utl_http.set_detailed_excp_support(TRUE);
utl_http.set_body_charset(http_req, 'UTF-8');
utl_http.set_header(http_req, 'User-Agent', 'Mozilla/4.0');
utl_http.set_header(http_req, 'Content-Type', 'application/x-www-form-urlencoded');
utl_http.set_header(http_req, 'Content-Length', to_char(LENGTH(t_update_send)));
utl_http.set_transfer_timeout(to_char('60'));
utl_http.set_authentication(http_req, t_user, t_pass, 'Basic');
utl_http.write_text(http_req, t_update_send);
http_resp := utl_http.get_response(http_req);

DBMS_OUTPUT.PUT_LINE(‘status code: ‘ || http_resp.status_code);
DBMS_OUTPUT.PUT_LINE(‘reason phrase: ‘ || http_resp.reason_phrase);

IF show_header = 1 THEN
FOR i IN 1 .. utl_http.get_header_count(http_resp)
LOOP
utl_http.get_header(http_resp, i, h_name, h_value);
DBMS_OUTPUT.PUT_LINE(h_name || ‘: ‘ || h_value);
END LOOP;
END IF;

IF show_xml = 1 THEN
BEGIN
WHILE 1 = 1
LOOP
utl_http.read_line(http_resp, res_value, TRUE);
DBMS_OUTPUT.PUT_LINE(res_value);
END LOOP;

EXCEPTION
WHEN utl_http.end_of_body THEN
NULL;
END;
END IF;

utl_http.end_response(http_resp);

EXCEPTION
WHEN others THEN
DBMS_OUTPUT.PUT_LINE(sqlerrm);
RAISE;

END update_twitter;

Para fazer o uso da Procedure é mais simples ainda

begin
UPDATE_TWITTER(‘meuLoginTwitter’,'meuPasswordTwitter’,'Hello World from Oracle’);
end;

Construindo mapas com C# .NET e Google Maps

4

Category : Geek Talk, Hacks, Tips and Tricks

Você quer fazer um mapa, utilizando a API do Google Maps, mas não quer ou não sabe usar javascript?

As vezes fazer as coisas em javascript se torna difícil. Nem todas as IDEs do mercado oferecem um ambiente de desenvolvimento para javascript amigável. Por isso procurei algumas soluções para fazer algumas brincadeirinhas com o Google Maps, sem precisar implementar nada em javascript.
Eu sou muito familiarizado com C#, por isso parti logo a procura de uma biblioteca .NET que pudesse atender as minhas necessidades.
Achei rapidamente um projeto no codeplex que oferecia exatamente o que eu procurava. Para quem tiver interesse e quiser contribuir com o projeto, segue o link: Google Maps
No site do projeto existem alguns exemplos de como usar o controle colocando o código na pagina ASPX. Mas como na maior parte das vezes, temos as coordenadas de latitude e longitude gravadas no banco, e a partir disso vamos montar o mapa, vou mostrar aqui um passo a passo rápido de como usar o controle.

Passo 1 – Fazer o download da biblioteca e adiciona-la ao projeto:
Depois de fazer o download da Biblioteca que irá fazer a interação com o Google Maps. No seu projeto adicione uma nova referência, clicando com o botão direito, selecionando “Add Reference” e em seguida indo na aba “Browse” e escolhendo o arquivo da biblioteca que você fez o download.

Passo 2 – Alterar o web.confg:
Vá ao web.config e procure a sessão
Você vai encontrar algo parecido com o que segue abaixo:

<pages>

<controls>

<add tagPrefix=”asp” namespace=”System.Web.UI” assembly=”System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

<add tagPrefix=”asp” namespace=”System.Web.UI.WebControls” assembly=”System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

</controls>

</pages>

Adicione então a tag responsavel pelo uso do novo controle em qualquer lugar entre as tags <control> e </control> . Existem outras formas de fazer isso, mas eu considero essa a mais rapida.
A tag é a seguinte:

<add tagPrefix=”artem” namespace=”Artem.Web.UI.Controls” assembly=”Artem.GoogleMap”/>

Passo 3 – Código na página ASPX:
Na sua página ASPX, onde deseja exibir o controle, basta colocar a tag responsável pelo controle. Aconselho colocá-la dentro de uma DIV para melhor controle. O controle dentro de uma DIV, fica assim:

<div>

<artem:GoogleMap ID=”mapa” runat=”server” ></artem:GoogleMap>

</div>

E no topo da pagina, é preciso registrar o controle, assim:
<%@ Register assembly=”Artem.GoogleMap” namespace=”Artem.Web.UI.Controls” tagprefix=”artem” %>

Passo 4 – Código no codebehind:
O codigo a seguir exemplifica a plotagem de um mapa, no tamanho 600×600, com centro na latitude -12.928192 e logintude -38.360996
E com um marcador plotado no mesmo ponto. O detalhe é que esse marcador é clicavel e o texto que ele irá exibir, é um texto qualquer que você pode setar usando tags HTML, inclusive imagens.

protected void Page_Load(object sender, EventArgs e)
{
double latitude = -12.928192;
double longitude = -38.360996;
mapa.Latitude = latitude;
mapa.Longitude = longitude;
mapa.Zoom = 15;
GoogleMarker marcador1 = new GoogleMarker(latitude, longitude);
marcador1.Text = “<h2>Texto</h2><br/>Aqui fica o texto de exemplo”;
marcador1.Clickable = true;
mapa.Markers.Add(marcador1);
mapa.Width = 600;
mapa.Height = 600;
mapa.Key = “SuaKeyDoGoogleMapsAPI”;
}

Exemplo de implementação do Google Maps utilizando C#

Exemplo de implementação do Google Maps utilizando C#

Pronto!
Em 4 passos você conseguiu montar um mapa em C#, utilizando o Google Maps e sem digitar uma linha de javascript.

Em breve irei disponibilizar para download um projeto com exemplo de utilização.

 

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