terça-feira, 21 de maio de 2013

Removendo programas indesejados do seu browser

No último artigo falei sobre como evitar a instalação de programas indesejados como barra de tarefas em seu navegador. Neste falarei sobre como remover esses programas, caso já tenham sido instalados. Para testar e demonstrar instalei um programa clicando em sim para todos os programas que pediam pra instalar. Espero que eu não me arrependa. :(

Pra começar, só pra terem uma ideia segue uma imagem do meu browser depois da instalação. Circulei ou marquei em vermelho os pontos que indicam os softwares adicionais instalados:


Mostrarei como remover esses softwares e configurações no Chrome e no Internet Explorer, mas em outros browers o processo é semelhante. Sugiro, porém, que você utilize o Chrome, pois além de, na minha opinião, ser mais fácil de usar e ter uma interface mais limpa que o IE, é mais fácil de remover os complementos.

Complementos de navegador

Um complemento é uma ferramenta que é adicionada ao seu navegador para executar alguma tarefa adicional. Alguns complementos podem até ser úteis, mas esses instalados automaticamente geralmente só substituem o mecanismo de busca, mostram propagando ou recolhem informações do seu computador. Felizmente, os navegadores atuais fornecem um meio fácil de remover esses complementos. No Chrome( ), clique no botão com 3 faixas localizado no canto superior direito do navegador. No menu que aparecerá vá na opção "Configurações", como mostra a figura ao lado. 
Ao clicar no item Configurações, aparecerá a tela abaixo. No lado esquerdo, há uma lista de opções, entre elas a opção "Extensões". Ao clicar nessa opção será exibida uma lista das extensões. É aí que estão os principais programas instalados indevidamente. Para cada extensão você tem duas opções: Desativar ou Remover. A primeira, acionada clicando no campo "Ativada", para desmarcar, desativa a extensão mas não a remove, permitindo ativá-la novamente se necessário. Essa opção é interessante no caso de você não ter certeza se a extensão deve ou não ser removida. Desative-a, e se perceber que a extensão era algo que você realmente utilizava, é só reativar. 
A segunda opção, acionada clicando no ícone de lixeira, remove a extensão permanentemente do navegador. É o ideal para quando se tem certeza que a extensão é indesejada.



No IE (Internet Explorer) (), o procedimento é semelhante, mas com algumas diferenças. O botão para acionar o menu, está na mesma posição que no chrome, mas o ícone é uma engrenagem, e o item de menu é "Gerenciar Complementos".
A tela que irá aparecer irá listar os complementos e você poderá desabilitar os complementos que quiser. Basta clicar no complemento e clicar na opção desabilitar que aparecerá na parte de baixo da tela. No teste que eu fiz, alguns complementos eu não consegui desabilitar, mas há uma forma de remover o complemento, que falarei adiante. 

Configurações

Além de instalar esses complementos, esses programas costumam alterar algumas configurações básicas do navegador, como a página inicial (página que é aberta assim que se abre o navegador), e os mecanismos de pesquisa (site de busca usado quando se pesquisa um termo direto pelo barra de endereços do browser. Para restaurar essas opções no Chrome, vá na mesma opção "Configurações", mas dessa vez a página é a inicial, "Configurações":
 A primeira opção destacada na página anterior permite escolher a página inicial. Você pode escolher abrir a página Nova guia, do Chrome, que mostra os últimos sites visitados, ou escolher uma página específica. Muitos programas mudam a página inicial para a página do programa.
Na opção de pesquisa, você pode escolher qual site de busca será utilizado quando pesquisar um termo usando a barra de endereços do Chrome. Sugiro que escolha o Google, pois atualmente não vejo um mecanismo de pesquisa que consiga concorrer com ele. No botão "Gerenciar mecanismos de pesquisa..." é possível até excluir os demais mecanismos da lista.

No IE, use o mesmo botão com ícone de engrenagem, mas vá no item "Opções da Internet". Na primeira página ("Geral"), haverá a opção home page. Na imagem ao lado, você pode ver que a página inicial foi alterada para a da Ask toolbar. Coloque aqui a página que deseja usar de página inicial (Ex: www.google.com.br) e clique em OK.
Para alterar o mecanismos de pesquisa no IE, vá na opção "Gerenciar Complementos" (Veja como um pouco acima no artigo). Lá há uma opção "Provedores de pesquisa". Antes de desabilitar o provedor atual, é preciso definir um novo provedor de pesquisa padrão. Selecione o provedor desejado e clique em "Definir como padrão". Em seguida, clique no outro mecanismo de pesquisa e clique em remover.

Desinstalando os programas

Após executar os comandos acima, será necessário mais um passo para remover completamente os programas. Clique no botão iniciar do Windows, e vá ao Painel de controle. Dependendo da versão do seu windows, aparecerá um ícone "Adicionar ou Remover programas". Se aparecer um campo para digitação no canto superior direito da tela escrito "Pesquisar Painel de Controle", digite "Remover programas". Um dos primeiros resultados que aparecer será "Adicionar ou remover programa". Clique nessa opção.
A tela pode ser usada para remover um programa qualquer do programa, não apenas esses complementos. Talvez a lista de programas demore um pouco para exibir todos os itens. Selecione o programa que deseja remover (cuidado para não remover o programa errado). Uma dica é anotar os nomes dos complementos nas etapas anteriores para encontrá-los aqui. Após selecionar o programa, clique na opção "Desinstalar" e siga os passos na tela. Geralmente é só clicar em "Avançar" ou "Next" até o término da desinstalação.
Segue alguns exemplos de programas que podem ser removidos: 
  • DealPly
  • Ask Toolbar
  • FindLyrics
  • Hotspot Shield 2.84

Termino o artigo por aqui, espero que essas instruções possa te ajudar. Qualquer dúvida ou comentário, deixe uma mensagem nos comentários que tentarei ajudar. Seria legal também colocarem uma lista de nomes de complementos como o que citei acima, que atualizo o artigo com a nova lista. 



sexta-feira, 15 de fevereiro de 2013

Dicas para a Internet - Instalação de programas (Parte 1)

Estou escrevendo esse artigo pois sempre que vejo o computador de alguém que não tem muita experiência com Internet, está cheio de programas estranhos, barras de ferramentas e outras coisas, baixadas muitas vezes sem saber ao se instalar algum programa de internet. Sempre dou umas dicas para a pessoa, de como evitar isso, então achei melhor unir essas dicas nesse artigo. A idéia original era escrever um artigo com várias dicas, mas a primeira delas já ficou grande o suficiente para um artigo sozinho, então acho que vou escrever uma série de artigos, fica mais fácil de ler do que tudo acumulado em um só.

Essa ainda não é uma tentativa de ressuscitar meu blog. Este costumava ser um blog de programação que tentei fazer. Não passou de umas poucas postagens, mas pretendo retomá-lo algum dia. Estou usando ele apenas por ser uma ferramenta mais adequada para distribuir esse artigo. Pelo menos é melhor que passar um arquivo do PowerPoint, não?

A primeira dica diz respeito à instalação de programas gratuitos baixados da Internet. A maioria desses programas são gratuitos porque estão associados a algum patrocinador, que instala junto com os programas alguma barra de ferramenta ou até mesmo muda a página de busca do navegador. Essas modificações são opcionais, mas estão marcadas por padrão, ou seja, se o usuário não desmarcar, serão instaladas.

Para dar um exemplo, baixei um programa chamado "aTube Catcher". É um programa que baixa um vídeo do Youtube para um arquivo no seu computador. O programa até é bom, mas é preciso tomar cuidado ao instalar. Logo nas primeiras telas do instalador aparece isso:




Como você pode ver, o programa oferece duas "opções de instação", mas na verdade a primeira instala um desses programinhas que citei. Veja o que diz o texto, traduzido para o português:

Instalação padrão
Iminent - Faça o download de milhares de smileys divertidos, animações e jogos para redes sociais e programas de mensagem instantânea. Personalize sua HomePage com o "Iminent SearchTheWeb". Obtenha novos conteúdos semanais graças à publicidade nas páginas que você navega."
Ou seja, esse programa muda sua HomePage (A página que abre quando você inicia seu navegador), muda a página de pesquisa, de forma que quando você usar a função de pesquisa do navegador, ao invés de pesquisar no google, irá pesquisar no site deles. E ainda adiciona uma barra de ferramentas que ficará mostrando propaganda para você. Nem preciso dizer que é melhor não instalar essa opção. Clique no botão "Custom Installation" (Instalação personalizada) então, e foi isso que me apareceu:

Não irei traduzir cada opção, mas as opções são o que foi dito no texto anterior: Instalar a toolbar, mudar a página inicial e mudar o mecanismo de pesquisa. Desmarquei todas as opções. O programa ainda me mostra mais uma tela de confirmação (Esse programa é chato, hein? ) :
O que a mensagem diz é, em uma tradução bem meia boca, que o "Iminent Toolbar" é um aplicativo muito legal .. bla bla. " O Importante é a última mensagem: "Click OK to install the Iminent Toolbar", ou seja, se você clicar em OK, IRÁ instalar a Toolbar. Cliquei em Cancelar.

Achei que tinha terminado, e finalmente ia instalar o programa que eu queria, mas qual foi a minha surpresa quando me aparece outra tela:



Não sei falar Italiano, mas acredito que é só desmarcar a opção que marquei em vermelho para não instalar esse programa também.

Depois que desmarquei esse, parece que finalmente instalou o programa que eu queria. Começou a copiar os arquivos e instalar...Oops, Mais uma :


Bom, nem preciso dizer, né? Demarque tudo. Em seguida apareceu mais uma tela, mas não vou colocar aqui, o procedimento é o mesmo, desmarque todas as opções.

Viram? Se eu não tivesse me atentado, ia instalar uma batelada de programas indesejados no meu computador. Esses programas não são vírus, mas também não servem pra nada, e podem deixar seu computador mais lento, além de ficar mostrando um monte de propagando inútil. Sinceramente, a minha vontade era de desistir de instalar o programa, já estava me enchendo.

A mensagem final é: você até pode baixar programas e instalá-los, mas cuidado ao instalar. Fique de olho nessas opções. Se você não sabe inglês, é só desmarcar as opções , principalmente se tiverem a palavra "toolbar" nelas. Pergunte a alguém que saiba, ou até mesmo use o Google translator.

No próximo artigo vou mostrar como identificar se esses programas já estão instalados no seu computador, e como removê-los.


quarta-feira, 6 de fevereiro de 2008

[Off-Topic] Português correto

Eu sei que português e gramática eram matérias chatas na escola (pelo menos eu achava..rs), e que ficar estudando todas aquelas regras de ortografia era chato pra caramba, mas escrever corretamente é fundamental.

Sim, esse blog é de programação, mas resolvi escrever sobre isso pois, de vez em quando, nos fóruns e grupos de discussão que participo vejo mensagens como essa :

"Pessoal meu projeto sumiu tudo que tinha nele de visual ficando com essatela em todos mas compila e roda beleza sem problemas mas se preciso alteraralguma form nao da"


Se o autor da mensagem ler esse post, por favor, não se ofenda. Veja como uma crítica construtiva, ok? :) se você tivesse escrito melhor, poderia ter obtido mais respostas. E não estou me referindo apenas à sua mensagem, usei-a como exemplo, mas esse tipo de problema é bem comum na internet.

Depois de ler algumas vezes, até entendi alguma coisa, mas qualquer um com menos paciência vai descartar o email na primeira leitura, e quem mandou a mensagem vai ficar sem ajuda.

Não é preciso usar uma linguagem rebuscada, mas alguns cuidados com o texto podem melhorar o entendimento de quem lê, e no caso de uma mensagem em um fórum, fazer com que você obtenha ajuda mais facilmente. Vou deixar três dicas que podem ajudar.

  • Use pontuação. Em um texto muito grande, sem vírgulas nem ponto, não dá pra entender nada. Fica parecendo aquelas mulheres de alguns filmes que falam chorando e sem nenhum pausa e você não entende nada :).
  • Não escreva como você fala. Quando você está falando, existem uma série de fatores que não estão presentes na escrita, como entonaçao da voz, pausas e tons irônicos. No texto escrito, deve se escrever de forma que seu leitor o entenda.
  • Leia seu texto. Muitos erros e problemas podem ser corrigidos apenas com uma leitura do que você escreveu.

quarta-feira, 23 de janeiro de 2008

Enviar email pelo .Net

No framework 2.0 para cima, você pode usar a classe SmtpClient para enviar um email em sua aplicação. Veja o código abaixo:

// Cria o cliente Smtp passando o endereço e porta do host
SmtpClient client = new SmtpClient();
client.Host = "smtp.seusitedeemail.com.br";
client.Port = 25;


// Passa o usuário e a senha se o servidor SMTP requer autenticação
client.Credentials = new NetworkCredential("usuario", "senha");



// Cria a mensagem a ser enviada
MailMessage msg = new MailMessage();
msg.From = new MailAddress("fulano@email.com.br", "Fulano");
msg.To.Add(new MailAddress("email1@provedor.com.br", "Destinatário 1");
msg.To.Add(new MailAddress("email2@provedor.com.br", "Destinatário 2");


msg.Subject = "Assunto da mensagem";
msg.Body = "Corpo da mensagem";



client.Send(msg);




P.S: Se estiver usando o framework 1.1, tente esse link :

http://msdn2.microsoft.com/en-us/library/system.web.mail.smtpmail(VS.71).aspx

Nunca usei essa classe, mas parece atender às necessidades.




sábado, 19 de janeiro de 2008

DataReader vs Dataset

Lá vai eu mais uma vez tentar ressuscitar esse blog. Vamos ver se dessa vez eu consigo :)

Um tema clássico em artigos sobre .Net é a rapidez do DataReader em comparação com o Dataset carregado por um DataAdapter. Isso realmente é verdade, mas não significa que você deva substituir todos os Datasets de sua aplicação por datareaders. Dependendo da forma que está utilizando o DataReader, ele pode ter a mesma performance que um DataSet*.

Primeiro é preciso entender porquê o DataReader é mais rápido que um DataSet*. A vantagem do DataReader consiste no fato de não precisar carregar todo o conteúdo da tabela em memória, e de retornar os registros à medida que são disponibilizados pelo banco.

Quando se usa o DataSet*, todos os registros retornados são carregados em memória, para depois serem processados. Já o DataReader carrega na memória apenas o registro atual, diminuindo assim os custos de memória da aplicação. Dessa forma, porém, não é possível acessar registros anteriores.

Outra vantagem é que o DataReader retorna os registros coforme forem sendo disponibilizado pelo banco, enquanto o DataSet aguarda o término da execução da procedure para prosseguir a execução, ou seja, a aplicação ficará parada enquanto isso.

Entretando, se você estiver usando o DataReader para ler todos os registros do banco e carregá-los na memória (Que é exatamente o que o DataAdapter faz, pois ele usa um DataReader) para então processá-los, estará anulando as duas vantagens do DataReader. Nesse caso seria melhor usar um DataSet, que teria a mesma performance e requeriria menos código.

Ou seja, um DataReader só será vantajoso se você carregar na memória apenas um registro de cada vez, e processar os registros um a um, conforme os ler do DataReader.

* - Sempre que eu mencionar o DataSet nesse artigo, como em "performance do DataSet", entenda que estou falando não só do DataSet, mas do processo de usar um DataAdapter para carregar os registros do banco em um DataSet.

sexta-feira, 14 de setembro de 2007

Um Try..catch em cada método

Muitos desenvolvedores acham que o ideal é colocar um try...catch em todo método. É comum ver blocos assim :

try
{
{Código}
}
catch(Exception ex)
{
throw ex;
}

No exemplo acima, o try .. catch é inútil, pois o efeito seria exatamento o mesmo, caso não se usasse try.. catch. Nos dois casos, quando um erro ocorresse, esse erro seria lançado para o método superior, a diferença no caso do exemplo acima é que o erro seria lançado duas vezes, uma na origem do erro e outra no comando throw ex.

A própria Microsoft recomenda que o catch seja utilizado apenas quando alguma coisa for feita com a exceção, ou seja, quando a presença do try..catch fizer alguma diferença. Caso contrário será uma sobrecarga desnessária.

Concordo que seja necessário tratar todos os erros, mas isso não precisa ser feito em todas as funções, se você tratar o erro nas funções principais, os erros das subrotinas também serão capturados.

segunda-feira, 27 de agosto de 2007

Classe ReadOnlyCollection

Recentemente tive um problema que outros já podem ter tido.

Tinha uma classe com uma coleção (List<>) private que queria disponibilizar, mas queria que quem utilizasse a classe pudesse apenas ler o conteúdo da lista, sem alterá-la. Se eu simplesmente colocasse uma propriedade pública com a lista, ia permitir que alguém adicionasse ou removesse elementos dela.

Entre outras soluções que pensei para isso, descobri uma classe que ajuda bastante. A ReadOnlyCollection. Ela é na verdade um Wrapper para uma coleção. Vamos supor que você tem uma lista de string na sua classe:

private List _linhas;

Para publicá-la como somente leitura , use :

public ReadOnlyCollection Linhas
{
get { return new ReadOnlyCollection (_linhas); }
}

Vale lembrar que esse método não duplica o conteúdo da lista. Como a classe é apenas um wrapper, qualquer alteração no conteúdo da lista será refletida no objeto ReadOnlyCollection já criado.

Classe ControlPaint

Uma classe interessante para quem está trabalhando com controles Owner Draw, ou seja, desenhando na mão o conteúdo do controle, é a ControlPaint.

Ela possui métodos para facilitar o desenho de controles, como o método DrawBorder3D (Acho que não preciso dizer que esse método desenha uma borda em 3D) e métodos para desenhar botões, checkboxes etc.

sexta-feira, 17 de agosto de 2007

Breakpoints Avançados

O tradicional Breakpoint, usado para interromper a execução do sistema e permitir a depuração do sistema possui algumas opções que podem ajudar bastante.

Você já teve que depurar algum loop e ficar apertando F10 até chegar na iteração que está dando problema? Você pode configurar o breakpoint para interromper a execução somente na n-ésima vez que passar por ele. Para isso, clique com o botão direito em um breakpoint existente (Clique na bolinha vermelha) e vá em "Hit Count...". Existem algumas opções para parada, uma pra parar quando o número de passados pelo breakpoint atingir um determinado valor ou for múltiplo de um determinado número , por exemplo.

Outra opção interessante é "Condition..." , acessada do mesmo popup menu, que permite que estabeleça um condição para que o Breakpoint pare. Você pode, por exemplo, fazer com que o breakpoint pare quando um totalizador atingir determinado valor, colocando uma expressão como "total > 100". A idéia é que se a expressão que você colocar for True, o Breakpoint será interrompido.

terça-feira, 14 de agosto de 2007

Uma outra forma de TypeCasting.

Provavelmente você já fez um TypeCasting, como o da linha abaixo:

DataSet ds = (DataSet) dataGridView1.DataSource;

Na forma acima, se o valor que está sendo convertido, no caso o dataGridView1.DataSource, for nulo ou não for um DataSet, será gerado um erro. Você teria que fazer um tratamento antes de efetuar o cast, usando o operador is para verificar se é realmente do tipo esperado:

if (dataGridView1.DataSource != null && dataGridView1.DataSource is DataSet)
{
DataSet ds = (DataSet) dataGridView1.DataSource;
}

Uma outra forma é fazer o cast com o operador as. Com esse operador, se o valor convertido for nulo ou não for do tipo esperado, será retornado nulo. Com isso, o código acima poderia ser escrito assim:

DataSet ds = dataGridView1 as DataSet;
if (ds != null)
...

Além disso, por não usar parenteses, pode deixar a sintaxe um pouco mais limpa, como no exemplo abaixo:

DataTable tbl = ((DataSet) dataGridView1.DataSource).Tables[0];

poderia ser representada com um conjunto de parênteses a menos usando o as :

DataTable tbl = (dataGridView1.DataSource as DataSet).Tables[0];

segunda-feira, 13 de agosto de 2007

Combo Box Somente Leitura

Quem programa em windows já deve ter se deparado com um situação onde precisava colocar uma ComboBox em modo somente leitura. No .Net não existe a propriedade ReadOnly na ComboBox. Creio que isso seja uma limitação do próprio windows, pois acontecia a mesma coisa no Delphi.

Uma solução normalmente adotada é deixar a combo desabilitada, o que não é muito bom, pois dessa forma o usuário não consegue navegar no controle com o Tab nem selecionar um texto para copiar.

Uma sugestão seria ao invés de desabilitar a combo , trocá-la por uma TextBox ReadOnly enquanto o usuário não puder alterar o valor. Quando habilitar o campo novamente para o usuário, retorna a ComboBox.

É , eu sei, é uma gambiarra, mas o resultado final é melhor (pelo menos para o usuário) do que simplesmente desabilitar.

segunda-feira, 6 de agosto de 2007

Escondendo uma TabPage de um TabControl

Se você desenvolve em Windows Forms, já deve ter passado por alguma situação onde era necessário esconder algumas páginas de um controles TabControl de acordo com a situação. O problema é que o TabControl não possui um método que permita apenas esconder as páginas. Será necessário removê-la no controle:

TabControl1.TabPages.Remove(tabPage1);

e para adicioná-la novamente :

TabControl1.TabPages.Add(tabPage1);

sexta-feira, 3 de agosto de 2007

BitConverter

Outra classe interessante que descobri recentemente foi a BitConverter. Quem já teve que trabalhar com classes Stream , para gravar ou ler um arquivo, por exemplo, já deve ter notado que os métodos para gravar e ler os dados trabalham com Array de byte. A classe BitConverter serve para converter valores primitivos, como int e boolean, de e para byte[].
Para converter um valor qualquer para byte[], use o método BitConverter.GetBytes(valor), e para o caminho contrário, use os métodos específicos, como BitConverter.ToInt32(byteArray).

Já se você tiver uma string e precisar converter de e para um array de byte, pode usar a classe Encoding. Aí vai depender se a string está em ASCII, UTF8, Unicode etc. Para converter de string para byte[], use Encoding.UTF8.GetBytes("String"), e para o caminho inverso, use Encoding.UTF8.GetString(byteArray). É só substituir o UTF8 pelo encoding apropriado.

quarta-feira, 13 de junho de 2007

Compilação Condicional - Modo Debug e Modo Release.

Quando você compila sua aplicação tem duas opções, compilar em modo debug ou modo release (Caso não saiba, essa opção fica ao lado do botão Start Debuggin, o "play").

A idéia é compilar em modo debug enquanto estiver desenvolvendo e depurando a aplicação, e em modo release quando for colocar o aplicativo em produção , pois para depurar o executável, o compilador precisa embutir nele algumas informações extras, como nome do arquivo fonte e número da linha. Como você dificilmente irá depurar diretamente o aplicativo em produção, essas informações podem ser removidas para otimizar o aplicativo.

Além dessa otimização que o próprio compilador faz, o próprio programador pode especificar uma determinada parte do código que só será executada em um modo específico. Por exemplo, você quer escrever uma rotina de tratamento de erros que não mostre a mensagem de erro original para o usuário, pode fazer algo do tipo:

try
{
// Código
}
catch(Exception ex)
{
#if DEBUG
MessageBox.Show(ex.Message);
#else
MessageBox.Show("Ocorreu um erro no sistema!");
#endif
}

No código acima , o primeiro comando MessageBox será executado se o programa for compilado em modo DEBUG, e o segundo se a aplicação for compilada em modo Release.

Além disse, você pode usar o Atributo Conditional para excluir uma determinada função do modo release. Se você declarar uma função dessa forma :


[System.Diagnostics.Conditional("DEBUG")]
private void Funcao()

Essa função só será considerada se estiver em modo DEBUG, caso contrário , será ignorada. A vantagem nesse caso, é que você não precisa alterar os pontos do códigos que chamam a função, somente a própria função.

terça-feira, 12 de junho de 2007

Stopwatch

Existe uma classe simples mas útil no namespace System.Diagnostics chamada Stopwatch. Essa classe simula um cronômetro e pode ser usada, por exemplo, para medir o tempo gasto por determinada operação. Por exemplo, você quer saber quanto tempo determinada função está demorando para executar, pode fazer isso:

Stopwatch sw = new Stopwatch();
sw.Start();
OperacaoDemorada();
sw.Stop();
Debug.WriteLine("Tempo gasto : " + sw.ElapsedMilliseconds.ToString() + " ms");


O código acima irá mostrar o tempo gasto em milisegundos, mas a classe também possui a propriedade Elapsed, que retorna um TimeSpan, permitindo a obtenção do tempo na unidade que você quiser.

domingo, 3 de junho de 2007

Acessando uma classe .Net via COM

A frequência de atualização desse blog tem sido baixa, mas ele ainda vive...rs. Vou tentar atualizá-lo com mais frequência. Dica: Para você saber quando há uma atualização, utilize um leitor RSS, como o FeedReader: http://www.feedreader.com/

Agora ao artigo.

Quem já trabalhou com ASP ou VB (os antigos, não-.Net), provavelmente já usou um comando como esse:
set obj = CreateObject("Dundas.Upload")
Deixando erros de sintaxe de lado (Escrevi só como exemplo, vai), esse comando permite criar objetos COM para acessar em sua aplicação. Você sabia que é possível chamar uma classe .NET dessa forma?

A vantagem é que com isso é possível acessar uma dll em .Net de uma aplicação ASP tradicional, VB 6 ou qualquer outra plataforma que suporte COM. Isso pode facilitar a transição parcial de um sistema para a plataforma .Net.

Passarei aqui as instruções para o Visual Studio 2005, mas isso também é possível no 2003. Em primeiro lugar é necessário adicionar uma strong name key ao seu projeto. Caso não saiba como fazer isso, procure por Strong Name Key no google que deve achar bastante coisa sobre o assunto. Também é necessário que todas as DLLs às quais a sua faça referência tenham um strong name key. Agora é só compilar e registrar a DLL.

Para registrá-la, use o utilitário de linha de comando Regasm.exe , com a seguinte sintaxe :
RegAsm.exe NomeDoArquivo.dll /tlb /codebase
Não sei te dizer exatamente o que fazem os parâmetro /tlb e /codebase, mas sei que sem eles não funciona :P (Quem souber e quiser explicar, fique a vontade e poste um comentário. ;) ). Como qualquer outro utilitário do .Net, o RegAsm.exe está na pasta do framework (e pode ser acessado diretamente se utilizado o atalho para o prompt de comando criado pelo visual studio no menu iniciar).

Após registrada a DLL, é só acessá-la do ASP ou VB como se fosse um objeto COM. Na string de identificação da classe, use o namespace seguido do nome da classe. No exemplo abaixo , está sendo chamada a classe TesteCOM do namespace Br1.Library.Teste:
set obj = CreateObject("Br1.Library.Teste.TesteCOM").

Algumas observações importantes:
  • Isso obviamente não elimina a necessidade do Framework, ele deve estar instalado na máquina onde o objeto COM for executado.
  • A DLL chamará as outras como qualquer objeto .Net, então as dlls às quais ela faz referência devem estar ou no mesmo diretório ou no GAC.
  • Só consegui fazer funcionar a DLL com tipos primitivos nos parâmetros e retorno. Internamente podem ser usadas classes e structs sem problema, mas a função que será chamada externamente só poder receber e retornar tipos primitivos, como string ou int.
  • Como qualquer objeto COM, depois da primeira chamada, a DLL vai estar carregada na memória. Portanto, para substituir a DLL pode ser necessário reiniciar o ISS. Sugiro registrar a DLL de outro local, para não dar erro quando o VS não conseguir compilá-la devido à dll em bin\debug estar em uso. Sugiro criar um .BAT para a atualização, com os seguintes passos:
  1. Reiniciar o iis (use o iisreset.exe)
  2. Desregistrar a DLL com o comando : Regasm.exe NomeDoArquivo.dll /unregister
  3. Excluir os arquivos .DLL e .PDB do diretório de registro.
  4. Copiar os arquivos .DLL e .PDB do diretório bin\debug (ou bin\release, se preferir)
  5. Registrar a DLL novamente com o comando que já passei.

Essa abordagem pode ser bem interessante para ir convertendo aos poucos um sistema para .Net, ou então para incrementar um sistema já existente.

quarta-feira, 30 de maio de 2007

[Off-Topic] Microsoft Surface

Não é relacionado com programação diretamente, mas aposto que vão gostar. É um futuro produto da microsoft que parece ser muito interessante. Um computador cuja tela fica na horizontal , como uma mesa, por exemplo, e é controlado totalmente por touchscreen.

Para copiar músicas para um Mp3 player , por exemplo, coloca-se o aparelho em cima da tela e arrasta-se as músicas para ele. Fica bem melhor vendo, Assistam os vídeos.

http://www.microsoft.com/surface/

sábado, 12 de maio de 2007

Tratamento de erros: Tratando e registrando erros

Nesse artigo vou falar sobre o tratamento de erros e registro dos mesmos. Anteriormente escrevi outros artigos sobre o object Exception e o tratamento de erros no .Net :

http://br1dev.blogspot.com/2007/04/tratamento-de-erros-objeto-exception.html
http://br1dev.blogspot.com/2007/04/tratamento-de-erros-objeto-exception_10.html
http://br1dev.blogspot.com/2007/04/tratamento-de-erros-objeto-exception_16.html

Agora vamos ao artigo:

Um fator que melhora a confiabilidade da sua aplicação é a maneira com ela trata os erros que ocorrem durante sua execução. É claro que o ideal é evitar o máximo possível que erros ocorram, mas é necessário que a aplicação se recupere adequadamente quando um erro ocorrer. Achar que sua aplicação está segura e não terá erros, e por isso abrir mão de um tratamento adequado, pode expor sua aplicaçõe a riscos de segurança e integridade da aplicação.

Sempre que um erro ocorrer na aplicação, são importantes os seguintes procedimentos:


  • Recuperar o sistema - Sempre que possível, o sistema deve retornar ao estado em que estava antes da execução da operação que gerou o erro. Um exemplo clássico disso. Você confirma o recebimento de uma pedido de venda. A operação atualiza o estoque , mas quando tenta alterar o status do pedido , ocorre um erro. Se o estoque não for retornado ao estado anterior, o usuário pode tentar repetir a operação (Afinal , para ele houve um erro e a operação não foi concluída) e o estoque será alterado novamente, ficando com valores errados.
  • Informar o usuário - Evite esconder um erro, não mostrando ao usuário que houve um erro. Exceto em casos específicos, é sempre importante avisar o usuário que o sistema não se comportou da forma esperada, para que ele possa corrigir o problema ou pelos contatar o suporte. Entretanto, uma mensagem do tipo "Object reference not set to an instance of an object" não ajuda em nada o usuário. O ideal é mostrar ao usuário uma mensagem padrão, do tipo "Ocorreu um erro no sistema, contato o suporte técnico etc.", ou então alguma coisa que realmente o ajude a solucionar o problema.
  • Registrar o erro - Se por um lado não é interessante mostrar ao usuário detalhes do erro, também não é uma boa ignorar esses detalhes por completo. O ideal é registrar a mensagem original do erro, e todos os outros detalhes possíveis a fim de auxiliar a correção do erro pelos desenvolvedores. Devem ser registradas informações como a pilha de chamadas, que mostra toda a cadeia de chamada de métodos até chegar no local do erro, o nome do erro (ArgumentException, por exemplo) e quaisquer outras informações que estejam disponíveis. Você sabia que com o objeto SQLExcetion é possível obter as mesmas informações que aparecem quando você executa a procedure ou comando no Query Analyzer?. Outra informação importante é a InnerException. No terceiro artigo que mencionei no começa desse post falo mais sobre ela. Para registrar o erro você poderia gravar em um arquivo texto, um arquivo XML, enviar por email ou gravar em um banco de dados. O importante é escolher o mecanismo que torne mais fácil o acesso a essas informações.

Pra finalizar, você poderia tornar esse tratamento mais fácil criando uma função que recebe o objeto Exception e faça o registro e exibição da mensagem referente ao mesmo. Aí, é só chamar a função em todo bloco catch da aplicação.

quinta-feira, 3 de maio de 2007

[Off-Topic] Google AdSense

Esperava mais do Google AdSense. Achei que ele mostrava propagandas que tivessem relação com o conteúdo do site, mas no meu blog só tá mostrando anúncios para se livrar do alcoolismo e propagandas de Fossas Sépticas! :

Começando em .Net e C#

Desculpem pela demora na postagem, as coisas estão meio corridas pra mim ultimamente.

De vez em quando vejo emails em listas de discussão, ou mesmo alguém me pergunta como começar no .Net . Resolvi então colocar algumas instruções .

Em primeiro lugar, o .Net fornece uma estrutura para o desenvolvimento e execução de aplicações gerenciadas. Gerenciada porque durante a execução da aplicação, o framework controla alguns recursos que a aplicação utiliza, como conexão com o banco de dados e memória utilizada.

Aplicações para esse framework podem ser criadas em diversas linguagens, sendo as principais, que são suportadas pela Microsoft são o C# e o VB.Net. A diferença entre essas duas linguagens é apenas na sintaxe. Todos os recursos do Framework estão disponíveis para qualquer linguagem, então escolha a que melhor agradar. Minha sugestão, aprenda as duas. Não é algo difícil, afinal a base é a mesma, e você terá muito mais flexibilidade profissionalmente.

O Importante então, é aprender o framework, sua estrutua principal.

Um bom lugar pra começar é Programa Desenvolvedor 5 estrelas. Esse programa consiste em uma série de treinamentos, na forma de apresentações com narração, que você pode baixar e estudar. São 3 estrelas principais (as duas últimas se referem à certificação). Cada nível possui um grau diferente de dificuldade e possuem provas online para se certificar que você assimilou o conteúdo do nível (não vale colar, hein :) ) . Acho que não preciso dizer que o ideal é começar do nível 1, e quando tiver dominado os conceitos apresentados, partir para o nível seguinte.
Endereço : http://www.msdnbrasil.com.br/cinco_estrelas/#Treinamento

Depois de ter estudado o programa acima, dê uma olhada no link abaixo, que possui alguns tutoriais interessantes para quem está começando. Ou mesmo para quem já conhece alguma coisa e quer saber algo mais sobre Datagrids, por exemplo.
Endereço : http://www.microsoft.com/brasil/msdn/Tutoriais/default.mspx

Quando estiver um pouco mais experientes, dê uma olhada nos Webcasts da microsoft. Para quem não sabe, webcast é uma apresentação online, onde você além de assitir a apresentação de slides, ouve o apresentador falando e, pelo menos em alguns casos, pode fazer perguntas a ele. Além disso, depois da realização do webcast, você pode fazer o download da apresentação para assistir depois . Claro que nesse caso não vai conseguir perguntar, a não ser que mande um email pro cara. :)
Endereço : http://www.microsoft.com/brasil/msdn/Eventos/Webcasts.mspx

Bom, é isso. Claro que há muito mais material disponível, mas com esses já dá para ser introduzido (sem duplo sentido, por favor) no mundo .Net. É importante que durante seu estudo, na medida do possível, você ponha a mão na massa. Crie programas que apliquem o que você estudou, assim irá fixar e aprender bem melhor.

E sempre haverá o Google ;)
Endereço: Precisa? Tá bom : http://www.google.com.br