sexta-feira, 6 de dezembro de 2013

Certificação Microsoft - Você chega lá...




















Olá pessoal, venho aqui para deixar uma visão geral para quem pretende, um dia, tirar as certificações Microsoft.

O caminho não é fácil, requer muita dedicação, estudo e, principalmente força de vontade. A nova metodologia de certificação da Microsoft esta muito mais específica e direcionada especificamente para a tecnologia que você atua.

O processo de certificação para quem esta começando é conhecido como MTA (Microsoft Technology Associate), e é o ponto de entrada para a certificação Microsoft. É a primeira certificação, porém não menos importante do que as demais, muito menos pense que ela será fácil.

Hoje existem 3 carreiras distintas, que são:

MTA em Infraestrutura - Quem pretende trilhar o caminho para servidores, cloud-computing, e suporte à Desktop.
MTA em Banco de Dados - Quem pretende direcionar a sua carreira para administração de banco de dados e BI.
MTA em Desenvolvimento - Para desenvolvedores de software.























As provas tem duração de até 60 minutos (geralmente realizadas em média de 45 minutos), e de 35 a 40 questões. O valor da prova é U$ 76,00, ou R$ 152,00, e pode ser realizada em qualquer centro da Prometric.

Qualquer dúvida é só postarem aqui no Blog.

Boa sorte e bom estudo à todos.

sexta-feira, 1 de novembro de 2013

Dica de C# - Você sabe a diferença entre REF e OUT?!



















O C# possui os 2 identificadores de referência

  • ref - Faz uma passagem por referência 
  • out - Gera apenas um valor de output (saída)

Atenção: Não confunda o conceito de passagem por referência com o conceito de tipos de referência.

Ocorre que a CIL (Common Intermediate Language, e não mais MSIL - era o nome usado nas versões Beta do .Net) apenas suporta o ref, o out é específico da linguagem C# e quando compilado para IL se transforma em ref.

Isso explica algo muito importante : O porquê de uma rotina com out e uma com ref não serem aceitas como duas rotinas diferentes – não serem aceitas como overloads. De fato, ref e out acabam sendo a mesma coisa quando colocado em IL, apenas o compilador do C# faz a diferenciação.

quarta-feira, 30 de outubro de 2013

Erro 417 : Expectation Failed – Como resolver?



















As vezes, quando acessamos alguns servidores utilizando o .NET, recebemos esse erro : Expectation Failed.

Tenho percebido que esse erro ocorre principalmente no acesso a internet através de servidores de proxy, porém já vi acontecer em outras situações.

O que esse erro significa?

O Framework (.NET) faz o envio de dados para os servidores em duas etapas distintas, implementando um padrão existente no HTTP 1.1. Primeiro envia apenas os headers (cabeçalhos) para o servidor, esperando que o servidor responda se ele suporta ou não essa requisição, em seguida, caso haja uma resposta positiva do servidor, envia os dados, caso contrário o erro “Expectation Failed” é exibido (no caso a resposta negativa do servidor).

Podemos resolver isso de uma forma bem simples, basta desativar o envio em duas etapas através de uma configuração no Web.Config, conforme abaixo:

<system.net>
   <settings>
      <servicePointManager expect100Continue="false" />
   </settings>
</system.net>

segunda-feira, 28 de outubro de 2013

Dica - Anti-vírus no servidor com ClamWin Free



















Em muitos fóruns vejo a seguinte pergunta: Qual o melhor anti-vírus para o meu servidor?! Oras, isso é uma questão muito relativa, pois antes de escolher o anti-vírus (AV) do seu servidor, você tem que saber quais serviçso rodam no seu servidor.

Por exemplo, se você roda o Exchange Server, precisa de um AV com agente para escanear as mensagens que entram e saem. Então, falar para definir o melhor AV é muito relativo, e é preciso saber quanto seguro ($$$) queremos ficar. Uma solução completa de AV Corporativo, com agentes, atualizações centralizadas, e todas as "features" fazem o preço disparar, então vou dar uma solução gratuita para servidores de arquivos, e infraestrutura (AD, DNS, DHCP, Impressão, Banco de Dados).

Eu sempre ouvia falar muito bem do ClamWin Free, porém ele não tem proteção em tempo real, ou seja, você baixa e armazena o vírus, pois ele não é ativo, não análisa, e deixa você executar o mesmo, então posso dizer que não trás tanta segurança assim. Depois de muitas pesquisas, e alguns testes encontrei uma ferramenta para ser utilizada com o ClamWin Free, que faz a proteção em tempo real, que é o software que se chama Clam Sentinel. Além da proteção ele faz:


  • Detecção de invasão (ataque hacker)
  • Proteção heurística pró-ativa
  • Proteção em USB e drivers removíveis
  • Coloca arquivos em quarentena
  • Fácil configuração pelo system tray
  • Scan em tempo real de drives, memória, e mensagens
  • Suporta Windows 98
  • Suporte a várias línguas
Link para Download do ClamWin Free: ClamWin Free 0.98
Link para Download do Clam Sentinel: Clam Sentinel


Depois de baixa-los, execute primeiro o ClamWin Free, faça a instalação padrão.













Marque a opção para fazer o Download do Banco de Dados das definições de vírus.













Instalando...














Automaticante ele faz o download das definições do vírus.












Finalizando a instalação.














Agora vamos instalar o Clam Sentinel. Execute o setup, e selecione o idioma.









Selecione a opção para iniciar automaticamente para todos usuários:













Siga os passos de uma instalação padrão. Finalize a instalação. Marque para executar o sentinela.













Logo na primeira tela você já informa as unidades a serem monitoradas.







Pronto... Agora você já tem um excelente serviço de AV rodando em seu servidor, e com proteção em tempo-real. Para afinar as configirações clique no system tray (ao lado do relógio) sobre o ícone do Clam Sentinel e faça algumas configurações.

sexta-feira, 25 de outubro de 2013

SQL Check Reference - Validar relacionamentos entre tabelas



















Em projetos mal estruturados, e mal documentados, sempre que precisamos fazer uma manutenção em um sistema "desconhecido", sem o relacionamento de dados, é necessário fazer um mapeamento manual, com consultas e mais consultas para tentar identificar os relacionamentos. Mas e se o banco tem 600 tabelas?! Torna-se uma missão quase impossível.

Diante dessa dificuldade desenvolvi uma simples aplicação em C#, que você informa os dados da conexão com o banco de dados, e o nome da Chave Primária que você quer verificar se existem ou não relacionamentos. Você ainda pode apontar um determinado valor, ou um range de valores separados por vírgula para saber em quais tabelas estes registros se relacionam.

Foi desenvolvido em um ambiente com Windows 7, e testado nas versões 2000, 2005, e 2008 do Microsoft SQL Server.

- Não funciona com outro banco de dados (apenas MS SQL Server)
- É necessário ter o Framework 4.0 instalado para rodar o aplicativo

O software é FREEWARE.
Nome do Programa: SQL Check References

Link para download: http://www.superdownloads.com.br/download/62/sql-check-references/

Estou aberto a receber sugestões e críticas para melhorar o sistema.

SQL Check References

quarta-feira, 9 de outubro de 2013

SQL - Concatenar registros de várias linhas com COALESCE



















Ontem me deparei com um "problema"... Precisava concatenar os registros do banco de dados em uma aplicação, até ai sem problemas, é só fazer um LOOP no retorno do banco, concatenar e pronto! Não... Não poderia ser feito assim, pois para fazermos uma alteração na aplicação, a mesma precisa passar de desenvolvimento para homologação (passo esse que demora), para só depois ir para o ambiente de produção. Quando a alteração/manutenção é feita no Banco é bem mais rápido, quase instantâneo, menos burocrático.

Tive a idéia de fazer o mesmo LOOP no SQL (mesmo não sendo adepto a essa prática), mas sem sucesso. Eis que pesquisando um pouco achei o comando COALESCE... E não é que era EXATAMENTE o que eu precisava?!

Tem uma síntaxe simples... Rápida... Vejamos o código:

-- Variável para receber os registros da tabela separados por ","
DECLARE @Lista VARCHAR(80)

-- Define o valor para vazio
SET @Lista = ''

-- Seleciona o registro, e coloca na variável
SELECT @Lista = @Lista + ',' + COALESCE(CAMPO_DA_TABELA, '') FROM TABELA

-- Remove primeira "," da variável
SET @Lista = SUBSTRING(@Lista, 2, LEN(@Lista))

-- Exibe os resultados da variável
SELECT @Lista

Essa aqui foi uma solução que encontrei para fazer um select de múltiplos registros na mesma linha, separando-os por vírgula.

Você pode trocar o separador conforme a sua necessidade, pode ser um pipe "|", ponto e vírgula ";", ponto ".", ou qualquer outro carctere a sua escolha.

quarta-feira, 25 de setembro de 2013

Criando um arquivo TXT com C#



















Olá pessoal, aqui mais uma daquelas dicas rápida, e extremamente necessária para quem esta começando. Como gravar um arquivo TXT em uma determinada pasta?

Temos que ter o caminho completo de onde será gravado, junto com o nome do arquivo a ser gerado, e o conteúdo do arquivo.

O Framework já possui a função que escreve o arquivo (File.WriteAllText, que fica dentro do Namespace System.IO), basta invoca-lá e passar como parâmetros o caminho completo, e o conteúdo. O código fica assim:

string caminhoArquivo = @"C:\apps\NomeArquivo.txt"; //caminho completo
            
StringBuilder sConteudo = new StringBuilder();
sConteudo.AppendLine("Primeira linha do arquivo.");
sConteudo.AppendLine("Segunda linha do arquivo.");
sConteudo.AppendLine("Terceira e última linha do arquivo.");
//invocando o método WriteAllText, informando o caminho e o conteúdo
System.IO.File.WriteAllText(caminhoArquivo, sConteudo.ToString());

Claro que esse simples código apenas gera o TXT com o conteúdo, porém vai da sua necessidade verificar se o arquivo existe, se você quer adicionar conteúdo a um arquivo existente, enfim, as possibilidade são infinitas sobre o que pode ser feito com a criação/manutenção de um arquivo.

terça-feira, 24 de setembro de 2013

Dica - Rodando ASP.Net em um servidor de Produção



















Uma dica muito valiosa, e importante é não executar o ASP.Net em um servidor de produção com o DEBUG ativado.

Alguns motivos:
  • A compilação de páginas é muito mais demorada, pois as otimizações do engine são desabilitadas;
  • O código leva um tempo maior para ser executado, pois os caminhos de depuração estão desativados;
  • O pool da aplicação do IIS passa a utilizar muito mais memória para aplicação;
  • Imagens e scripts utilizados por componentes (como o Ajax Toolkit, por exemplo) não são armazenados no cachê;
  • E a mais perigosa de todas, é que com isso, em caso de uma exceção não tratada as mensagens são exibidas detalhadamente no servidor remoto, expondo a aplicação;
O recurso é muito importante e útil na resolução de problemas, porém é uma boa prática deixar a função desabilitada em um ambiente de produção.

terça-feira, 17 de setembro de 2013

Dica de SQL - Inserindo data no Formato dd/MM/aaaa




















Todo mundo já passou por algum tipo de problema na hora de fazer uma inserção, ou atualização em um banco de dados. Você passa a data no formato (dd/MM/aaaa) ele grava em outro (aaaa/MM/dd), (aaaa/dd/MM), ou qualquer outro formato padrão que esteja configurado no servidor.

Esse é um problema comum, pois tem haver com as configurações de data e hora do servidor (geralmente configurados no padrão EN).

Para inserirmos uma data de forma correta, independete do formato do servidor, temos que converter o valor.

Vamos criar uma tabela temporária e tentar inserir uma data no formato dd/MM/aaaa (30/12/2013).

1.º - CREATE TABLE #tmpTable (data DATE)
2.º - INSERT INTO #tmpTable (data) VALUES ('30/12/2013')

O seguinte erro é apresentado:





Isso aconteceu pois o sistema entendeu que estamos inserindo o mês 30, do dia 12, do ano de 2013, quando na verdade estamos inserindo o dia 30, do mês 12, de ano de 2013.

Para essa inserção/atualização funcionar vamos converter o formato utilizando a seguinte síntaxe:
INSERT INTO #tmpTable (data) VALUES (CONVERT(DATETIME,'30/12/2013',103))



Bem, essa é apenas uma dica simples de como inserir a data no formato dd/MM/aaaa em um campo do tipo DATE ou DATETIME.

segunda-feira, 16 de setembro de 2013

C# - Como abrir um arquivo (DOC, PDF, XLS) pelo Windows Form




















Uma dica simples e rápida para você. Quando precisar abrir algum arquivo de dentro de uma aplicação C# (Windows Forms) é só executar o comando:

System.Diagnostics.Process.Start(@"C:\teste\nomeArquivo.doc");

Esse arquivo pode conter qualquer extensão, isso mesmo, qualquer extensão, pois quem abre o aplicativo (arquivo) não é o Framework e nem a sua aplicação .Net, e sim o programa correspondente a extensão (previamente instalado no computador). Por exemplo, se você chamar o arquivo nome.doc, automaticamente o MS Word será aberto (se estiver instalado - óbvio), pois é o programa associado a extensão. Se você colocar um arquivo que não existe uma associação à um programa, será aberto uma tela para que você selecione o programa que deseja utilizar para abrir o arquivo.

sexta-feira, 13 de setembro de 2013

Entenda o que é Pascal Case e Camel Case



















Pascal Case e Camel Case são denominações (em inglês) para a prática de escrever palavras compostas ou frases, e são largamente utilizadas em linguagens de programação, como C#, Java, Ruby, PHP, principalmente nas definições de classes, objetos, e métodos.

Camel Case
Cada palavra é iniciada por uma letra minúscula, e unidas sem espaço. Geralmente utilizado na criação de classes e objetos.
Exemplo: nomeCompleto, valorDesconto, tipoCliente

Pascal Case
Cada palavra é iniciada com uma letra maiúscula. O padrão PascalCase é mais utilizado para nomear métodos.
Exemplo: CalculaDesconto(), ValidaEmail(), ImprimeCadastro()

Esse padrão é muito utilizado (em alguns casos obrigatórios) no mercado, além de ser uma boa prática. Agora um exemplo de um trecho de código utilizando os padrões Pascal Case e Camel Case.

int totalContador = 0;
void ExibirMensagem(string nome)
{
   string mensagemCompleta = string.format("Olá {0}, você é o visitante de número {1}", nome, totalContador);
   totalContador++;

}


quinta-feira, 12 de setembro de 2013

Dica de SQL - Identificar se banco está em Full Recovery Model























Quando alteramos o recovery model de uma base para full na verdade a base não passa a trabalhar imediatamente com o recovery model full. Ela estará utilizando um recovery model pseudo-simple até que um backup full seja realizado e a base possa relamente trabalhar com o recovery model full. 

Como identificar se uma base está trabalhando com recovery model full ou pseudo-simple ? 

Nem sempre saber a data do último backup é suficiente, você precisa saber se o último backup foi realizado após a base ter sido mudada para recovery model full. O simples ato de mudar o recovery model para simple e depois para full - prática se tornando conhecida para limpar arquivos de log - inutiliza a sequencia de backups e faz a base trabalhar no recovery model pseudo-simple até que o próximo backup full seja realizado. 

Para identificar com maior precisão se um banco está trabalhando com recovery model full ou pseudo simple podemos utilizar a seguinte query : 

select name,last_log_backup_lsn from 
sys.databases a, sys.database_recovery_status b 
where a.database_id=b.database_id 

Com essa query basta examinarmos o campo last_log_backup_lsn. Se estiver nulo, o database não está em full, podendo estar no pseudo-simple recovery model. Se não estiver nulo, a sequencia de backups de logs está ok, o database está em full. 

quarta-feira, 11 de setembro de 2013

Dica de SQL - Obtendo o tamanho de um campo text/varchar(max)























A função LEN não funciona com campos do tipo text e varchar(max). Mas e se precisarmos saber o tamanho do campo para alguma finalidade?

A solução é bem simples, é só utilizar a função DATALENGTH. Essa função devolve o tamanho ocupado, em bytes, por um campo, independente do tipo que seja. No caso de um campo texto, esse tamanho equivale ao tamanho do texto. 

Veja um exemplo : 
SELECT DATALENGTH(campo) FROM tabela 

Teremos o tamanho do campo texto em todos os registros. 

Temos apenas que nos atentar caso o campo seja do tipo ntext ou nvarchar(max), pois como o tamanho é em bytes, o resultado é o dobro do tamanho. Uma dica é dividi-lo por 2, caso seja necessário.

quinta-feira, 11 de julho de 2013

Especificações do Cookie



















O Cookie é muito importante no desenvolvimento de qualquer projeto web, mas para fazer a utilização do mesmo atente-se a 4 pontos fundamentais:
  • O total de cookies que o computador suporte é 300;
  • Caso você atinja o limite de cookies, o mais antigo será apagado a cada novo criaod;
  • O tamanho máximo de um cookie é 4 KB, ou seja, 4000 bytes. Isso quer dizer que você poder armazenas aproximadamente 4000 caracteres em um Cookie.
  • O número máximo de cookies por domínio e/ou servidor é de 20;

terça-feira, 25 de junho de 2013

Javascript - Desabilitar Enter em campos do tipo text (input)



















Uma sensação horrível para quem esta navegando em um site, é quando se digita algum texto em um campo, e pressiona-se a tecla enter (ou para pular a linha, ou para se fazer uma pesquisa) e um outro botão com funções diferentes da que você quer é processado.

Para se evitar isso é necessário chamar a apenas a função que você deseja no evento KeyPress do botão em questão, e desabilitar a função em todos os outros objetos de texto (inputs).

Vamos criar essa função em nossa página.


function disableEnterKey(e) {
    var key;
    if (window.event)
        key = window.event.keyCode; //IE
    else
        key = e.which; //firefox      

    return (key != 13);
}

Agora é só chamar no evento OnKeyPress da tag body de nossa página.

<body onkeypress="return disableEnterKey(event)">

Agora todos os controles do tipo input tem o seu evento desabilitados no botão enter.

segunda-feira, 18 de março de 2013

Dica - Visual Studio não instância uma DLL




















Olá amigos, tudo bem? Hoje vou dar uma simples dica relacionado a utilização de DLL no Visual Studio 2010.

Em alguns fóruns, vi algumas pessoas dizendo que adicionam uma DLL no Visual Studio 2010 (Server Explorer > References > Add Reference) e após importar o NameSpace para o projeto, a classe não é exibida no Intelisense, e por mais que seja informada manualmente o projeto não compila, informando que não conseguiu localizar o Assembly.
Isso ocorre porque você não esta utilizando nenhuma versão de Framework, esta utilizando apenas o Client Profile.

Para resolver esse problema, clique no menu superior em "Project", e em seguida selecione a opção "NomeProjeto Properties". Em seguida será exibido as propriedades do projeto, e na aba "Application" que se abre a esquerda, localize a opção "Target Framework" e selecione então o correspondente a sua aplicação.
Compile o projeto e tente novamente fazer a utilização da DLL referenciada e pronto!

Qualquer dúvida, postem aqui.

sexta-feira, 15 de março de 2013

C# - Função para remover acentos



















Fala ai pessoal, tudo em ordem?! Hoje vou postar um código bem usado e bem procurado... Uma função para remover acentos.

string toRemoveAcentos = "Lá hà uma lua tão bela";
const string StrComAcentos = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç'";
const string StrSemAcentos = "AAAAAAaaaaaEEEEeeeeIIIIiiiiOOOOOoooooUUUuuuuCc ";
int i = 0;

foreach (Char c in StrComAcentos)
{
    toRemoveAcentos = toRemoveAcentos.Replace(c.ToString().Trim(), StrSemAcentos[i].ToString().Trim());
    i++;
}

O resultado será: "La ha uma lua tao bela".

quinta-feira, 14 de março de 2013

C# - Enviando e-mail pelo GMAIL



















Olá pessoal, hoje vou colocar aqui uma função para o envio de mensagens de e-mail utilizando uma conta do Gmail. Vi em muitos fóruns e artigos, códigos para o envio que não fazem a implementação do SSL, e logo a mensagem não é enviada.

O código parte do principio que sua página possui 4 (quatro) campos do tipo texto box sendo:

  • Nome - txt_nome;
  • Email - txt_email;
  • Telefone - txt_Telefone;
  • Mensagem - txt_mensagem;
O primeiro passo é importar a classe System.Net.Mail (using System.Net.Mail). Mais detalhes sobre essa classe pode ser obtida clicando aqui.

//Definir usuário e senha da conta do Gmail
string sUserName = "email@gmail.com";
string sPassword = "senha";

// montado stringbuilder para corpo da mensagem
StringBuilder CompleteMsg = new StringBuilder();
CompleteMsg.AppendLine("Nome:" + txt_nome.Text);
CompleteMsg.AppendLine("Telefone:" + txt_telefone.Text);
CompleteMsg.AppendLine("Mensagem:" + txt_mensgaem.Text);

// convertendo stringbuilder para string
string CorpoDoEmail = (Convert.ToString(CompleteMsg));
string sBody = CorpoDoEmail;

//Criar o objeto email
MailMessage objEmail = new MailMessage();
objEmail.To.Add(sUserName);
objEmail.From = new MailAddress(txtEmail.Text.Trim());
objEmail.Subject = "Título da mensagem";
objEmail.Body = sBody;

//Criar a função que fará o disparo
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com"; //Servidor 
smtp.Credentials = new System.Net.NetworkCredential(sUserName, sPassword);
smtp.EnableSsl = true;
smtp.Send(objEmail);

quarta-feira, 13 de março de 2013

C# - Função Gerador de Senhas



















Olá pessoal, hoje desenvolvi um código para gerar senhas randômicas. Pode ser utilizado para várias finalidades, como para reset em cadastros de usuário, enfim, o uso da função é por sua conta.

Criei um método que gera a senha, e retorna a string com a senha gerada.

//Definido variável com os caracteres utilizados na geração da senha
private const string SenhaCaracteresValidos = "abcdefghijklmnopqrstuvwxyz1234567890@#!?";
        
public static string CreatePassword()
{
    //Aqui eu defino o número de caracteres que a senha terá
    int tamanho = 8;

    //Aqui pego o valor máximo de caracteres para gerar a senha
    int valormaximo = SenhaCaracteresValidos.Length;

    //Criamos um objeto do tipo randon
    Random random = new Random(DateTime.Now.Millisecond);

    //Criamos a string que montaremos a senha
    StringBuilder senha = new StringBuilder(tamanho);

    //Fazemos um for adicionando os caracteres a senha
    for (int i = 0; i < tamanho; i++)
        senha.Append(SenhaCaracteresValidos[random.Next(0, valormaximo)]);

    //retorna a senha
    return senha.ToString();
}

terça-feira, 12 de março de 2013

C# - Invertendo uma string



















Olá pessoal, hoje vou publicar mais uma função bem simples, e que ficou bem conhecida por usuários que tem o costume de fazer downloads da internet de filmes, programas, e jogos.

Geralmente quando se clica no link para download você é redirecionado para uma página de propaganda, e que deve esperar alguns segundos ou até mesmo minutos para o link de download ser liberado, porém na barra de endereço do site, esta o caminho do link, só que invertido, dando um certo trabalho para reescrever em ordem contrária.
public static string Inverter(string Texto)
{
    //Cria a partir do texto original um array de char
    char[] ArrayChar = Texto.ToCharArray();

    //Com o array criado invertemos a ordem do mesmo
    Array.Reverse(ArrayChar);

    //Agora basta criarmos uma nova String, já com o array invertido.
    return new string(ArrayChar);
}

segunda-feira, 11 de março de 2013

C# - Verificando se é um número Inteiro (int)



















Olá pessoal, vou mostrar um exemplo bem simples para validar se um valor é Inteiro (int) ou não. O mesmo código pode ser usado para validar varáveis do tipo decimal e float.
//Variável que que será testada
string valorVerificar = "90";

//Variável que terá o valor, caso seja inteiro
int valorInteiro; 
            
//Validando se é inteiro utilizando o recurso TryParse
//No método passamos primeiro uma string, e depois a saída "out"
bool isNumeroInteiro = int.TryParse(valorVerificar, out valorInteiro);

//Verificando se é um número
if (isNumeroInteiro)
{
    //Número é inteiro
}
else
{ 
    //Não é um número inteiro
}

domingo, 10 de março de 2013

CSS - Dica para barra de rolagem sempre vísivel



















Olá amigos, bom dia! Mas um domingo e eu aqui postando uma dica bem legal sobre CSS.

Eu já tive esse problema, e como tudo na vida da gente, é errando e quebrando a cabeça que se aprende, achei legal compartilhar isso com vocês. Essa dica, essencialmente é para quem esta iniciando com CSS que vai pegar esse "problema" em breve.

Quando desenvolvemos um site e centralizamos ele na tela, o navegador calcula automaticamente a sobra que tem de haver nos dois lados, para que realmente fique centralizado em qualquer resolução de monitor. Acontece que quando a página é grande o navegador é obrigado a criar a barra de rolagem, fazendo assim que o esqueleto da página seja modificado entre páginas que tem rolagem e que não tem rolagem.

É uma "pequena" mudança, mas além de mudar a disposição visual, na transição da página, aos olhos do usuário parece que muda muita coisa, quando na verdade a única coisa que se altera são as margens da direita e esquerda.

Uma solução que encontrei foi a de colocar a barra de rolagem em todas as páginas, ou seja, independente do tamanho da página (pequena ou grande) sempre exibiremos a barra de rolagem e isso não deixará nunca que seja redimensionado nenhuma margem.

Esse é um código CSS simples, porém que resolveu o meu problema.

html { overflow-y: scroll; }
html { overflow: -moz-scrollbars-vertical; }
html { overflow-x: auto; }

sábado, 9 de março de 2013

Falha ao criar um Banco de Dados no SQL Express



















Olá amigos. Tive um problema ao tentar criar um novo banco de dados pelo Visual Studio 2010. Ele me dava uma mensagem de erro, e não permitia a criação do banco.

A mensagem de erro era:
"Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance."

Depois de algumas pesquisas, e alguns testes acabei encontrando a solução.

1. O primeiro passo é stopar as instancias do SQL Server Express que estiverem iniciadas. Para isso, clique em "Start" > "Run", e digite "services.msc". Localize a opção "SQL Server (nome da instância)". Clique com o botão direito do mouse e selecione a opção "Stop";
2. Agora temos que excluir os arquivos que estão gerando esse erro. Para isso, clique em "Start" > "Run", e digite "%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Data\" e pressione enter;
3. Logo em seguida será exibido uma janela com uma pasta chamada "SQLEXPRESS", pode apagar essa pasta e todo o seu conteúdo, sem medo de ser feliz.
4. Inicie o serviço que paramos no primeiro passo;

Pronto, agora você já consegue criar uma nova Base de Dados. Se tiverem alguma dúvida ou outro sintoma,  por favor, postem aqui no blog.

Até a próxima.

sexta-feira, 8 de março de 2013

ASP.Net - Dados em um DropDownList e valor Inicial



















Depois de ver em muitos fóruns dúvidas de como popular um "DropDownList" por código (sem utilizar o assistente do Visual Studio) resolvi criar um post mostrando o passo a passo para carregar os dados de um banco de dados, como definir o valor inicial, e pegar o valor posteriormente.

Primeiro crie um projeto no Visual Studio do tipo "Empty ASP Net Web Application". Adicione um WebForm e insira um componente "DropDownList", e nomeie-o como "ddl". Adicione também um botão e nomeie-o como "btValor".

O seu código deverá ficar assim:


Agora já vamos definir o valor inicial do DropDownList. Isso é bem simples, basta adicionar o seguinte código dentro da tag . Teste no navegador.

     

Agora vamos popular o DropDownList com valores de um banco de dados SQL Server. Não vou entrar no mérito das classes de acesso à dados, pois o post é sobre "DropDownList" e não Banco de Dados.

Pressione o botão F7 para acessarmos o Code-Behind da página.

Na aba Solution Explorer adicione um banco de dados SQL e nomeie-o como "data.mdf". Crie uma tabela com o nome de "valor" e insira dois campos:

id - Int (define com identity e chave primária)
descricao - varchar(50)

Agora na aba Server Explorer, Data Connections, clique com o botão direito do mouse na tabela que acabamos de criar (valor), e vamos inserir manualmente alguns valores nessa tabela. Selecione a opção "Show Table Data". Vou colocar: Celular, Mouse, Teclado, e Notebook. Como defini como identidade (identity) os seus códigos serão 1, 2, 3, e 4 respectivamente.

Depois disso vamos popular esses dados que acabamos de inserir no DropDownList. Para isso, no Code-Behind da página vamos criar 2 métodos e chamar um deles no PageLoad.

Primeiro método que vamos criar é o de acesso ao banco de dados para recuperarmos os dados em um DataTable. Para isso importe as classes Data e Data.SqlClient.

private DataTable MontarDataTable(string sql)
        {
            //Definir a ConnectionString
            string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\data.mdf;Integrated Security=True;User Instance=True";            
            
            //Iniciar o processo de Conexão ao Banco de Dados
            SqlConnection conn = new SqlConnection(connectionString);
            conn.Open();

            //Instanciando o DataAdapter para popular um DataTable
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            da.Fill(dt);

            return dt;
        }

Agora vamos criar o método que vai popular o DropDownList.

private void PopularDropDownList()
        {
            //Query que irá retornar os valores do banco de dados
            string sql = "SELECT * FROM valor";

            //DataTable que será populado
            DataTable dt = new DataTable();

            //Populando o DataTable chamando a Função que criamos de acesso à dados
            dt = MontarDataTable(sql);

            //Populando e definindo o DropDownList
            ddl.DataSource = dt;
            ddl.DataTextField = "descricao";
            ddl.DataValueField = "id";
            ddl.DataBind();
        }

Agora temos que chamar esse metódo (PopularDropDownList()) no evento PageLoad da página, para que toda vez que iniciarmos a página ele seja carregado.
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)            
                PopularDropDownList();
        }

Agora compile o seu código e teste no navegador. Os dados já devem ser exibidos no DropDownList, porém ainda falta codificarmos o botão para verificar o valor do DropDownList.
DropDownList C#
Valores Carregados no DropDownList
Vamos inserir um objeto Literal, para exibirmos o valor do item selecionado.



E vamos codificar o botão "btValor", inserindo o seguinte código:
        protected void btValor_Click(object sender, EventArgs e)
        {
            //Pegar o valor do item do DropDownList
            string valor = ddl.SelectedValue.ToString();

            //Verificar se o item selecionado não foi o item "Selecione"
            if (valor == "Selecione")
            {
                lblValorSelecionado.Text = "Nenhum valor foi selecionado";
                return;
            }

            lblValorSelecionado.Text = valor;
        }

Pronto. Agora compile o seu projeto e pode fazer o teste. Selecione um objeto no DropDownList e clique no botão "Valor do DropDown". O valor selecionado deverá aparecer ao lado do botão, conforme a imagem a seguir:
DropDownList
Valor selecionado no DropDownList
Agora já temos a nossa solução finalizada, pegando os valores do DropDownList e exibindo na tela, valores esse que foram obtidos através do Banco de Dados, tudo de forma manual, sem utilizar nenhum assistente do Visual Studio.

Você pode baixar os arquivos desse projeto clicando aqui.

Espero que tenham gostado. Até a próxima.

quinta-feira, 7 de março de 2013

C# - Função contra SQL Injection (Injeção de SQL)



















A Injeção de SQL, mais conhecida através do termo americano SQL Injection, é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. A injeção de SQL ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entradas de dados de uma aplicação. Para mais detalhes sobre SQL Injection clique aqui.

Hoje todas as linguagens de programação já oferecem suporte para passar parâmetros em uma query, ao invés de concatena-la, o que acaba impedindo os ataques de injeção SQL.

Mas paralelo a isso, eu particularmente ainda utilizo bastante a concatenação de strings, para evitar o ataque de Injeção SQL criei uma simples função em C# que elimina os termos que podem ser considerados perigosos para o nosso banco de dados, e vou compartilhar essa função com vocês.
public static string Sanatization(string str)
        { 
            //Função simples para evitar ataques de injeção SQL
            if (str == string.Empty || str == "")
                return str;

            string sValue = str;

            //Valores a serem substituidos
            sValue = sValue.Replace("'", "''");
            sValue = sValue.Replace("--", " ");
            sValue = sValue.Replace("/*", " ");
            sValue = sValue.Replace("*/", " ");
            sValue = sValue.Replace(" or ", "");
            sValue = sValue.Replace(" and ", "");
            sValue = sValue.Replace("update", "");
            sValue = sValue.Replace("-shutdown", "");
            sValue = sValue.Replace("--", "");
            sValue = sValue.Replace("'or'1'='1'", "");
            sValue = sValue.Replace("insert", "");
            sValue = sValue.Replace("drop", "");
            sValue = sValue.Replace("delete", "");
            sValue = sValue.Replace("xp_", "");
            sValue = sValue.Replace("sp_", "");
            sValue = sValue.Replace("select", "");
            sValue = sValue.Replace("1 union select", "");
   
   //Retorna o valor com as devidas alterações
            return sValue;

        }

quarta-feira, 6 de março de 2013

C# - Função para validar um CNPJ



















Vamos ver agora uma função para validar um CNPJ. Assim como a função de validação do CPF, o CNPJ pode ser passado com os caracteres de ".", "/", e "-", pois a função também faz esse tratamento.

Segue o código para validação do CNPJ:

//Validar CNPJ
        public static bool validarCNPJ(string cnpj)
        {

            int[] mt1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] mt2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int soma; int resto; string digito; string TempCNPJ;

            cnpj = cnpj.Trim();
            cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");

            if (cnpj.Length != 14)
                return false;
    
   if (cnpj == "00000000000000" || cnpj == "11111111111111" ||
    cnpj == "22222222222222" || cnpj == "33333333333333" ||
    cnpj == "44444444444444" || cnpj == "55555555555555" ||
    cnpj == "66666666666666" || cnpj == "77777777777777" ||
    cnpj == "88888888888888" || cnpj == "99999999999999")
    return false;

            TempCNPJ = cnpj.Substring(0, 12);
            soma = 0;

            for (int i = 0; i < 12; i++)
                soma += int.Parse(TempCNPJ[i].ToString()) * mt1[i];

            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            digito = resto.ToString();

            TempCNPJ = TempCNPJ + digito;
            soma = 0;
            for (int i = 0; i < 13; i++)
                soma += int.Parse(TempCNPJ[i].ToString()) * mt2[i];

            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = digito + resto.ToString();

            return cnpj.EndsWith(digito);
        }

terça-feira, 5 de março de 2013

C# - Função para validar um CPF



















Olá amigos. Ontem postei um código para validação de e-mail, e entrando nessa onde vou postar aqui a validação de CPF. O processo é bem simples e semelhante ao anterior, vamos passar um CPF (seja com pontos ou hífen) e a função vai tratar e retornar se é válido (true) ou não (false).
//Valida CPF
        public static bool validarCPF(string CPF)
        {
            int[] mt1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] mt2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            string TempCPF;
            string Digito;
            int soma;
            int resto;

            CPF = CPF.Trim();
            CPF = CPF.Replace(".", "").Replace("-", "");

            if (CPF.Length != 11)
                return false;

            TempCPF = CPF.Substring(0, 9);
            soma = 0;
            for (int i = 0; i < 9; i++)
                soma += int.Parse(TempCPF[i].ToString()) * mt1[i];

            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            Digito = resto.ToString();
            TempCPF = TempCPF + Digito;
            soma = 0;

            for (int i = 0; i < 10; i++)
                soma += int.Parse(TempCPF[i].ToString()) * mt2[i];

            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            Digito = Digito + resto.ToString();

            return CPF.EndsWith(Digito);
        }

segunda-feira, 4 de março de 2013

C# - Função para validar um E-mail



















É comum criarmos formulários de contato, cadastros de clientes, e até mesmo cadastro de newsletter e os usuários inserirem um e-mail inválido. Isso acaba sendo um problema, pois se for em um formulário de contato, você não tem como responder, se for em um cadastro de newsletter não terá utilidade nenhuma.

Tem uma função bem simples em C# para que possamos evitar que esse problema ocorra. Você simplesmente passa uma string com o e-mail a ser validade e a função retorna se é válido (true) ou não (false).

//Função para validar Email
        public static bool validarEmail(string Email)
        {
            bool ValidEmail = false;
            int indexArr = Email.IndexOf("@");
            if (indexArr > 0)
            {
                if (Email.IndexOf("@", indexArr + 1) > 0)
                {
                    return ValidEmail;
                }

                int indexDot = Email.IndexOf(".", indexArr);
                if (indexDot - 1 > indexArr)
                {
                    if (indexDot + 1 < Email.Length)
                    {
                        string indexDot2 = Email.Substring(indexDot + 1, 1);
                        if (indexDot2 != ".")
                        {
                            ValidEmail = true;
                        }
                    }
                }
            }
            return ValidEmail;
        }
*** Post atualizado em 06/08/2015. Conforme mencionado por um leitor anônimo, se fosse informado dois arrobas (@@), o e-mail era válidado. No mesmo comentário, o leitor Douglas Lima já apresentou a solução, que já esta atualizada no trecho de código acima.
Ainda no mesmo post, o leitor Wesley Reis sugeriu uma expressão regular para fazermos a validação. Estarei criando um novo post utilizando Expressões Regulares (RegEx) e colocando também o link aqui.
C# - Função para validar um E-mail com Expressão Regular (RegEx)

domingo, 3 de março de 2013

C# - Limitando itens em um Combo Box (WF)




















Em aplicativos Windows Forms, a propriedade “MaxDropDownItems” não funciona. Melhor dizendo, funciona mas para isso você precisa setar o valor do atributo “IntegralHeight” como “false”.

Depois disso, o seu ComboBox habilita uma barra de rolagem caso o número de itens seja superior ao que você permite neste objeto.

Veja o exemplo:

ComboBox1.IntegralHeight = false;
ComboBox1.MaxDropDownItems = 5; // valor de itens para aparecer no DropDown

Esse código funciona em Windows XP, Windows Vista e 7. Foi testado nos Frameworks 3.5 e 4.0.

sábado, 2 de março de 2013

Criptografando Strings em uma aplicação C#



















Como já vimos o básico sobre criptografia no post "O que é Criptografia?", vamos abordar de maneira prática a criptografia de strings utilizando uma aplicação Windows Forms com C#. Essa classe de criptografia poderá ser usada também em projetos Web (Web Forms, MVC).

Para iniciarmos a programação vou dizer que não vamos inventar a roda novamente, ou seja, não vamos criar o nosso próprio algoritmo de criptografia, vamos utilizar uma classe pronta do .Net, a MD5CryptoServiceProvider, que é encontrada desde a versão 1.1 do Framework.


1. Crie um projeto do Tipo Windows Forms (File - New - Project - Visual C# - Windows - Windows Forms Application);
2. Dê o nome do projeto de CriptografiaMD5;
3. Renomeie o "Form1.cs" para "frm_Crypt.cs";
4. Crie uma interface com 2 botões (1 para codificar e 1 para decodificar a string). Adicione também 4 Text Box's;
Criptografando com C#
Form para Codificar e Decodificar Strings
5. Nomeie-os da seguinte forma:
  • botão Criptografar: bt_encrypt;
  • botão Decriptar: bt_decript;
  • TextBox String para Encriptar: txt_toEncript;
  • TextBox Resultado Encriptar: txt_ResultEncript;
  • TextBox String Criptografada: txt_toDecript;
  • TextBox Resultado para Decriptar: txt_ResultDecript;
6. Crie uma classe com o nome "MD5Crypt.cs";
7. Abra a classe "MD5Crypt.cs" e importe a referência Cryptography, utilizando a sintaxe "using System.Security.Cryptography";
8. Introduza na classe o seguinte Código:
class MD5Crypt
    {
        const string senha = "12345";

        public static string Criptografar(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToEncrypt = UTF8.GetBytes(Message);
            try
            {
                ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return Convert.ToBase64String(Results);
        }

        public static string Descriptografar(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToDecrypt = Convert.FromBase64String(Message);
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return UTF8.GetString(Results);
        }
    }
9. Agora precisamos chamar a função para codificar e decodificar dentro dos botões. Vamos começar criptografando uma string, para isso, dê um duplo clique no botão "bt_encrypt" (Criptografar), e insira o código:
            string strToCript = txt_toEncript.Text;
            strToCript = MD5Crypt.Criptografar(strToCript);
            txt_ResultEncript.Text = strToCript;
10. Agora dê um duplo clique no botão "bt_decript" (Decriptar), e insira o código:
            string strToDecript = txt_toDecript.Text;
            strToDecript = MD5Crypt.Decript(strToDecript);
            txt_ResultDecript.Text = strToDecript;
Pronto, a sua classe de criptografia esta pronta para ser utilizada. Para testa-lá pressione o botão F5 para compilar o seu código, e insira um texto no campo "String para Encriptar" e posteriormente clique no botão "Criptografar". Será exibido no resultado a sua string codificada.

Você agora pode pegar essa string codificada, copiar e cola no campo "String Criptografada" e clicar no botão "Decriptar". O resultado tem que ser o mesmo valor do inserido no campo "String para Encriptar".

Agora você pode usar a sua imaginação e utilizar a criptografia como quiser em seus projetos, seja para proteger dados dos usuários, para armazenar senhas de usuários, enfim, use como achar necessário.

Você pode pegar esse projeto clicando aqui.

domingo, 24 de fevereiro de 2013

O que é Criptografia?



















O que é criptografia? Onde usar? Porque usar? Essas são perguntas frequentes, e apesar de quase todos os analistas de sistemas, administradores de rede, desenvolvedores, e gerentes saberem da importância da utilização de criptografia, poucos a fazem na prática. 

Criptografia: a grosso modo, criptografia é o ato de codificar dados e informações aparentemente sem sentido, para que pessoas não consigam ter acesso às informações que foram cifradas.

Onde usar: há vários usos para a criptografia, vamos dizer que sirva para proteger documentos confidencias, transmitir informações confidenciais pela internet (seja por e-mail, FTP, ou qualquer outro meio), transmitir informações por uma rede local, proteger informações em um banco de dados.

Porque usar: vamos pensar assim, temos um site de comércio eletrônico, onde centenas de milhares de usuários fazem o cadastro para comprar os produtos. Em uma venda é obrigatório fornecer dados pessoais (pela questão fiscal - emissão de nota), como nome, endereço, telefone, CPF, e-mail, senha, dentre outros. Um programador mal intencionado que faz manutenção nesse site, tem acesso ao banco de dados, logo, ele consegue acesso á todos os dados pessoais de um cliente. Cada um fará o uso das informações conforme achar necessário, um funcionário descontente, por exemplo, divulga na rede (internet) para expor uma falha da empresa,  podendo ainda chantagear a empresa para não expor os dados de seus clientes, ou até mesmo vendendo essas informações no mercado negro.

Outro caso comum, é um determinado usuário da rede manter dados da empresa em seu Smartphone, Tablet, Notebook, ou um dispositivo móvel qualquer. Ele é um funcionário de total confiança, porém caso ele seja roubado, ou apenas esqueça o seu dispositivo em um café, os dados da empresa estarão comprometidos. Seja uma planilha de clientes ativos ou inativos, planilha de cobrança, ou detalhes de um determinado produto e/ou serviço.

A intenção desse post é mostrar um resumo básico do que é criptografia e para que serve, caso você tenha interesse em se aprofundar no assunto existem diversos livros, sites, grupos de discussões, e inclusive pós-graduação do assunto. Seguem dois títulos de livros que podem lhe ajudar nessa iniciação na criptografia: Criptografia para Iniciantes, e Criptografia e Segurança de Redes.

Agora que já mostramos o básico sobre o que é criptografia, onde usar, e porque usar, vamos por a mão na massa e mostrar a vocês como encriptar arquivos do computador utilizando software livre (True Crypt), e como criptografar strings em uma aplicação C# (C Sharp).


sábado, 23 de fevereiro de 2013

Notebook Panther 5 SE - Sonho de Consumo

Vou inaugurar a minha postagem nesse novo Blog falando de um assunto que sempre me agradou, e que com certeza será o sonho do consumo de muitas pessoas. Falarei de um notebook (ou melhor o Notebook) da empresa EUROCOM.

Sabemos que um notebook é tipicamente utilizado para trabalhos do dia-a-dia, jogar, ou fazer tarefas simples, mas o Notebook Panther 5 Server Edition, como o nome já sugere, é um equipamento de alta capacidade de processamento, e sua função é ser um servidor portátil.

Com a opção de já vir com Windows Server 2012, e com o peso aproximado de 5 kgs, ele já vem pronto para atender as necessidades de servidores que precisam de mobilidade. Tudo bem se você não quiser utiliza-lo como servidor, ele tem opções de já vir instalado e com licença (OEM) de Windows 7 Professional e Ultimate, e Windows 8 Professional.

O Panther 5 SE conta com um processador Intel Xeon E5 de 6 (seis) ou 8 (oito) núcleos, e até 32 Gb de memória RAM (DDR3-1600). Com relação ao armazenamento, ele tem suporte até 4 Tb (podem ser configurados em RAID 0, 1, 5 e 10) para HDs ou SSDs de 2,5 polegadas. O equipamento conta ainda com uma interface Ethernet (LAN) de 1 Gigabit, sendo expansivo para fibra ótica ou outros conectores por meio de um Express Card. Além disso ele ainda conta com USB (2.0, e 3.0), DVI e HDMI.

Você já pode ter tudo isso desembolsando um valor que parte dos U$ 3.000,00. Pode parecer um valor alto para quem não trabalha com isso, ou não entende todo o poder de processamento, mas uma boa forma de se justificar o valor é a sua mobilidade. Você pode configurar o seu Panther 5 SE direto pelo site da EUROCOM.

Como iniciei o post dizendo, esse seria o sonho de consumo de muitas pessoas, e claro, me incluo nessa lista.

Notebook Phanter 5 SE