terça-feira, 28 de julho de 2009

Integer overflow no delphi 7

Dica sobre diferenças entre a sintaxe do delphi 2009 e do delphi 7 para se trabalhar com numeros negativos.

Isso soluciona o problema do integer overflow

http://www.devmedia.com.br/articles/viewcomp.asp?comp=13695

terça-feira, 21 de julho de 2009

Até que ponto os softwares modernos necessitam de hardware?

Isso é apenas uma coisinha boba, mas fundamenta meu argumento:
Sempre achei que os softwares modernos estão ficando cada vez mais exagerados no que eles exigem de hardware, e acredito que é porque estão ficando cada vez mais mal-feitos.

Acredito que programadores sem um conhecimento técnico muito grande, iniciantes ou medianos podem tornar um programa mais lento e exigente a medida que ele faz mal uso do processador e da memória.
Para exemplificar isso criei um cenário onde poderíamos codificar um programinha.
Se eu tenho uma função que subtrai um valor de um determinado montante, mas o resultado não pode ser negativo, porque essa função alimentará uma outra que aceita como entrada apenas números naturais não negativos. Caso o valor seja maior que o montante a função deve retornar zero.
Imagine uma operadora de celular pré-pago. Ela deve cortar a ligação do usuário quando os créditos chegam a zero, e impedir que faça novas ligações, mas jamais permitir que os créditos do cliente fiquem negativos. Mesmo que o cliente tenha suponhamos 50 centavos e a ligação que ele fará custe 55, mesmo que a operadora resolva deixar o usuário completar a ligação, arredondando para menos e arcando com o onus de 5 centavos, o cliente nunca deverá ficar com saldo negativo (pode até não ser assim, mas estamos impondo isso como premissa).
Se o cliente tem um saldo de 50 e é debitado 55, o saldo deve ser 0. Todo saldo negativo deve ser 0.
Consideraremos apenas a função de débito, mas ela não deve nem ser executada caso o cliente não disponha realmente dos meios para pagar o serviço. Por exemplo se numa verificação de saldo descobre-se que o cliente tem 20 centavos e a ligação é 50, simplesmente ele não fará a ligação.
O mesmo vale para sites onde o conteudo visualizado é pré-pago através de créditos. Imagine que o cliente compra 50 creditos, usa um, se arrepende e pede o dinheiro de volta. Você deve extornar o dinheiro do cliente e zerar o seu saldo de créditos, debitando 50 (o que ele comprou) dos 49 (o que ele tem), porém sem deixa-lo com saldo negativo -1. Ele não irá gostar de, caso um dia compre créditos de novo, comprar 50 e visualizar 49, como se 1 tivesse sumido.
Veja as várias formas de se fazer isso:



//desperdiçando memória com variáveis desnecessárias:
function debita1(montante,num: integer): integer;
var temp: integer;
begin
 temp := montante-num;
 if temp < 0 then
  result := 0
 else
  result := temp;
end;

//desperdiçando processamento
function debita2(montante,num: integer): integer;
begin
 if montante-num < 0 then
  result := 0
 else
  result := montante-num;
end;

//usando um if
function debita3(montante,num: integer): integer;
begin
 if num > montante then
  result := 0
 else
  result := montante-num;
end;

//uma maneira matemática e elegante, arregaçando o processador
function debita4(montante,num: integer): integer;
begin
 result := (montante-num + trunc(sqrt(sqr(montante-num)))) div 2;
end;


//método "me acho o bom mas sou um mané"
function debita5(montante,num: integer): integer;
asm
  sub eax, edx
  jns @@final
  and eax, 0
  @@final:
end;




A função debita1 claramente está usando uma variável temporária desnecessária, uma vez que em certas condições o cálculo não será efetuado,


a função debita2 economiza memoria em relação a debita1, mas executa o cálculo duas vezes, uma no if.

a função debita3 seria a mais performática e correta.

a função debita4 parece bonita, usa a matemática, com raiz quadrada do quadrado de um número, para tirar modulo, a formula ((m-d)+|m-d|)/2, não tem nenhum if, mas é a pior de todas. ela usa os operadores sqr e sqrt, uma vez cada um, que são operadores para se trabalhar com ponto flutuante. O todo desta função, inclusive as funções sqrt e sqr, acabam gerando mais instruções de máquina do que as precedentes.

A função debita5 foi o resultado de várias tentativas de fazer uma função mais performática que a debita3 em assembly. Não consegui. Mesmo para um loop de cem bilhões de vezes as funções debita3 e debita5 têm performances semelhantes.

Se alguem tiver uma sugestão de uma função mais performática que a debita5 eu agradeço!

Lógico que nem sempre é assim. As vezes uma função com operações matemáticas é mais rápida do que um complexo labirinto de if's.
Num outro exemplo, se seus números de ponto flutuante não tem mais de 2 casas depois da vírgula, pode-se evitar se trabalhar com números decimais, que são mais lentos, e multiplicar todas as parcelas por 100, dividindo-as por 100 depois. Isso num loop muito grande economizaria bastante tempo do processador.
Parece besteira minha, mas cada ano que passa os softwares estão ficando mais exigentes em termos de hardware, para fazer as tarefas cada vez mais triviais. Um messenger moderno, que tem a função apenas de chat com outros messengers, não funciona num 486 ou pentium 100 por exemplo.
A maioria das linguagens gerenciadas exige que você tenha 1 gb de memória para executar um hello world.
Acredito que grande parte desse desperdício pode ser atribuido a desatenção dos programadores, e uma parte menor a burrice mesmo.

Só que considerando software cada vez mais exigente. Hardware cada vez mais exigindo energia (uma simples placa pci express off board te obriga a ter uma fonte de 450 watts reais no mínimo), cada vez mais computadores velhos sendo jogados no lixo, com seus chips de silício, que é um veneno para a natureza, não deveríamos nós tentar o máximo possível fazer um código "econômico"?

Eu tenho tentado, logico, à medida que meus conhecimentos permitirem.

segunda-feira, 6 de julho de 2009

não consegue instalar o ie7 de jeito nenhum?

Como desenvolvedor web preciso instalar no meu computador vários browsers, varias versões do firefox e do IE.

Recentemente tive um problema para instalar o IE7 e IE8.

Simplesmente dava a mensagem dizendo que o programa não foi/não pôde ser instalado e interrompia a instalação, criando na área de trabalho um link para o suporte microsoft.

Alguma coisa errada com meu registro. Não corri muito atrás para saber profundamente o que era, afinal só o registro do windows é assunto para um livro.

Simplesmente fucei na net e achei uns comandos.

Se você já disse: "não consigo instalar o IE7 de jeito nenhum" ou "não consigo instalar o IE8 de jeito nenhum", esses comandos podem te ajudar:

no iniciar --> executar digite o comando abaixo:
secedit /configure /cfg %windir%\repair\secsetup.inf /db secsetup.sdb /verbose

se não der certo, procure por essa chave de registro no regedit, de um clique de direita e na opções permissões, de permissão a si mesmo ou ao usuário que está tentando instalar o ie7 ou ie8.

HKCR\Interface\{34A715A0-6587-11D0-924A-0020AFC7AC4D}

Agora algumas dicas para browsers.
para testar com todas as versões do IE ao mesmo tempo:
MultipleIE - http://tredosoft.com/Multiple_IE - instala varias versões do ie na sua máquina
IETester - http://www.my-debugbar.com/wiki/IETester/HomePage - cria uma aba para cada versão do ie.

Para testar com todas as versões de firefox use as versões portable novas e antigas:
3.5 - http://sourceforge.net/projects/portableapps/files/Mozilla%20Firefox,%20Portable%20Ed./FirefoxPortable_3.5_English.paf.exe
3.0 - http://sourceforge.net/projects/portableapps/files/Mozilla%20Firefox,%20Portable%20Ed./FirefoxPortable_3.0.11_English.paf.exe
2.0 - https://sourceforge.net/projects/portableapps/files/Mozilla%20Firefox,%20Portable%20Ed./Firefox_Portable_2.0.0.14_de.paf.exe
1.5 - http://sourceforge.net/projects/portablefirefox/files/Mozilla%20Firefox,%20Portable%20Ed./Firefox_Portable_1.5.0.10_en-us.paf.exe
1.0 - http://sourceforge.net/projects/portablefirefox/files/Mozilla%20Firefox,%20Portable%20Ed./Firefox_Portable_1.0.8_en-us.exe

Para mais informações procure no sourceforge.


Falando de sourceforge, ele está de cara nova, e muito bonito.
www.sourceforge.net

experimente os browsers chrome, muito rapido: http://www.google.com/chrome
e o kmeleon, um browser baseado no firefox muito levinho: http://kmeleon.sourceforge.net/

té +

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)