Arquivo | Editar | Sobre...        

Rodrigo Strauss :::: WebLog


Depois da praia, vamos nos purificar

No meu post de sexta-feita, eu usei o parâmetro de linha de comando "/clr:pure" para compilar o meu "Eu gostaria de estar na praia" (convenhamos que é melhor do que Hello World...). Agora que eu terminei de baixar o .NET Framwork SDK 2.0, usei o ildasm para verificar o código gerado. Olha o que temos:

Reconhecemos as seções do executável e várias funções da runtime do C/C++. Isso pode deixar um programador purista triste, já que carregamos algumas coisas que são do velho Visual C++.

Agora vamos mudar o parâmetro para "/clr:safe". Olhe o que temos agora:

Agora sim, um executável .NET puro, suficiente para agradar os puristas. Lembre-se que usando "/clr:safe", não podemos usar nada que não seja seguro e verificável pela runtime. Um simples "#include <windows.h>" irá gerar milhares de erros, já que as funções e estruturas da Win32 API não são verificáveis.

Em 09/Aug/2004 17:41

Como usar o Visual C++ 2005 Express para fazer programas SUBSYSTEM:Windows

No artigo sobre WinDbg, eu disse que caso o leitor não tivesse o Visual C++, ele poderia baixar o Visual C++ 2005 Express e o Platform SDK para fazer programas Windows. Agora eu vou explicar os passos necessários para isso.

1. Baixe o Visual C++ Express 2005.

2. Instale o Microsoft Platform SDK via web. Instale somente o [Core SDK >> Build Environment] e o [Internet Development SDK >> Build Environment]. Infelizmente, mas infelizmente mesmo, não é possível usar o Firefox para fazer a instalação, só Internet Explorer mesmo. (igual ao novo site da MSDN brasileira... shame...).

3. Agora vamos configurar o Visual C++. Menu "Tools" >> "Options". No TreeView, "Projects And Solutions" >> "VC++ Directories". Depois, no ComboBox "Show Directories for:" insira Program Files\Microsoft SDK\include em "Include Files" e Program Files\Microsoft SDK\lib em "Library Files".

4. Reinicie o Visual C++ 2005 Express

Para testar, abra o Visual C++ e crie um novo projeto "Win32" >> "Console Application" (é isso mesmo, console application). Quando abrir a tela com as configurações do novo projeto, escolha "Windows Application". Caso você tente compilar o projeto, verá vários erros de linker, já que o projeto não está configurado para fazer link com as libs das dlls Win32.

Agora vamos arrumar o problema do linker: entre nas propriedades do projeto, "Configuration Properties" >> "Linker" >> "Input". Em "Additional Dependencies", coloque "kernel32.lib user32.lib gdi32.lib" (assim mesmo, separadas por espaços). Isso deve ser feito em todos os projetos Win32.

Pronto. Agora divirta-se!

Em 09/Aug/2004 09:53

Visual C++ 2005 Managed Extensions: o início

Hoje eu resolvi fazer minhas primeiras experiências com Managed C++ 2005, para ver se é realmente simples como eu acredito que seja. Minha primeira experiência ridícula, serve para ilustrar como a compilação é quase tão simples como C# ou VB.NET.

Código fonte
int Main() { System::String^ str; str = L"Eu queria estar na praia"; System::Console::WriteLine(str); return 0; }
A compilação
cl mcpp1.cpp /clr:pure /link /entry:"Main" /subsystem:console Microsoft (R) C/C++ Optimizing Compiler Version 14.00.40607.16 for Microsoft (R) .NET Framework version 2.00.40607.16 Copyright (C) Microsoft Corporation. All rights reserved. mcpp1.cpp Microsoft (R) Incremental Linker Version 8.00.40607.16 Copyright (C) Microsoft Corporation. All rights reserved. /out:mcpp1.exe /clrimagetype:pure /entry:Main /subsystem:console mcpp1.obj
O resultado
Eu queria estar na praia

Simples, rápido e fácil. Agora eu tenho um autêntico e legítimo executável 100% managed para ser consumido pelo .NET Framework 2.0 beta 1. Agora é só esperar terminar o download do SDK do framework 2.0, e usar o ildasm para ver se está realmente tudo OK.

Mas, na verdade, eu gostaria de estar na praia.

Em 06/Aug/2004 15:42

Depois dizem que computação é uma ciência exata

Eu ainda vivo na idade da pedra, e como tal, minha câmera fotográfica não é digital. Tirei umas fotos na semana passada e decidi tirar meu scanner da caixa para enviar algumas fotos para os amigos.

Meu scanner (que eu saiba) não tem driver para Windows XP, somente para Windows 2000. Fácil: pego a VMWare com Windows 2000 que eu uso pra fazer debug dos drivers que eu faço, instalo o scanner, software do scanner e pronto. Isso é o que eu pensava em minha vã inocência.

Subi a VMware e espetei o scanner na USB. O Windows XP reconheceu o "VMWare USB Device" e cinco segundos depois meu micro reinicia. Antes de xingar o scanner ou qualquer outra coisa, eu pensei como eu sou estúpido por não ter configurado o Windows para não reiniciar automaticamente depois de um BugCheck (tela azul) e para fazer o dump completo.

Com o micro reiniciado, configurei tudo, subi a VMware e espetei o scanner. Como esperado, tela azul de novo, e 5 minutos depois eu tinha o dump. Reiniciei o micro novamente e abri o dump no WinDbg para descobrir quem eu deveria xingar: a VMware, a Microsoft ou a Genius, fabricante do scanner.

Esperei uns 20 minutos até o WinDbg baixar os symbols para os drivers da minha máquina. Uma longa espera para alguém que só que encontrar um culpado. Consegui ver que algum driver tentou liberar memória duas vezes e disparou um BAD_POOL_CALLER. Quando vou olhar qual foi o driver que fez a besteira, tive uma infeliz surpresa: foi o firewall (Tiny Personal Firewall)...

Isso siginifica que o driver está fazendo hook do que não deve, até porque o TCPIP.SYS nem estava na pilha. Ou eu arrumo um outro firewall ou termino logo o meu...

Depois que você descobre como são feitas as salsichas, o molho de tomate e os drivers de antivírus com "real time scan", seus hábitos mudam bastante... :-)

Em 05/Aug/2004 12:06

Porque programar drivers (kernel mode) é mais legal do que programar aplicativos (user mode)
  • Você está dentro do kernel do sistema.
  • Você precisa de um bom conhecimento da arquitetura do kernel do Windows. Isso torna você um melhor programador user mode.
  • Programação em kernel mode é algo crítico. O BUILD configura o compilador C para tratar warnings como errors.
  • Você não pode errar. Um simples GPF ou divisão por zero é tela azul na hora!
  • Em kernel mode você é obrigado a usar seus conhecimentos de ciências da computação: arquitetura de computadores, listas ligadas, etc.
  • Os samples do DDK (Driver Development Kit) são mais bem organizados e mais bem comentados do que os samples de user mode. O código também é muito mais bonito. :-)
  • A API do kernel do Windows (Native API) é muita mais concisa e bem organizada do que a Win32 e algumas partes do .NET Framework.
  • Não existe programação para banco de dados em kernel mode. Nada de VB, nada de ADO.NET, nada de DataAdapter, nada de SQL, nada de fazer procedures. Praticamente o paraíso... :-)
  • Em kernel mode, você só pode usar Assembly, C ou C++. E muitos programadores pregam que você use somente C.
  • Temos ferramentas como o Driver Verifier e o Windows Checked Build para verificar se estamos fazendo tudo OK. Hoje temos o Application Verifier para user mode, mas isso é novo e quase ninguém conhece. O pessoal que programa em kernel mode (pelo menos os que sabem o que estão fazendo) usa o Driver Verifier sempre.
  • Especialização. Poucas pessoas programam em kernel mode.

Em 04/Aug/2004 21:46

C++: a linguagem mais poderosa para programação .NET

O artigo C++: The Most Powerful Language for .NET Framework Programming só ajuda a confirmar a minha opinião de que, com as novas managed extensions incluídas no Visual C++ 8.0 (Visual Studio 2005), eu nunca terei que usar outra linguagem para programar em .NET.

Continuarei com os templates, com o pré-processador, com o otimizador, com a possibilidade de usar API Win32 sem precisar usar DllImport (que é o Declare do VB6, nada mais, nada menos), possibilidade de alocar objetos na pilha, etc. Sem contar o gerenciamento de projeto, build steps, opções para configurar compilador e linker, o respeito que a Microsoft tem com programadores Visual C++, etc.

Ah, e é claro, o fato de que a integração de controle de versão (Source Safe, Clear Case) funciona com o Visual C++ e NÃO FUNCIONA com VB.NET.

Em 04/Aug/2004 10:27

Dicas para particionamento e organização do HD, parte 1

Eu tenho visto por aí muita gente com HDs gigantescos, todos com uma partição só. Apesar de isso não causar problemas no uso diário, um melhor particionamento pode ajudar bastante quem precisa de performance e organização. Por isso eu resolvi escrever alguma coisa sobre isso. Se ficar bom, talvez eu coloque mais água no feijão e tranforme isso em um artigo. (Antes eu tenho que terminar o WinDbg parte 3).

Dica 1: nunca crie somente uma partição

A primeira dica é a mais simples. Qual o motivo? Com uma partição só, fica mais difícil organizar suas coisas e mais difícil de fazer backup e seu HD fica mais fragmentado.

Crie no mínimo duas partições, uma para o sistema operacional e para os programas, e outra para os seus dados. Instale o sistema operacional e os programas que você mais usa na primeira partição e desfragmente a partição. Guarde seus dados na outra partição.

Dica 2: Mude as pastas padrão para o "Meus Documentos", "Favoritos", etc

Por padrão, o Windows coloca a pasta "My Documents" em "c:\Documents And Settings\[username]\My Documents". Isso torna infernal o processo de backup, já que se você usar xcopy para fazer backup você terá que digitar esse caminho imenso ou colocá-lo no .BAT.

Resolva o problema: baixe o TweakUI no site da Microsoft, entre em My Computer >> Special Folders e saia mudando. Mude o "My Documents" para algo como "d:\rodrigo" e "My music" para algo como "d:\mp3". Mude também a localização do "Desktop" para dentro de "My Documents", como "d:\rodrigo\desktop". Menos uma pasta separada para você lembrar na hora do backup. E a pasta do desktop é a mais fácil de esquecer na hora do backup.

Use sempre nomes fáceis para as pastas, e as coloque na partição de dados. Assim, você pode programar o backup para copiar todas essas pastas, que são mais fáceis de lembrar. Um dia você vai decidir formatar o HD, e assim ficará mais fácil lembrar o que copiar, e você terá menos medo na hora de escolher a opção "Yes, format my entire HD now!".

Dica 3: Faça backup, faça backup, faça backup, faça backup, faça backup, faça backup, faça backup

Nunca é suficiente dizer. As pessoas geralmente só lembram do backup quando alguma desgraça acontece. O backup não precisa ser em uma fita DAT com um software de milhares de dólares. Um simples arquivo RAR ou ZIP com seus arquivos mais importantes enviado para um disco virtual já resolve o problema. Você pode fazer o backup dos seus documentos uma vez por semana, e das mp3 a cada mês. O importante é que você faça isso regularmente.

Dica 4: Teste o backup!

Já vi o caso de uma empresa que fazia o backup regularmente, mas nunca testou se o backup era restaurado corretamente. Adivinhe o que aconteceu na hora de restaurar o backup? Você pode esquecer de configurar a ferramenta de backup para incluir as subpastas. Erros simples como esse se tornarão catastróficos na hora que você precisar do backup.

Futuramente...

Diferenças entre NTFS e FAT32, qual tipo usar em que caso, usando 3 ou mais partições

Em 02/Aug/2004 23:14

Iniciando o desenvolvimento básico de drivers

Pois é, o pessoal da Microsoft resolveu retirar o desenvolvimento de drivers do ostracismo. Republicaram o artigo "How to develop a Windows Driver". Um artigo bem curto, que fala o básico sobre desenvolvimento de drivers: arrumar uma cópia do DDK, usar o checked build, compilar usando o BUILD, e, é claro, certificar seu driver junto à Microsoft.

Em 31/Jul/2004 19:40

C++: O esquecido operador vírgula

Um operador que é pouco usado, mas bastante útil em C++, é o operador vírgula. Resumidamente, ele avalia todas as instruções separadas pela vírgula, mas retorna sempre a última. Olhe um exemplo:

int a, b, c; b = 2; c = 3; a = (b,c);

Nesse caso, o valor da variável a será 3.

Uma das particularidades do operador vírgula, é que ele tem a menor precedência entre todos os operadores. Vamos tirar os parênteses:

int a, b, c; b = 2; c = 3; a = b,c;

Agora o valor da variável a será 2, já que pela precedência, a = b é a primeira expressão, e c é a segunda expressão.


Usos realmente úteis

O uso mais comum para o operador vírgula é inicializar mais de uma variável em um loop, como no exemplo abaixo:

int b,c; for(int a = 10, b = 20, c = 30 ; a < 10 ; a += --b, c++) { }

Nesse caso, nós declaramos a variável a e atribuímos o valor 20 à variável b.

Outro ótimo uso do operador vírgula é para fazer validação de casts não seguros. Existem lugares onde, apesar do parâmetro ser do tipo void* ou void**, você sempre deve passar um tipo determinado. Um exemplo clássico, é a função CoCreateInstance, que tem a seguinte assinatura:

STDAPI CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID * ppv );

O último parâmetro, apesar de ser LPVOID* (ou seja, void**), espera um tipo definido. Ele quer um ponteiro para um ponteiro que possa ser convertido para IUnknown*.

Olhe o código a seguir, que tem um dos erros mais comuns em programação COM:

HRESULT hr; IUnknown* pUnk; hr = CoCreateInstance(CLSID_BLA, NULL, CLSCTX_ALL, IID_IUNKNOWN, (void**)pUnk);

Encontrou o erro? Na realidade, &pUnk deveria ser passado, e não somente pUnk como foi passado. Com isso você vai ganhar um belo GPF de presente. Como estamos usando cast C, o compilador não reclama, e nosso código é compilado sem problemas. E aqui não podemos usar static_cast, porque IUnknown** não pode ser convertido para void**.

Vamos agora a uma solução usando o operador vírgula e uma macro:

HRESULT hr; IUnknown* pUnk; // // IC = interface cast // #define IC(ppUnk) (static_cast(*ppUnk),(void**)ppUnk) hr = CoCreateInstance(CLSID_BLA, NULL, CLSCTX_ALL, IID_IUNKNOWN, IC(&pUnk));

O que fizemos aqui foi o seguinte: a macro primeiro checa se o apontado do que foi passado pode ser convertido para IUnknown*, usando static_cast. Essa primeira expressão (static_cast(*ppUnk)) vai verificar a validade do ponteiro em tempo de compilação, mas não surtirá nenhum efeito em tempo de execução. A segunda expressão ((void**)ppUnk) fará então o cast que deve ser feito para a chamada da função. Vamos agora tentar compilar com o mesmo erro do primeiro exemplo:

HRESULT hr; IUnknown* pUnk; #define IC(ppUnk) (static_cast(*ppUnk),(void**)ppUnk) hr = CoCreateInstance(CLSID_BLA, NULL, CLSCTX_ALL, IID_IUNKNOWN, IC(pUnk)); ----------------------------------- error C2440: 'static_cast' : cannot convert from 'IUnknown' to 'IUnknown *' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

E como todo ponteiro para interface COM pode ser convertido para IUnknown*, resolvemos nosso problema.

Se você quiser mais informações sobre verificações em tempo de compilação e códigos nesse estilo, procure sobre metaprogramming e estude muito, mas muito mesmo sobre templates.

Em 30/Jul/2004 11:57

"Windows Internals" no forno!

Hoje recebi a newsletter do site Sysinternals, dizendo que o Mark Russinovich e o Dave Solomon estão quase terminando o "Windows Internals", que é a próxima edição melhorada do Inside Windows 2000. Essa nova versão cobrirá as modificações feitas no kernel do Windows XP e 2003, e trará mais capítulos sobre resoluções de problemas e uso de dumps.

Em 30/Jul/2004 10:59

Por que os administradores de rede não se limitam a administrar a rede?

Era uma vez uma empresa. Era uma vez uma reunião entre os gerentes da área de desenvolvimento e os administradores de rede. Tudo corria bem na reunião, até que um administrador de rede diz a seguinte pérola:

- Estamos pensando em bloquear o MSN Messenger, porque ele acaba com a produtividade das pessoas.

Depois disso, o gerente de desenvolvimento tenta explicar que o MSN Messenger agiliza o trabalho, que ele gerencia pessoas que estão em outras unidades da empresa e que essa é uma forma ágil de comunicação, etc...

Agora, a pergunta: O que um administrador de rede entende de produtividade? Ele é um administrador de rede, um psicólogo ou um profissional de RH? Provavelmente, esse administrador de rede só usa o MSN Messenger para bater papo com os amiguinhos mesmo...

Em 29/Jul/2004 15:24

10 ferramentas que todo programador .NET deve ter

Na MSDN Magazine desse mês, saiu um artigo sobre as 10 ferramentas que todo programador .NET deve ter. É um artigo bem resumido, mas que é legal para quem precisa somente das referências.

Como um continuação desse artigo, eu recomendo o livro Coder To Developer. É um livro curto (+-350 páginas) que explica um pouco da metotodologia por trás das ferramentas e fala sobre como fazer um software do início ao fim, do projeto ao setup.

Em 29/Jul/2004 11:08

Lembra daquelas histórias de suporte?

Quem nunca juntou os amigos para tirar um sarro lembrando daquelas histórias de suporte e de perguntas estúpidas de usuários? Encontrei um site recheado dessas histórias. Olhe uma:

Cliente: "Eu quero meus CDs de volta."
Suporte: "Seu CD está em um drive com defeito?"
Cliente: "Só um que não."
Suporte: "O que?"
Cliente: "Não é uma unidade 4x? Então, eu já coloquei 3 CDs, mas ele não aceita o quarto e nem devolve meus outros 3."

Em 29/Jul/2004 10:29

História do Pentium

O pessoal da ArsTechinica publicou um ótimo artigo sobre história do Pentium, sob o ponto de vista técnico e histórico. Bem interesante, principalmente para quem é interessado em arquitetura de computadores e tem curiosidade sobre o funcionamento de processadores.

Em 26/Jul/2004 11:13

Novos iPAQs

Meu velho 3650 parece uma carroça velha perto dos novos iPAQs. Um deles tem um processador de 624 Mhz, mais do que o meu Pentium III 600 que eu estava usando para desenvolver com Visual Studio.NET / WinDbg / VMWare até uma semana atrás.

Eu acho que não vai demorar muito para que um iPAQ rode uma máquina virtual com um Windows 9x/NT dentro. Eu já li alguma coisa, não me lembro onde, dizendo que estavam portando o bochs para PocketPC.

Em 26/Jul/2004 10:57

Kernel mode dev lives!

A MSDN está publicando artigos sobre desenvolvimento de drivers com uma certa regularidade. Parece que o pessoal de kernel mode da Microsoft resolveu aparecer... O ultimo é sobre thread context e IRQLs.

Será que isso vai ajudar a reduzir nossa dependência do pessoal da OSR e da PCAUSA?

Em 26/Jul/2004 10:32

Como escrever um comparativo técnico tendencioso e sem fundamentos

Um sujeito que trabalha para a Oracle, fez um comparativo simplesmente ridículo entre ASP.NET e PHP. Escreveu um monte de abobrinhas malhando o ASP.NET e favorecendo o PHP, sem apontar dados concretos sobre os problemas que ele diz que o ASP.NET tem. Eu acho o PHP realmente muito bom, mas tentar divulgá-lo as custas de um comparativo ridículo desses, já é sacanagem.

E, pelo jeito, eu não fui o único que não gostou muito desse artigo. Olhe no final o rating do artigo, a maioria dos leitores também achou o artigo uma porcaria.... :-)

Em 26/Jul/2004 10:15

Tudo muda, o tempo todo

Eu estava lendo o Programming the Microsoft Windows Driver Model, do Walter Oney para tirar umas dúvidas sobre IRPs, e acabei abrindo o livro na parte que ele explica como funcionam as exceções em kernel mode. Ele também falava sobre o que acontece quando uma exceção é disparada e como usar blocos de __try/__except e __try/__finally para tratar uma exceção.

Nessa parte ele explica que quando uma exceção é disparada, o kernel sai procurando na pilha alguém que a trate. Depois ele fala que isso pode gerar problemas de performance, já que é necessário percorrer toda a pilha atrás de alguma função que lide com essa exceção. Eu também me lembro que muita gente não usa as exceções em C++ por causa de performance (fora os motivos apontados pelo Joel).

Performance, performance, performance. Hoje em dia, muitas dessas pessoas que falavam isso estão usando .NET, que tem um problema de performance muito maior, já que a runtime roda MUITO código além do seu. (Isso me lembra de programadores C reclamando que o compilador C++ gera código que eles não pediram, como o do copy constructor). É engraçado como a noção de prioridade performance/facilidade muda com o tempo. O jeito é não dar muito ouvidos e testar qual metodologia e linguagem que melhor resolve o seu problema.

Em 23/Jul/2004 21:54

Por isso que eu não compro livro traduzido....

Lançaram o famoso livro sobre "Refactoring" em português. Os caras tiveram a capacidade de traduzir "Refactoring" para refatoração... não é de matar? Por isso que eu compro direto da amazon...

Em 23/Jul/2004 11:34

Curso de Spam no SEBRAE

Esses dias encontrei um amigo que montou uma empresa de consultoria na área de telefonia. Ele veio me mostrar os impressos de divulgação da empresa, e me contou que estava fazendo divulgação via e-mail. Quando eu perguntei como ele conseguia os e-mails, ele falou que um conhecido dele o tinha emprestado um CD com milhões de e-mails e com os programas para enviá-los...

Eu expliquei que isso era spam, que era ilegal, que nenhuma empresa decente faz esse tipo de coisa, que as pessoas ficam irritadas com e-mails não solicitados, etc, etc. Foi quando ele argumentou que o e-mail era o meio mais barato de divulgar a empresa, e que se 0,01% dos milhões de e-mails derem retorno já é uma grande coisa.

No final ele me contou que fez um curso no SEBRAE, e foi lá que ele aprendeu as vantagens da "divulgação por e-mail"..

Em 22/Jul/2004 02:39

  
 
 
Comentários
Algo a dizer?
Nome:


Site ou e-mail:


Comentário