Latest Entries »

Blog Fuguete de casa nova!

Agora o Blog Foguete está disponível no endereço http://www.caiocosta.net !

Num futuro não muito distante, os artigos daqui serão migrados para lá e este blog encerrado. Aos 1,5 leitores do blog, atualizem seus favoritos.

Programa gerador de CPF

Cansado de toda vez que queria testar uma funcionalidade nova em algum sistema ir em sites geradores de CPF, implementei esse gerador muito simples em C#.
Ao iniciar, você verá apenas uma engrenagem ao lado do relógio. É só clicar nela com o botão normal do mouse e um CPF novo em folha já será copiado para
a área de transferência, e aí é só mandar o CTRL-V onde quiser utilizá-lo.

Para fechar o programa, clique com o botão direito no ícone e depois em Fechar.

DOWNLOAD : http://db.tt/puXYRAn9

Gerando números aleatórios seguros em C#

O .NET já conta com a classe System.Random, que pode ser usada para gerar números (pseudo) aleatórios de qualidade suficientepara a maioria das aplicações que você pode precisar. Mas os números gerados pela System.Random podem não ser adequados para alguns casos, por exemplo em criptografia, pois eles são previsíveis, no sentido de que não são realmente aleatórios: uma função matemática é utilizada para gerá-los, a partir de um número inicial (seed). Se a mesma seed for utilizada, a mesma sequência de números será gerada. Para os casos onde sejam necessários números realmente aleatórios, pode ser utilizada a classe RNGCryptoServiceProvider do .NET, mas sua utilização não é tão fácil e intuitiva quanto a System.Random.

A classe abaixo herda de System.Random, mas modifica a funcionalidade para que a mesma funcione com a RNGCryptoServiceProvider por baixo dos panos, completa inclusive com buffer de números gerados para melhorar a performance.

 

public class SecureRandom : Random
  {
    private RNGCryptoServiceProvider rng;
    byte[] buffer;
    int bufferend = 0;

    public SecureRandom()
      : this(32768)
    {

    }

    public SecureRandom(int bufsize)
    {
      buffer = new byte[bufsize];
      rng = new RNGCryptoServiceProvider();
      RefillBuffer();
    }

    private void RefillBuffer()
    {
      var new_array = new byte[buffer.Length - bufferend];
      rng.GetBytes(new_array);
      Array.Copy(new_array, 0, buffer, bufferend, new_array.Length);
      bufferend = buffer.Length;
    }

    public override int Next()
    {
      if (bufferend < 4)
      {
        RefillBuffer();
      }

      bufferend -= 4;
      return BitConverter.ToInt32(buffer, bufferend);
    }

    public override int Next(int minValue, int maxValue)
    {
      int gen;
      do
      {
        gen = Next();
      } while (gen < minValue || gen >= maxValue);
      return gen;
    }

    public override int Next(int maxValue)
    {
      return Next(0, maxValue);
    }

    public override void NextBytes(byte[] buf)
    {
      int toFill = buf.Length;
      int actualindex = 0;
      while (toFill > 0)
      {
        if (toFill > bufferend)
        {
          if (bufferend > 0)
          {
            Array.Copy(buffer, 0, buf, actualindex, bufferend);
            actualindex += bufferend;
            toFill -= bufferend;
            bufferend = 0;
          }
          RefillBuffer();
        }
        else
        {
          Array.Copy(buffer, bufferend - toFill, buf, actualindex, toFill);
          bufferend -= toFill;
          toFill = 0;
        }
      }
    }

    protected override double Sample()
    {
      // Step 1: fill an array with 8 random bytes       
      var bytes = new Byte[8];
      NextBytes(bytes);
      // Step 2: bit-shift 11 and 53 based on double's mantissa bits 
      var ul = BitConverter.ToUInt64(bytes, 0) / (1 << 11);
      Double d = ul / (Double)(1UL << 53);
      return d;
    }

    public override double NextDouble()
    {
      return Sample();
    }
  }

Esta é uma solução em C# para o problema PRIME 1 no SPOJ que consiste em calcular todos os números primos dentro de certos intervalos (mais info. http://spoj.pl/problems/PRIME1).Resolvi com um crivo de erastótenes levemente modificado, já com primos tabelados até 31627 (menor inteiro que é >= raiz quadrada de 1.000.000.000), já pulando os números pares e checando na tabela só até a raiz de N, para cada N no intervalo passado ao programa. Ainda há uma tentativa de paralelizar a operação, mas que não surtiu efeito no SPOJ, provavelmente o sistema deles roda a aplicação em uma CPU somente. Tentei procurar o mínimo possível na net de forma a botar a cuca pra funfar, a única coisa que utilizei da internet foi o teoreminha da raiz quadrada de N. O próximo passo será tentar acelerar o cálculo utilizando testes estatísticos de primalidade, mas para isso precisarei implementar um modulozinho de matemática de precisão arbitrária, o que já é mtos outros posts 😉 Execução no SPOJ levou 2,75 segundos e 25MB de memória. (A maior parte da memória é o runtime, gordo, que usa.)

View full article »

Cuspindo primos em C#

Vai que alguém acha alguma utilidade pra isso…

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PrimeGenerator
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> primos = new List<int>();
            for (int i = 2; i <= int.MaxValue; i++)
            {
                if (!primos.Any(p => i % p == 0))
                {
                    primos.Add(i);
                    Console.WriteLine(i);
                }
            }
        }
    }
}

Fazendo o firefox 4 renderizar fontes como IE9

Se como eu você também gostou da maneira como o IE9 renderiza as fontes, mas não quer abrir mão das funcionalidades e da extensibilidade sem igual do firefox, saiba que dá para ativar esse modo de renderização nele também, de forma simples e rápida! Sabendo da “configurabilidade” do Firefox, resolvi fuçar no about:config e achei as opções a serem alteradas para isso!!

SOMENTE Firefox 4, o Firefox 3.X não possui a aceleração DirectX então não irá rolar.

1) Acesse o endereço about:config

2) Na caixa de busca digite gfx


3) coloque as opções em negrito da mesma forma que na imagem abaixo (é só clicar duas vezes sobre o nome da propriedade)

4) reinicie seu browser.

Pronto, agora você tem a renderização de fontes do IE9 no seu Firefox 4!

Comparativo:

Fazendo o atendimento online da claro funcionar no Firefox

Se você já tentou usar o atendimento online da Claro, e como eu utiliza o Firefox (no Linux ainda por cima!), ao tentar entrar no sistema já deve ter se deparado com este erro da foto abaixo.

Corrigi-lo é simples, quando estiver no formulário de entrada no sistema, cole o texto a seguir na barra de endereço do browser, e dê ENTER:

javascript:void((function(){window.pop=document.pop;alert('Fuguete carregado!');})());

Nesta página eles usam um FORM com name “pop” e acessam ele utilizando document.pop. Depois da validação e antes de submeter o form eles vão desativar o botão de “Entrar” (pro usuário não ficar fazendo 10 mil requisições enquanto o browser não traz o resultado da aplicação), mas nessa oportunidade, e por algum motivo estranho (talvez no IE funcione..), ao invés de document.pop é utilizado window.pop. Vai entender. O código acima executa um javascript que inicializa a propriedade window.pop com o mesmo valor de document.pop, fazendo o site funcionar como esperado… Blog Fuguete trazendo até vocês, uma gambiarra para arrumar outra.

Outra observação, depois de entrar no sistema, se receber a mensagem de “todas posições ocupadas”, pode não parecer, mas você foi colocado numa fila e um script em segundo plano está dando reload na página pra você. É só aguardar até um atendente estar liberado e o chat abrirá para você.

Se você estiver programando uma aplicação que use os vários IPs disponíveis na máquina para sair, seja usando as facilidades da classe ServicePoint, ou com Socket.Bind(), ou com alguma outra biblioteca por exemplo a LibCurl, e não estiver funcionando legal, é interessante isolar se o problema é com as configurações de sua rede ou na aplicação em si.

Screenshot

Screenshot do TestadorIPs

TestadorIPs é um aplicativo para testar isto. Muito simples e com apenas 421 linhas de código, interface gráfica feita em Gtk# (testado apenas no Mono), funcionando tanto no Windows quanto no Linux, e comprovada a eficácia através do sniffer Wireshark. Para a troca do IP utilizado nas conexões de saída são utilizadas as facilidades do BindIPEndPointDelegate da classe ServicePoint, do próprio Framework; as conexões são feitas utilizando a classe WebClient e para atestar o IP utilizado para sair, utilizado o site http://www.meuip.com.br. Baixe e na pasta correspondente a seu sistema operacional, rode o executável TestadorIPs.exe. Para rodar no Windows é necessário ter instalado as bibliotecas do Gtk# 2.12 (http://ftp.novell.com/pub/mono/gtk-sharp/gtk-sharp-2.12.10.win32.msi) .

Binários e código-fonte (compilado no Mono 2.6.7, solução do MonoDevelop 2.4): http://db.tt/xBCaeSF

Os piores bugs de software da história

No link abaixo você curte uma lista com o que o autor considera os piores bugs de software da história.

Entre eles, um roubo de software pelos russos que resultou na explosão de seus gasodutos, a sonda que desapareceu porque os programadores misturaram as unidades métricas e imperiais, o sistema de alarme russo que confundiu o Sol com um míssil e quase iniciou a Terceira Guerra Mundial, e a medida anti-pirataria da Microsoft que resultou em milhões de clientes legítimos sendo tachados como ladrões de software.

 

Clique:

When computers go wrong | Analysis | Features | PC Pro.

Por vezes pode ser útil tratar uma stored procedure como se fosse uma tabela, fazendo um SELECT com ORDER BY ou WHERE. Um exemplo é o uso da stored procedure sp_who para ver as conexões atualmente abertas com o servidor de banco de dados. Pode-se agrupar por usuário conectado, por exemplo. Na net vi outras maneiras, talvez mais performáticas, de fazer este fuguete. Mas essa foi a mais simples que achei. Consiste em criar uma tabela temporária em memória, dar um INSERT nessa tabela usando os dados da stored procedure, e então fazendo o SELECT dessa tabela temporária. A estrutura da tabela deve ser compatível com o retorno da procedure.

declare @tmp table
 (
 spid int null,
 ecid int null,
 [status] nvarchar(max) null,
 loginname nvarchar(max) null,
 hostname nvarchar(max) null,
 blk int null,
 dbname nvarchar(max) null,
 cmd nvarchar(max) null,
 request_id int null
 );

 INSERT INTO @tmp
 exec sp_who;

 SELECT * FROM @tmp
 ORDER BY dbname desc