QRCode em C# 4.0

O Guilherme Coelho me pediu para gerar QRCode em C#. Procurei um pouco na net e descobri um componente que resolve esse e muitos outros problemas. Usei o encoder para QRCode, mas existem diversos outros lá na dll.

Não se esqueça de referenciar o System.Drawing, o System.Windows.Forms e o MessagingToolkit.Barcode.

Segue o código:

 using System;
using 
System.Diagnostics;
using 
System.Drawing;
using 
System.Drawing.Imaging;
using 
System.Windows.Forms;
using 
MessagingToolkit.Barcode;

namespace 
ExemploQRCode
{
    
class Program
    {
        
static void Main(string[] args)
        {
            Console.Write(
"Digite o texto/URL/e-mail: ");
            
String text Console.ReadLine();

            
Console.Write("Digite o nome do arquivo PNG para gravar (sem a extensão): ");
            
String fileName Console.ReadLine();

            if 
(text != null && fileName != null)
            {
                fileName +
".png";

                
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
                
barcodeEncoder.Width 200;
                
barcodeEncoder.Height 200;
                
                
PictureBox qrCode = new PictureBox();
                
qrCode.Image barcodeEncoder.Encode(BarcodeFormat.QRCode, text);

                
Bitmap bmp qrCode.Image as Bitmap;

                if 
(bmp != null)
                {
                    bmp.Save(fileName, ImageFormat.Png)
;
                    
Process.Start(fileName);
                
}
            }
        }
    }
}

 

Ateu é revoltado?

Eu mesmo não teria argumentado melhor.

Assistam.


C#: Como funciona internamente o datatype System.Decimal?

Estava serializando um dado do tipo Decimal quando vi três elementos XML estranhos no lugar do esperado value:

  • <flags>0</flags>
  • <hi>0</hi>
  • <lo>1</lo>
  • <mid>0</mid>

Nunca me preocupei com o significado disso porque TUDO FUNCIONA PERFEITAMENTE BEM COM A SERIALIZAÇÃO.

Mas, como a curiosidade é uma coisa estranha, comecei a pesquisar e achei um método que "transforma" um decimal (que possui 16 bytes) em um array com 4 ints (cada int possui 4 bytes).

A conclusão é a seguinte: o decimal é um número representado por um inteiro de 96 bits (12 bytes: hi, mid e lo) e por um inteiro de 32 bits (4 bytes) que indica a escala.

Ou seja, o número 1, 0.1 e 0.01 são representados pelo mesmo conjunto de 96 bits. O que muda é o inteiro (flag) que indica por que potência de 10 iremos dividir o número.

Veja a figura: o primeiro número será dividido por 1 (100), o segundo por 10 (101) e o terceiro por 100 (102).

Pronto.

Segue o exemplo, para vocês:

 using System;
using 
System.IO;
using 
System.Diagnostics;
using 
System.Runtime.Serialization.Formatters.Soap;

namespace 
Serializacao
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
decimal d1 1;
            decimal 
d2 10;
            decimal 
d3 100;
            decimal 
d4 1.1M;
            decimal 
d5 10.01M;
            decimal 
d6 100.001M;

            
Console.WriteLine(sizeof(decimal));

            
Console.WriteLine();

            using 
(FileStream fs = new FileStream("arquivo.txt"
                FileMode.Create, 
                FileAccess.Write))
            {
                SoapFormatter sf 
= new SoapFormatter();

                
sf.Serialize(fs, d1);
                
//<flags>0</flags>
                //<hi>0</hi>
                //<lo>1</lo>
                //<mid>0</mid>

                
sf.Serialize(fs, d2);
                
//<flags>0</flags>
                //<hi>0</hi>
                //<lo>10</lo>
                //<mid>0</mid>

                
sf.Serialize(fs, d3);
                
//<flags>0</flags>
                //<hi>0</hi>
                //<lo>100</lo>
                //<mid>0</mid>

                
sf.Serialize(fs, d4);
                
//<flags>65536</flags>
                //<hi>0</hi>
                //<lo>11</lo>
                //<mid>0</mid>

                
sf.Serialize(fs, d5);
                
//<flags>131072</flags>
                //<hi>0</hi>
                //<lo>1001</lo>
                //<mid>0</mid>

                
sf.Serialize(fs, d6);
                
//<flags>196608</flags>
                //<hi>0</hi>
                //<lo>100001</lo>
                //<mid>0</mid>

                
int[] b1 Decimal.GetBits(d1);
                int
[] b2 Decimal.GetBits(d2);
                int
[] b3 Decimal.GetBits(d3);
                int
[] b4 Decimal.GetBits(d4);
                int
[] b5 Decimal.GetBits(d5);
                int
[] b6 Decimal.GetBits(d6);

                
Console.WriteLine("   VALOR      FLAGS       HI   MIDDLE       LO");
                
Console.WriteLine("----------------------------------------------");

                
Imprimir(d1, b1, true);
                
Imprimir(d1, b1);
                
Imprimir(d2, b2, true);
                
Imprimir(d2, b2);
                
Imprimir(d3, b3, true);
                
Imprimir(d3, b3);
                
Imprimir(d4, b4, true);
                
Imprimir(d4, b4);
                
Imprimir(d5, b5, true);
                
Imprimir(d5, b5);
                
Imprimir(d6, b6, true);
                
Imprimir(d6, b6);

                
Console.WriteLine("----------------------------------------------");

                
fs.Close();
            
}

            Process.Start(
"arquivo.txt");

            
Console.ReadKey();
        
}

        
private static void Imprimir(decimal d1, int[] b1, bool hexa = false)
        {
            
if (hexa)
                Console.WriteLine(
"{0,10} {1:x8} {2:x8} {3:x8} {4:x8}"
                    d1, b1[
3], b1[2], b1[1], b1[0]);
            else
                
Console.WriteLine("{0,10} {1,8} {2,8} {3,8} {4,8}"
                    
null, b1[3], b1[2], b1[1], b1[0]);
        
}
    }
}

Como o SQL Server armazena datas? Como o datetime funciona?

Um ex-aluno me perguntou como o SQL Server armazena os dados do tipo datetime.

No TECHNET vemos que o datatype tem oito bytes e que a data é armazenada na primeira porção (quatro bytes) e a hora na outra.

Esse datatype aceita valores entre 01/jan/1753 e 31/12/9999, tendo precisão de 3.33 ms. 

Inicialmente vi qual foi o valor (em binário) armazenado e, quebrei em duas metades.

A primeira, convertida para int, é a quantidade de dias que se passaram desde 01/01/1900 e a segunda é a quantidade de clock-ticks que se passaram desde a meia-noite.

Fazendo os cálculos (veja o script), descobri que 300 clock-ticks equivalem a 1 segundo. Aí foi só "partir para o abraço".

Depois de entender como o datatype armazena os dados, dividi o 1000ms por 300 e obtive [liga som de espanto] 3.33, que é a precisão do tipo. [desliga som de espanto]

 SELECT CAST(CAST('19000101 00:00:01' AS DATETIMEAS BINARY(8))
--0x000000000000012C


SELECT CAST(0x0000012C AS INT
--300
--1s = 300 clock-ticks


SELECT CAST(CAST('19980311 08:30' AS DATETIMEAS BINARY(8))
--0x00008C17008C1360


SELECT CAST(0x00008C17 AS INT) + CAST('19000101' AS DATETIMEAS 'DATA'
--1998-03-11 00:00:00.000


SELECT CAST(0x008C1360 AS INT) / 300.60 60 AS 'HORA (DECIMAL)'
--8.500000000000

Pai atira em notebook da filha

Rapaz!!! Agora eu senti firmeza!!! Sou um babão com os meus filhos, mas achei NOTA MIL esse vídeo. Quem nunca quis dar um castigo nos filhos, mas não tem coragem?

Afinal, estamos no mundo das ex-famílias... pais e mães separados prometendo de tudo para ficar com a guarda dos arrebentos - não importa se é válido, ou não; se é honesto, ou não.

Se falar a verdade para um filho ele se acha no direito de morar com a mãe, porque lá na "casa da mãe Joana" tudo pode... lá ele é "feliz"... Afinal o pai lhe impôs limites... a vida com o pai é "sofrida".

E o inverso também é verdade: se a mãe impõe limites, o filho vai morar com o pai.

Afinal ele é o "espertão" que só leva "vantagem", não?

Assistam ao vídeo (em inglês, mesmo) e vejam como se educa um filho mimado e sem noção - não que os meus sejam assim (mas dá uma vontaaaade de fazer o mesmo).

E, vejam, que o pai não está bravo. Somente está desapontado com a inútil filha.

Outra coisa: apesar de parecer "da roça", o sujeito é diretor de TI de uma empresa lá dos isteitis. Não é um burrinho ignorante, não...

Fim do mundo em 2012

Profecia maia, macumba, religião, Nóistravamus... é tudo mentira... só bobagem...

Só que hoje eu vi uma possibilidade factível: ou morreremos "zumbizados", ou por invasão alienígena ou por revolta de robôs. Aí, sim!!!

VS2010 SP1 não abre CSS

Então... fazer o que, né?

Quando atualizei o Visual Studio 2010 para o SP1, vi que ele não abria mais o CSS.

Para corrigir esse problema, vá em [Tools], [Extension Manager] e instale a extensão Web Standards Update for Microsoft Visual Studio 2010 sp1.

Pronto.

Gerador de jogos para a Mega Sena em C#

O Wagner Brito foi quem pediu esse programinha através da página de contato do blog... acabei fazendo o mesmo no feriado e só agora consegui postar...

Podem baixar em Sena.exe (78,00 kb) somente o executável (precisa do .Net Framework 4.0 instalado na máquina) ou em Sena.rar (70,51 kb) o projeto completo.

Wagner, obrigado pelos elogios!!!

Desempenho de novo: recursividade x iteratividade com Fibonacci

Eu já tinha falado sobre desempenho aqui. Agora, faço um novo exemplo onde mostro que, para calcular o enésimo termo da sequência de Fibonacci, um método iterativo é MUITO mais rápido que um método recursivo.

Leia mais...

Isso funciona? Sobrecarga de construtores em C#

O código abaixo compila? É executado sem erro? É muito usado no dia-a-dia? Existe alguma outra forma para se atingir o mesmo objetivo?

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

namespace 
ExemploSobrecargaConstrutores
{
    
class Program
    {
        
static void Main(string[] args)
        {

            Classe c
;

            
= new Classe();
            
= new Classe(50"minutos");
            
= new Classe("minutos"50);
        
}
    }

    
class Classe
    {
        
public Classe()
        {

        }

        
public Classe(String s, Int32 i)
        {

        }

        
public Classe(Int32 i, String s)
        {

        }
    }
}

As respostas são: Leia mais...