quarta-feira, 31 de março de 2010

Nota Fiscal - Estrutura de tabelas

Nota Fiscal é fogo. Difícil, chato, repetitivo e cansativo. E agora tem a nota fiscal eletrônica para complicar mais ainda. Para facilitar a vida de quem está começando, vou postar aqui a estrutura das minhas tabelas, que está longe de ser ideal, mas quebra um galho.

/* Table: NOTAFISCAL, Owner: SYSDBA */

CREATE TABLE "NOTAFISCAL"
(
  "CODNOTA"  INTEGER NOT NULL,
  "CODVENDA"  INTEGER,
  "NATUREZAOPERACAO"  VARCHAR(50),
  "CFOP"  INTEGER,
  "INSCRESTSUBSTTRIBUT"  VARCHAR(20),
  "ENTSAI"  INTEGER,
  "DESTINATARIOREMETENTE"  VARCHAR(100),
  "CPCN"  VARCHAR(20),
  "DTEMISSAO"  DATE,
  "DTSAIDAENTRADA"  DATE,
  "HORASAIDA"  TIMESTAMP,
  "BASECALCICMS"  DOUBLE PRECISION,
  "VALORICMS"  DOUBLE PRECISION,
  "NOMETRANSPORTADORA"  VARCHAR(100),
  "NUMNOTA"  INTEGER,
  "DESREMENDERECO"  VARCHAR(80),
  "DESREMBAIRRO"  VARCHAR(50),
  "DESREMCEP"  VARCHAR(9),
  "DESREMMUNICIPIO"  VARCHAR(80),
  "DESREMFONE"  VARCHAR(15),
  "DESREMUF"  VARCHAR(2),
  "DESREMIE"  VARCHAR(15),
  "DESREMRAZAO"  VARCHAR(80),
  "VALORTOTALPRODUTOS"  DOUBLE PRECISION,
  "VALORTOTALNOTA"  DOUBLE PRECISION,
  "NUMEROFORMULARIO"  INTEGER,
  "TRANSRAZAO"  VARCHAR(80),
  "TRANSFRETE"  INTEGER,
  "TRASPLACAVEICULO"  VARCHAR(10),
  "TRANSUFVEICULO"  VARCHAR(2),
  "TRANSCPCN"  VARCHAR(14),
  "TRANSENDERECO"  VARCHAR(80),
  "TRANSMUNICIPIO"  VARCHAR(80),
  "TRANSUF"  VARCHAR(2),
  "TRANSIE"  VARCHAR(15),
  "CODTPR"  INTEGER,
  "CANCELADA"  INTEGER,
  "RGIE"  VARCHAR(12),
  "DESREMNUMERO"  VARCHAR(20),
  "BASECALCICMSSUBST"  DOUBLE PRECISION,
  "VALORICMSSUBST"  DOUBLE PRECISION,
  "JUSTIFICATIVA"  VARCHAR(50),
  "DESREMCODUF"  INTEGER,
  "DESREMCODCIDADE"  INTEGER,
  "CHAVENOTA"  VARCHAR(14),
  "NUMEROPROTOCOLO"  VARCHAR(50),
  "NUMERORECIBO"  VARCHAR(50),
  "QUANTIDADE"  INTEGER,
  "ESPECIE"  VARCHAR(50),
  "MARCA"  VARCHAR(50),
  "PESOBRUTO"  DOUBLE PRECISION,
  "PESOLIQUIDO"  DOUBLE PRECISION,
 PRIMARY KEY ("CODNOTA")
);
ALTER TABLE "NOTAFISCAL" ADD CONSTRAINT "FK_NOTAFISCAL_TRANSPORTADORA" FOREIGN KEY ("CODTPR") REFERENCES "TRANSPORTADORAS" ("CODTPR");
ALTER TABLE "NOTAFISCAL" ADD CONSTRAINT "FK_NOTAFISCAL_VENDA" FOREIGN KEY ("CODVENDA") REFERENCES "VENDAS" ("CODVENDA");






/* Table: NOTAFISCALITENS, Owner: SYSDBA */

CREATE TABLE "NOTAFISCALITENS"
(
  "CODITEM"  INTEGER NOT NULL,
  "CODNOTA"  INTEGER,
  "CODPRO"  INTEGER,
  "DESCRPRO"  VARCHAR(80),
  "UNIDADE"  VARCHAR(3),
  "QTDE"  DOUBLE PRECISION,
  "VALORTOTAL"  DOUBLE PRECISION,
  "ALIQICMS"  DOUBLE PRECISION,
  "CODIGOPRODUTO"  VARCHAR(20),
  "VALORUNITARIO"  DOUBLE PRECISION,
  "CODSITTRIBUT"  INTEGER,
  "CODCLASSFISCAL"  INTEGER,
  "SITTRIBUT"  VARCHAR(50),
  "CLASSFISCAL"  VARCHAR(50),
  "ABREVSITTRIBUT"  VARCHAR(4),
  "ABREVCLASSFISCAL"  VARCHAR(4),
  "CFOP"  INTEGER,
 PRIMARY KEY ("CODITEM")
);
ALTER TABLE "NOTAFISCALITENS" ADD CONSTRAINT "FK_NOTAFISCALITENS_NOTAFISCAL" FOREIGN KEY ("CODNOTA") REFERENCES "NOTAFISCAL" ("CODNOTA") ON DELETE CASCADE;
SET TERM ^ ;


/* Triggers only will work for SQL triggers */

CREATE TRIGGER "INSNOTAFISCALITENS" FOR "NOTAFISCALITENS"
ACTIVE BEFORE INSERT POSITION 0
AS
 BEGIN
  NEW.coditem = GEN_ID(gnNotaFiscalItens, 1);
 END
 ^

COMMIT WORK ^
SET TERM ;^




Usei para isso o banco de dados Firebird.

Tenho alguns campos que são propositalmente redundantes, porque no momento em que eu emito/lanço uma nota fiscal, eu copio as informações da venda para a nota fiscal, e as informações de cada item da venda (produtos) para cada item da nota.

quarta-feira, 17 de março de 2010

Delphi 2011 - Fulcrum

Já está disponível para os betatesters o Delphi 2011, codenome Fulcrum. Ainda não está disponível alguma versão trial do mesmo.

Mais informações no blog do Rodrigo Mourão

Aguardo ansiosamente pelo dia em que ele será lançado. Não tanto pelos recursos de compilação para linux ou para 64 bits, mas por causa de uns bugs que eu enfrentei na nova RTTI do Delphi 2010.

Update: O fulcrum se chama Delphi XE, é a versão 15 do produto, melhor versão até agora e os bugs da nova RTTI foram todos corrigidos.

quarta-feira, 10 de março de 2010

Mais um da série "meus patrões precisam ler isso"

O texto vai desde informatização de processos que já estão errados à multiplas camadas.
Mas é interessante o primeiro parágrafo que fala o que acontece quando a criatividade vira sinônimo de insubordinação.
http://www.juliobattisti.com.br/artigos/ti/ncamadas.asp

Novas certificações Microsoft (Humor)

MCCC == Microsoft Certified Corte e Custura


MCGS == Microsoft Certified Great  Shit


MCMF == Microsoft Certified Master Fucker


MCJN == Microsoft Certified Jedi Ninja


MCLR == Microsoft Certified Lord of Rings


MCCN == Microsoft Certified Chuck Norris!

sexta-feira, 5 de março de 2010

Usando tabelas de sistema do MS SQL Server para encontrar procedures

Quando o seu banco de dados possui muitas tabelas e muitas stored procedures  controlar as dependências pode ser difícil e chato. Sempre que for alterar uma tabela terá que saber de antemão quais são as trocentas procedures que dependem dela.

A mesma coisa quando for alterar uma function, podem ter várias procedures que a usam.

Mesmo assim continuamos a trabalhar com procedures pela facilidade que elas nos dão de distribuir a carga do sistema, fazendo parte do processamento no servidor. Além disso a execução de procedures gera comandos de comprimento menor do que a execução de SQL Direto "ad hoc".

Para facilitar a busca de procedures que usam uma tabela ou que contenham uma determinada palavra-chave eu criei essa stored procedure abaixo, onde você simplesmente executa ela passando uma string entre sinais de % e ela te retorna todas as procedures que contenham essa palavra chave. Provavelmente essas você terá de alterar.

Para isso uso duas das tabelas de sistema do SQL Server. O exemplo é bem simples.


-- ################################################################################
-- # NOME   : SPVTR_Procura_Procedures
-- # PRODUTO  : Módulo: Manutenções de bancos de dados
-- # DEVELOPER  : Vitor Luiz Rubio
-- # COPYRIGHT  : 
-- # OBJETIVO  : Listar todos os nomes de procedures ou outros objetos que contenham em seu text determinada palavra ou tabela
-- # VERSAO   : 1.0
-- # DT. CRIACAO : 2008-01-02
-- # DT. ALTERACAO : 
-- #
-- # DEPENDENCIAS:
-- # Tabelas de sistema, sysobjects, syscomments
-- # DEPENDENTES:
-- #
-- # HISTÓRICO
-- #  2008-01-02 : Criação
-- #  
-- ################################################################################

  
CREATE PROCEDURE [dbo].[SPVTR_Procura_Procedures] (  
 @Procura varchar(255)
)  
AS  
  
SET NOCOUNT ON  
  
declare @SQL varchar(8000)

set @SQL = 'select distinct(O.Name) from sysobjects O (NOLOCK) inner join syscomments C (NOLOCK) on C.id = O.id 
where C.Text like' + '''' +  @Procura + ''''

exec (@SQL)

  
SET NOCOUNT OFF



Modo de usar:  SPVTR_Procura_Procedures '%Clientes%'


Espero que seja útil, have fun ^^

quarta-feira, 3 de março de 2010

A diferença entre pirataria, software open-source e software livre

Já vou avisando, o post será looooongo.

Não vou negar que já fui a favor de pirataria. Eu era moleque, e como todo moleque o que eu queria era jogar games, quanto mais barato  melhor.
Eu achava que simplesmente as empresas, produtoras, publishers, gravadoras e outros faturavam muito dinheiro fácil, uma vez que já pronto, o filme, jogo, música ou software era simplesmente copiado e revendido, ao custo de R$1,00 a mídia.
Eu acreditava que havia sim um custo inicial de desenvolvimento mas que esse custo era todo transformado em lucro na hora de vender o software, afinal não se precisaria desenvolver mais, apenas vender. (acredito que seja assim em alguns casos, mas no geral o custo de se manter software, ou de se desenvolver sempre novas versões, além de ser grande, é um custo que se não for investido pode levar uma software - house a desaparecer, simplesmente pela falta de atualização de seus produtos)
Tinha um ideal de que software não é produto, porque é afísico, intangível. É verdade, software não é produto ou objeto, é informação e instrução. Idéias, software são idéias. Como tais, são patrimônio cultural da humanidade, e deveriam ser livres. Liberdade e informação para todos!
É um ideal nobre, pois o software, tal como instruções e processamento, são cálculos, e se patenteassem o fogo, a roda e os algarismos e símbolos matemáticos o que seria do progresso da ciência e da tecnologia? Até a arte estaria comprometida.
Patentes e autoria misturados no mesmo saco? Como se pode patentear uma idéia como a roda ou o fogo? É possível evitar que outra pessoa que não te conhece e que não copiou a sua obra tenha, em época diferente ou ao mesmo tempo, a mesma idéia que você?


Não que este não seja mais o meu ideal, muito pelo contrário, eu ainda desejo isso. Porém como programador e produtor de software eu passo a entender o quanto vale um insight, o trabalho que dá chegar a ele e o valor que ele tem simplesmente pela sua capacidade de ajudar outros a ter seus próprios insights.
Assim como todos têm direito à informação, todos têm direito de ser reconhecidos pela autoria de uma boa idéia sua. Qual direito prevalece, o individual ou o coletivo?


Por isso meu ideal "evoluiu". Ele passou de pirataria a software livre. E eu continuo com o ideal nobre acima, porém agora de maneira "legal". Não uso mais software pirata, uso software livre e quando posso e preciso muito compro um proprietário, apenas se ele for muito melhor e mais fácil de usar que um livre.

Outra grande culpada desses problemas modernos é a legislação, arcaica, que permite que empresas e outras entidades "imortais" adquiram os direitos de autoria que deveriam pertencer somente a seres humanos, e a deter esses direitos inclusive após a morte de seus autores originais, mesmo se esses abrissem mão de seus direitos caso ainda estivessem vivos.
Vou mais além: é obrigação do governo proteger o acervo cultural da humanidade e proteger os dirteitos de seus autores SIM, fazendo, para isso, talvez um repositório de obras originais tal como seus autores as conceberam.
Contudo, passar os direitos autorais de uma obra para seus descendentes parece mais uma consequência funesta das leis de hereditariedade do que uma tentativa de se preservar os direitos de um autor.
Nesse caso sim, creio que deveria prevalecer o direito coletivo à cultura e informação, acima de todo e qualquer interesse que um filho ou neto de autor pode ter. Se alguém quer reivindicar direitos autorais sobre uma obra, que seja autor de uma.
É interessante a lei que coloca sob domínio público uma obra de um autor que já faleceu há mais de 70 anos. (embora entre aí a obrigação do governo de se preservar o legado original, antes que o "domínio público" descaracterize a obra com tamanho número de obras baseadas ou inspiradas).
Mas essa lei só é aplicável à livros, esculturas, músicas e algumas outras obras intelectuais. Coisas mais dinâmicas, como tecnologias, jogos eletrônicos e softwares deveriam cair em domínio público, a meu ver, depois de 10 anos no máximo.

Faço uma pausa aqui para parabenizar as empresas de software proprietário que abrem o código fonte das versões mais antigas de seus softwares assim que versões mais novas são criadas.

Como não podemos esperar isso de um governo ignorante que abre as pernas para decisões estrangeiras arbitrárias colocando a soberania de um pais de dimensões continentais em risco (essa frase ficou muito "bandeira vermelha") ...

O jeito é elogiar e incentivar pessoas, fundações, universidades e empresas que por livre e expontânea vontade abrem mão de certos direitos para contribuir com o avanço da cultura, tecnologia, ciência e entretenimento, simplesmente por abrir ou divulgar suas idéias, seus insights, e seus fontes.
Esta é a filosofia por trás do Software Livre.
Muitas vezes o software livre ou a filosofia por trás dele é tachado de comunismo digital. Bem, eu não sou comunista, nem capitalista, não gosto de nenhuma das duas formas. Acredito que se possa fazer muito dinheiro com Software Livre, e tenho exemplos de empresas que o fizeram.
Gosto de software livre. Gosto de compartilhar meu aprendizado e minhas conquistas, e gosto que outras pessoas também o façam. Gosto de não ter que reinventar a roda e recomeçar do zero em cada software, para que juntos, empresas que façam softwares diferentes possam juntar seus programas como parte de um software maior.

Mas algumas pessoas confuntem software livre com pirataria. http://imasters.uol.com.br/noticia/16043/livre/politicos_americanos_querem_taxar_uso_de_open_source_como_pirataria/

Não, software livre não é pirataria, é um exercício do direito de liberdade de expressão e pensamento. É um toque de arte no software. É um toque de folclore no software. Duvido que te multariam por cantar cantigas de roda ou contar histórias sobre a caipora uma vez que você não é autor destas.

Se o autor do primeiro "Hello World" patenteasse a sua idéia, não teríamos essa divertida tradição em livros e cursos  de programação. E se eu quiser escrever código - fonte em C++, numa pedra encontrada por mim em um rio, e tornar a pedra visível a todos, e tornar o seu texto livre e conhecido? Ninguém pode vetar o meu direito, mas porque vetariam o direito de quem quisesse "citar os dizeres da pedra"?


Alguns ainda confundem software livre com religião, praticamente obrigando todos a adotar software livre e proibindo o proprietário, se metendo nos governos, onde não deveriam se meter. Remexer merda sempre faz ela feder mais. A esses dou meu alerta: obrigar alguém a usar software livre vai de encontro à filosofia do software livre uma vez que você restringe a liberdade de escolha da pessoa.

Se uma pessoa é realmente livre, ela deve ser livre para escolher software não-livre, ela deve ser livre para escolher de quem será escrava. Se ela tiver dinheiro para isso, vontade de adquirir o software proprietario e gostar da embalagem, por que não?

E você acha que o software livre não escraviza? Bom, de um certo modo, você ter o código fonte na mão e a licença GPL te grante o direito de mecher e remecher o software, porém poucos exercem esse direito, mesmo quando um projeto livre morre e fica sem suporte, simplesmente porque não é tão fácil assim entender código fonte escrito por outros, principalmente se usar uma linguagem e parte de sistemas legados que você não domina.
Além disso a GPL diz que o resultado também deve ser livre. Isso por si só não é uma violação da liberdade se você pensar que você está garantindo a liberdade coletiva antes de qualquer proibição individual, e assim, recursivamente, garantindo a sua propria liberdade individual.

Outros ainda confundem software livre com software open-source. Não é a mesma coisa. Software livre quer dizer que a liberdade de alteração e distribuição do mesmo é garantida, embora se conserve o nome do autor original. Porém é proibida a restrição desses direitos à um terceiro. Software gerado em GPL também tem de ser GPL. Você garante os direitos autorais de quem criou, e os direitos de qualquer um que possa se beneficiar de qualquer alteração na obra original.
Software open-source significa simplesmente que o código fonte é divulgado ou distribuido junto com a aplicação. Um software proprietário como o windows poderia ter seu código fonte aberto, e mesmo assim ter tantas restrições legais na sua licença que não o tornariam um software livre.
Um exemplo desse tipo é o Mozilla. A MPL é um exemplo de licença de software open-source que não é livre, devido a restrições que possui.
Ou seja, browser open-source decente ainda tá difícil, não porque não existem, mas porque existem poucos.
Software livre são aqueles softwares que a Free Software Foundation declara que são compatíveis com a licença GPL. Os demais não são livres, ou por restringir mais que a GPL, ou por liberar mais que a GPL, dando assim direito a um terceiro de restringir a liberdade de um "quarto".
No site da Free Software Foundation (http://www.fsf.org/) há uma lista de licenças de software open - source que não são livres, não são compativeis com a GPL.  http://www.fsf.org/licensing/licenses
No site da Open Source Initiative há também uma lista de licenças de software open-source. http://www.opensource.org/licenses/alphabetical
Repare que empresas como Microsoft e IBM também tem licenças de produtos com código fonte aberto. Algumas delas são bastante permissivas, mas não fazem delas licenças livres.

Qual o problema das licenças mais livres que a GPL, como a primeira versão da licença BSD? Essas licenças são, as vezes, tão permissivas que permitem que você pegue um projeto, altere, se auto-proclame autor do software, feche o source e venda o produto como um produto comercial proprietário.
Podemos ver que software livre é um subconjunto específico dos softwares open-source.



Um mundo livre e open-source


Talvez isso seja apenas utopia, mas sempre é bom alguém dar um primeiro passo. Eu não sou artista, músico etc, então eu posso contribuir apenas com alguns programas feitos por mim e os textos desse blog ;)
Ainda faltam mais obras de arte livres
Filmes livres
Livros livres
Peças teatrais, poesias, quadros, fotos ...
Músicas livres
Teses de doutorado livres
Receitas de bolo livres

Autores e músicos que quiserem publicar livros ou músicas livres, além de estarem contribuindo com esse patrimônio, creio que teriam uma grande aceitação do público, além de divulgação, o que levaria sua carreira a "decolar" mais rápido.

Ainda falta legislação, e para isso, como eu já disse, falta um magistrado ou legislador de renome e influência, que não seja um tapado de preferência, como a maioria dos que eu conheço, publicar um livro opinando sobre a GPL, analisando sua legalidade à luz da remendada e gambiarrada constituição brasileira.
Depois ele entra para o governo, se candidatando a qualquer coisa, e ajuda mais ativamente e mais "perto" na luta contra quem acha que pirataria e liberdade é a mesma coisa.



Quanto à pirataria Vs. Obra original licenciada e paga (e um manifesto pela justiça na comercialização das mesmas)

Quando digo obra me refiro à software, jogo, música, livro, filme, poesia e qualquer outra "obra" intelectual

Primeiro: é um absurdo o que as gravadoras lucram em cima dos artistas e dos fãs, por um trabalho que não é delas. Simplesmente é uma vergonhe hedionda, pagar de 30 a 100 reais em músicas que as vezes não valem a mídia na qual é divulgada.
Mas isso não justifica a pirataria. Acho antes que os artistas deveriam driblar as gravadoras e criar suas próprias gravadoras independentes, para baratear o custo dos seus álbuns. Além disso  o artista realmente bom ganharia mais dinheiro com shows do que com a venda de CDs ou DVDs.

Segundo: Tornar a compra de algo original uma coisa vantajosa e gratificante, recompensadora, para o comprador.
Jogos de videogame e computador eu prefiro e faço questão de comprar originais, assim como software e outras obras. Aprendi isso com o tempo, porém isso só é válido quando é vantajoso comprar o original. Vantajoso para ambos os lados.

Se em um jogo eu simplesmente recebo um DVD com uma cópia do mesmo, que vantagem  o original tem sobre o pirata? Qualidade? Bah! Besteira! A qualidade está no software, não na mídia. E não é quem cria essa qualidade que realmente ganha com isso. Se fosse assim, então compre o pirata.
Agora se um jogo original vem com uma embalagem "da hora", ou adesivos, ou um joystick, ou qualquer outra coisa que me agrade, e ainda permite jogar online com outras pessoas, coisa que boa parte dos jogos piratas não permitem, aí sim eu compraria o jog original.

A mesma coisa para música e filme. Eu não compro simplesmente música para ouvir e filme para assistir, isso tem de graça na internet, obrigado, e é impossível de retirar. Eu compro um pedaço colecionável do acervo de um artista do qual sou fã, então, se eu compro uma marca, porque não vir de brinde uma camiseta, boné, disco de vinil, livro ou qualquer outra coisa que me agrade?

Com software original, alem de suporte, livros e manuais, você tem a garantia de ter com quem reclamar, e de ter suporte por um tempo. É o direito do consumidor em ação, embora para software ele raramente surta efeito.

Jogos originais tem sim uma grande probabilidade de funcionar melhor, simplesmente porque a mídia prensada é de qualidade melhor que as mídias r e rw. Cansei de problemas de leitura e DRE's nos meus discos de Game Cube, no meu Wii, para que isso não acontecesse, só compro originais.

Uma coisa que as gravadoras esquecem é que o pirata não tem valor nenhum para colecionadores, a não ser que seja uma raridade totalemte ausente no mercado e  na internet. Um colecionador sempre vai comprar originais, sejam jogos, musicas, filmes etc...

Porém, parece que existe um certo preconceito das empresas e gravadoras estrangeiras quanto ao Brasil. Digo isso porque enquanto você encontra no exterior produtos com embalagens promocionais, duraveis, bonitas e bem-feitas, no Brasil você encontra a mesma obra, original, nas lojas por aí, em embalagens de plástico, sacos de papelão de quinta categoria e piores.
Você paga mais caro por um produto de "qualidade" inferior e sem nenhum brinde. Paga mais caro porque só de impostos e taxas paga 300% do valor do produto. Mas como no Brasil somos taxados de pirateiros pelas empresas estrangeiras, não temos o direito de adquirir nosso produto com uma embalagem decente, mesmo pagando 300% de seu valor.


Um caso real: 

Grande foi a minha alegria quando eu comprei o Street Fighter 4 original. Jogaço, o melhor de luta dessa década, sem dúvida, e eu ainda poderia jogar online com pessoas ao redor do mundo.
E qual não foi a minha tristeza ao me dar conta que, além de ter pago R$89,00 enquanto os americanos pagam apenas U$15,00 , o DVD veio numa embalagem de plástico pífio, vergonhoso.
E a minha fúria foi tremenda quando descobri que, por morar no Brasil, não poderia entrar na rede xLive para jogar online. Isso porque esta rede não tem suporte no Brasil, isso porque o Brasil é uma merda de covil de piratas e salteadores .... pelo menos essa é a impressão preconceituosa que eles tem da gente.
Enfim, tive que criar uma outra conta no live, com endereço americano, para poder jogar online um jogo que já está cheio de brasileiros jogando.



Gravadoras, editoras, mídia, acordem!

Não será possível, nem com pena de morte, evitar que livros, filmes e músicas se espalhem pela internet na velocidade do vento. Mesmo que a internet seja toda controlada, surgirão redes piratas no submundo da internet, como o são os canais de IRC. Basta uma criptografia para que ninguem saiba  o que está sendo compartilhado.
Mas é incrível que mesmo com todo mundo compartilhando a torto e a direito as gravadoras não ficam pobres. Isso porque quem compraria original caso a pirataria não existisse continuaria comparndo original. E quem compra o pirata porque ele existe, não deixa de comprar o original, porque não o compraria de qualquer forma.
Os piratas fazem um serviço de divulgação gratuito  e eficiente, e as gravadoras ainda reclamam? Tudo bem, exagerei, mas as vezes tenho essa impressão.
Querem ganhar mais dinheiro? Então porque não disponibilizar na internet filmes e seriados em baixa resolução para serem assistidos online ou baixados, e colocar nesses filmes e seriados propagandas da coca-cola, mcDonalds e outros? Porque não cobrar uma taxa para assistir o mesmo produto em alta resolução ainda com propagandas, e uma taxa ainda maior para assistir sem propagandas?
Porque não criar jogos e seriados voltados exclusivamente ao merchandising?
É porque esses dinossauros são admininstrados por velhos ignorantes que não sabem diferenciar a sua esquerda da sua direita, não enxergam um palmo na frente do nariz e não sabem ou não entendem nada sobre a nossa nova era digital, a era da informação e outros tantos clichês idiotas da mídia.
Não entendem suficientemente de internet para saber lucrar com ela.

A mídia da forma como a conecemos morreu com o advento da internet. A Internet é a nova televisão, porém uma televisão livre, sem as putarias, roubalheiras e hediondices de "Redes Globos" emporcalhadas com os fucinhos na mesma lama que políticos corruptos, tendo sido colocadas lá por ditadores de passados distantes.
A televisão e o radio morreram, assim como o jornal, mas desapareceram? Não, se adaptaram e continuam existindo, porque ainda tem e sempre terá mercado para eles. Sempre terá mercado para livros e jornais de papel, para quem gosta do cheiro e a textura do papel, para quem gosta de ler na praia sem perigo da areia, água ou maresia estragar seu kindle, ou ler no metrô, sem medo de ter seu gadget "esmagado" no brás.



Foi um prazer escrever sobre esse assunto, que gera tantas discussões e tantos falatórios vãos. Mais links para você ficar indignado:

http://br-linux.org/2010/mais-sobre-o-posicionamento-da-iipa-sobre-codigo-aberto-na-legislacao-brasileira/
http://br-linux.org/2010/associacao-antipirataria-dos-eua-poe-brasil-em-observacao-e-emite-recomendacoes/
http://info.abril.com.br/noticias/ti/brasil-pode-ser-punido-por-software-livre-26022010-31.shl
http://news.cnet.com/Bill-Gates-and-other-communists/2010-1071_3-5576230.html
e a tradução
http://www.linuxnarede.com.br/news/fullnews.php?id=607

Espero que depois dessas cacas legais mais pessoas tomem seu lado e abracem essa idéia.

terça-feira, 2 de março de 2010

Char, AnsiChar e Widechar

Um Char é um Byte, certo? Errado. Embora isso fosse fato antigamente, e inclusive fornecia grandes facilidades para quem trabalhava com C e C++, hoje a cena mudou.
Com a globalização e a internacionalização da TI e do desenvolvimento de software foram incorporados no nosso dia-a-dia a possibilidade ou necessidade de usar caracteres de idiomas diferentes,  e o Unicode.
Sendo assim, hoje temos mais de um tipo de char, e seus tamanhos são diferentes.

Um Char tem, no Lazarus 9.26 para Win32 i386 incontestáveis 8 bits, ou seja, um byte.

Um AnsiChar tem com certeza apenas um byte também.

Um WideChar tem dois bytes, podendo conter uma gama muito maior de caracteres.

Qual é a diferença entre um Char e um AnsiChar então? A resposta é que o AnsiChar é explicitamente um caracter de apenas um byte, enquanto que o Char pode mudar de acordo com a versão do Free Pascal ou a plataforma.

Por exemplo, no Delphi o Char já é, automaticamente, um caracter Unicode, de dois bytes.

Durante muito tempo softwares foram desenvolvidos assumindo-se que um Char = um Byte. Isso gerou a seguinte situação: Executáveis e bibliotecas compilados com "versões" diferentes do Char podem não ser mais compatíveis entre si. O PChar, que era um "vetor" aberto de caracteres terminados em #0, usando caracteres de dois bytes deve ser fechado com #0#0, e esse é apenas um dos exemplos que podem causar buffer overflows, e abrir brechas no seu software.

O contrário também é verdadeiro. Se o caracter "A" em um char de 8 bits corresponde ao #65, o caracter "A" usando um WideChar seria #65#0. Passando uma WideString (string formada por WideChars) para uma função em uma biblioteca que espere por uma AnsiString pode resultar em apenas o primeiro caracter ser reconhecido. Isso porque a string "Anzol", por exemplo, em widechar seria  formada por 10 bytes, a saber: #65#0#110#0#122#0#111#0#108#0  Repare que logo após cada byte conhecido nosso da tabela ASCII há um byte #0. Isso porque esses caracteres ASCII "comuns" também ocupam dois bytes, mas seus valores são baixos, por isso ocupam apenas o byte menos significativo (onde o menos significativo é o da direita).

Isso fará com que quando a função da DLL espera "Anzol" como AnsiString e recebe "Anzol" como widestring, a função reconheça o  #65 como "A" e o #0 como final da string.

Por isso, sempre que for usar caracteres, vetores de caracteres, ponteiros para caracteres e qualquer record ou estrutura que os contenha em sua formação use o SizeOf para saber o tamanho dos dados, em bytes. Nunca assuma que um Char = um Byte.

O exemplo em Lazarus pode ser compilado em Delphi e consiste apenas em uma form com um memo e botão. Serve para exemplificar o  uso de SizeOf.


unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    btVerifica: TButton;
    Memo1: TMemo;
    procedure btVerificaClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.btVerificaClick(Sender: TObject);
var
  a: Char;
  b: AnsiChar;
  c: WideChar;
begin
  Memo1.Lines.Add('Tamanho de um Char: ' + IntToStr(SizeOf(a)));
  Memo1.Lines.Add('Tamanho de um AnsiChar: ' + IntToStr(SizeOf(b)));
  Memo1.Lines.Add('Tamanho de um WideChar: ' + IntToStr(SizeOf(c)));
end;


initialization
  {$I Unit1.lrs}

end.


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)