quarta-feira, 22 de junho de 2011

Contando e apagando linhas no Azure Storage Emulator

Eu *sei* que a gente não deve fazer isto. Estamos importando lotes relativamente grandes de linhas para tabelas dentro do Storage Emulator do Azure. Durante os testes, várias vezes temos que contar as linhas importadas durante a execução da importação, e apagar as linhas das tabelas entre os testes. O certo seria fazer isto usando a API de acesso ao Azure Table Storage (ATS), mas é lento e tem que lidar com o tal do continuation token toda vez que a tabela tem mais de 1.000 linhas. Então criei uma função e uma procedure no banco do Storage Emulator pra facilitar minha vida.

O que a gente não deve fazer é acessar diretamente o BD do Storage Emulator. Ele é um BD simples, mas é sempre não-recomendado acessar as estruturas internas de qualquer ferramenta, pois elas podem mudar de uma versão pra outra, e aí seus "caminhos alternativos" (também conhecidos como "bacalhaus") páram de funcionar.

Todas as "tabelas" que você cria no Storage Emulator são guardadas na verdade em uma única tabela chamada "TableRow" no banco instalado pelo Storage Emulator. Este banco deve ter um padrão de nomenclatura, na minha máquina o nome dele é "DevelopmentStorageDb20090919". Ou é o dia da release do SDK do Azure, ou é o dia que uma filha minha quebrou o braço - ultimamente parece que eu vivo no hospital consertando essas criaturas.

Bem, a estrutura da tabela é:

CREATE TABLE [dbo].[TableRow](
   [AccountName] [varchar](24) NOT NULL,
   [TableName] [varchar](63) NOT NULL,
   [PartitionKey] [nvarchar](256) NOT NULL,
   [RowKey] [nvarchar](256) NOT NULL,
   [Timestamp] [datetime] NOT NULL,
   [Data] [xml] NULL,
)

A coluna TableName define a que "tabela" do ATS a linha pertence, PartitionKey e RowKey você já sabe o que é senão provavelmente não estaria lendo esse post, e Data (veja o tipo: xml) contém uma "tripa" XML com os valores para cada coluna da tabela.

Aí fica fácil. A função pra contar linhas de uma tabela do ATS é:

CREATE FUNCTION NumeroLinhas(@nomeTabela varchar(200))
RETURNS int
AS
BEGIN
 RETURN (SELECT COUNT(*) FROM TableRow (NOLOCK) WHERE TableName = @nomeTabela)
END
GO

A procedure para apagar os registros de uma tabela é:

CREATE PROC ApagaRegistros(@nomeTabela varchar(200))
AS
 DELETE FROM TableRow WHERE TableName = @nomeTabela
GO

Agora você pode contar as linhas de uma tabela no Storage Emulator executando

SELECT dbo.NumeroLinhas('Produtos')

e apagar as linhas desta tabela com

ApagaRegistros 'Produtos'

Bem mais rápido que fazer pela API. Claro que "só faça isso em casa": no seu ambiente de testes.



PS: Não é um cenário comum, mas as funções não levam em conta quando há mais de uma conta registrada. Para estes casos, o "WHERE" na função e na procedure devem fazer referência também à coluna "AccountName", para que seja especificada a conta na qual as operações devem ser feitas.

sexta-feira, 17 de junho de 2011

Porque não vou comprar o WinC++ na madrugada do seu lançamento

Humm… Sexta-feira. 17:50. Silencio em casa, as meninas ainda não chegaram da escola. Estou lendo uma thread de discussão sobre o WinC++ – a implementação que a Microsoft irá lançar da nova versão do C++.

Após ler a thread, que – como sempre em discussões de linguagens, desde o VB x Delphi – descambou para tons um pouco mais irritados, dado que o assunto sempre é discutido com um fervor beirando o religioso, enviei os pontos principais com meus comentários para nossa lista interna, que reproduzo aqui:

Parece só geek tentando mostrar que conhece mais que o outro. Discutir linguagem de programação pra mim é igual discutir qual é o tipo de calçado que vai otimizar sua ida à padaria comprar pão. Se você mora na Sibéria, tem que ter uma bota quente e anti-derrapante; se você mora em Nápoles e a padaria fica do outro lado do Vesúvio você tem que ter uma bota a prova de fogo. Mas fora essas situações específicas, qualquer calçado que você escolher dá conta do serviço. As questões importantes são outras: como eu chego na padaria? Ela tá aberta a essa hora? E etc.

Se linguagem fosse *o* fator decisivo no desenvolvimento  de projetos, desenvolvedor ganhava mais que gerente de projetos. Vai vir um C++ novo, vai ter o seu nicho, mas se 95% das empresas que desenvolvem software adotarem C++ novo no lugar das suas atuais linguagens de programação, duvido que vão aumentar significativamente o desempenho de entregas. Agora se investirem em processo e gerenciamento deste processo, aí sim eu aposto que vai haver ganhos.

Isso daí também me parece a Microsoft fazendo o que ela faz melhor: barulho pra vender. Lembram das filas nas lojas toda vez que a MS lança uma versão nova do Windows? Há vários debates sobre a qualidade técnica da M$, mas acho que ninguém duvida da capacidade de marketing dela...

No artigo do The Register sobre o C++, uma coisa me chamou a atenção. “E enquanto novas linguagens nasceram desde então, C++ permaneceu. Java é a única a ganhar em popularidade […]”. Realmente, estas duas linguagens são que nem o U2: agradam a mais de 20 anos, continuam agradando, e parece que continuarão. O que faz uma linguagem de programação ser bem sucedida? Vamos ver alguns pontos:

  • Facilidade de aprendizado e simplicidade no uso. Grande parte dos desenvolvedores são, em parte ou totalmente, auto-didatas. Quero abrir a IDE, pegar uns walkthrough’s no Google, começar com o “Hello World” e rapidamente estar fazendo minha agendinha telefônica, com tela Web e acesso a BD.
  • Riqueza de recursos. “Linguagem de programação” hoje não é só a linguagem em si. E a IDE, o quê ela provê de recursos? É fácil instalar a aplicação, depois que ela está pronta? As bibliotecas são ricas, ou tenho que construir um monte de coisa “na mão”? ORM? TDD? ALM?
  • Portabilidade. Nesse mundão sem porteira de hoje, tem hardware de tudo que é jeito. Tem um monte de sistemas operacionais. Quer um dos fatores de sucesso do Java? Taí.
  • Marketing. Bem, isso não é só pra linguagem de programação, né?

bulabulaNo final das contas, a “corrida” entre as linguagens de programação é como aquela brincadeira de pular carniça que a gente fazia quando era criança. X implementa 1, 2 e 3 na sua linguagem; Y vai e copia 1 e 2, implementa 3 melhorado, e ainda coloca 4 e 5. X atualiza sua linguagem pra colocar 6, além de incluir as últimas novidades de Y (sempre com outro nome ;-). E por aí vai… Vide Java e Microsoft.NET:

  • Olhando mais de perto para alguns aspectos de arquitetura do .NET:
    • Common Language Runtime: ambiente de execução das aplicações .NET. (Java: Java Virtual Machine).
    • MSIL: Código intermediário, independente de harware, resultante da compilação das linguagens de alto nível. (Java: bytecode)
  • Agora o Java:
    • É um C++ simplificado, portável e com ótima penetração de marketing no mundo open source.
    • Não sou especialista em Java, mas certamente a linguagem deve ter puxado conceitos bem sucedidos de outras.

Isto é lógico. É esperado. E, de várias formas, é bom.

Ou seja: legal que vem aí um novo C++. Espero que ele seja mais fácil de aprender e simples de usar do que seu predecessor. O WinC++ certamente incorporará a riqueza de recursos das outras linguagens do .NET Framework. Com a popularização dos tablets e os investimentos da Microsoft no Windows Phone, certamente veremos algum mecanismo para aumentar a portabilidade desta linguagem. E o marketing, esse não tenho dúvidas: será bem feito. Até eu já estou fazendo marketing pra ela…

Mas essa linguagem vai mudar minha vida? Hard to believe. Vou ficar sentado confortavelmente no meu C# pra esperar no que vai dar (acredite ou não, o trocadilho apareceu sem querer), e na próxima vez que eu chegar em casa e as meninas ainda não tiverem chegado da escola, quem sabe eu não faço o meu “HelloWorld.wincpp”… :-)

[]s,
GB

Isso é uma sujeira no monitor ou é o FireFox?

Ao testar uma aplicação Azure nossa em vários browsers, abri a mesma no FireFox. Então vi uma “sujeirinha” no monitor e estou distraidamente mexendo na aplicação com uma mão e tentando limpar a sujeirinha com a outra:

sujerinha-fechadaTão vendo a “sujerinha” ali na barra superior da janela?

“Uai”, pensei. “Essa sujeirinha não sai nem com cuspe no dedo?” (depois de fazer a referida nojeira). Então levei o mouse até lá e olha a surpresa ao clicar na sujeira:

sujerinha-aberta
A “sujeirinha” abriu!!!

Poizé, a "sujeirinha” era o atalho pra o “Grupo de abas” do FireFox. Nem sei pra quê funciona, mas ô interfacezinha mal-feita essa! Nessa era de WIndows 7, iPhone, WPF e SilverLight, o pessoal voltou a bolar mecanismos de interface meio “mirabolantes”. Minha política pra construção de telas é: atenha-se ao padrão. Sim, tem situações específicas nas quais uma interface mais bem bolada encanta e facilita, mas na maioria dos casos o usuário vai precisar de menos treinamento (e menos helpdesk) se ele encontrar as funcionalidades nas suas telas da mesma forma que ele as encontra em Word, Excel, e outras aplicações que ele está acostumado a usar. Cuidado pra sua interface não ficar parecendo uma sujerinha no monitor… ;-)

[]s,
GB