
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);
}
}
}
}
}
Eu mesmo não teria argumentado melhor.
Assistam.
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]);
}
}
}
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 DATETIME) AS BINARY(8))
--0x000000000000012C
SELECT CAST(0x0000012C AS INT)
--300
--1s = 300 clock-ticks
SELECT CAST(CAST('19980311 08:30' AS DATETIME) AS BINARY(8))
--0x00008C17008C1360
SELECT CAST(0x00008C17 AS INT) + CAST('19000101' AS DATETIME) AS 'DATA'
--1998-03-11 00:00:00.000
SELECT CAST(0x008C1360 AS INT) / 300.0 / 60 / 60 AS 'HORA (DECIMAL)'
--8.500000000000
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...

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!!!
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.
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!!!

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...
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;
c = new Classe();
c = new Classe(50, "minutos");
c = 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...