Mostrando postagens com marcador TI. Mostrar todas as postagens
Mostrando postagens com marcador TI. Mostrar todas as postagens

quinta-feira, 30 de dezembro de 2010

Desinstalando o MySQL Connector Net 6.3.1

Passei umas três horas tentando instalar a versão mais nova do Connector do MySQL para .NET, mas quase não consegui desinstalar a versão anterior. Pois é... ainda tem esse inconveniente: para instalar a versão nova (6.3.5), tem que desinstalar a antiga (6.3.1)...

Pois bem, consegui realizar a façanha renomeando os diretórios Config para Config_ que ficam nas pastas:
- C:\Windows\Microsoft.NET\Framework64\Old_v4.0.21006 e
- C:\Windows\Microsoft.NET\Framework\Old_v4.0.21006

Só vi que devia fazer isso graças ao último comentário deste bug: http://bugs.mysql.com/bug.php?id=51407 :

"'C:\Windows\Microsoft.NET\Framework\Old_v4.0.30128'
renaming "config" folder to something else."

Uma informação adicional é que no log de eventos, apresenta-se o código de erro 1603, Mensagem: "Status de erro ou êxito da reconfiguração: 1603."

As ferramentas deviam nos fazer ganhar tempo, não perdê-lo!

Quis compartilhar meu "perrengue", para ajudar pessoas em situação parecida.

Feliz ano novo!

quarta-feira, 23 de setembro de 2009

Rowlock no SQL Server não funciona

Me deparei esses dias com esse problema. Até ontem achei que o with (rowlock) do SQL Server funcionava. Resolvi escrever aqui um passo-a-passo para comprovar que não funciona.

Nesse exemplo, o SQL Server precisa fazer um lock exclusivo na tabela referenciada por uma FK. Nesse exemplo, é a Tabela1. Quando o SQL Server faz um insert na Tabela2, e um delete na Tabela1, ele precisa locar toda a Tabela2, pois ela tem uma FK para a Tabela1. Como a Tabela2 está locada para inclusão, o delete fica aguardando a liberação.

Esse problema só é resolvido com a criação de índices. O rowlock parece não fazer efeito, mesmo com o índice.

Vamos entender melhor no passo-a-passo abaixo. Começamos com a criação do modelo de dados.

Tabela1

Chave1 (int) not null IDENTITY

Valor1 (varchar(10)) not null

Tabela2

Chave2 (int) IDENTITY

Valor2 (varchar(10)) not null

Chave1 (int) null, FK para Tabela1

Feito isso, vamos incluir 10 registros em cada tabela, mantendo a Chave1 em Tabela2 sempre nulo.

Exemplo de dados das tabelas:

Chave1

Valor1

1

VT1 - 1

2

VT1 - 2

3

VT1 - 3

4

VT1 - 4

5

VT1 - 5

6

VT1 - 6

7

VT1 - 7

8

VT1 - 8

9

VT1 - 9

10

VT1 - 10

Tabela 1: Exemplo da tabela 1

Chave2

Valor2

Chave1

1

VT2 - 1

NULL

2

VT2 - 2

NULL

3

VT2 - 3

NULL

4

VT2 - 4

NULL

5

VT2 - 5

NULL

6

VT2 - 6

NULL

7

VT2 - 7

NULL

8

VT2 - 8

NULL

9

VT2 - 9

NULL

10

VT2 - 10

NULL

Tabela 2: Exemplo da tabela 2

Executar os comandos em janelas distintas:

1. Janela 1

begin tran;

insert into Tabela2 with (rowlock) (valor2) values ('NT2 - 1')

2. Janela 2

begin tran;

delete from Tabela1 with (rowlock) where chave1 = 5

3. Aqui o problema já ocorre! A Janela 2 fica aguardando a execução da Janela 1.

4. Libere a Janela 1 com o comando: rollback tran;

5. Faça o mesmo na Janela 2.

O esperado seria locar apenas um registro no insert. Esse problema só pode ser resolvido se for colocado um índice na Tabela2 para a coluna Chave1.

domingo, 26 de abril de 2009

Os heróis da produtividade (em TI)

Nesses anos de trabalho já vi tentarem ou eu mesmo tentei muitas formas de aumentar a produtividade minha e das equipes nas quais trabalhei. Algumas dessas formas foram mais eficientes que outras. Na minha empresa, a Pitang, já foi feita uma pesquisa sobre os "Vilões da produtividade", o que foi bem proveitoso e serviu para abrir o tema para a discussão de todos. Dessa pesquisa, me indaguei: e os heróis?

A busca pela produtividade – ou a otimização dos serviços – é constante em mercados competitivos. As pessoas, métodos e ferramentas mais produtivas geram mais faturamento, para o mesmo custo, ou para um custo ligeiramente maior (um investimento que compensa o aumento do faturamento). Percebe-se que equacionar os agentes da produtividade com a balança financeira definitivamente não é fácil. Mas podemos simplificar a busca, de modo a facilitar essa conta.

A parte mais complicada da vida, mas a mais fácil da equação são as pessoas. Melhorar a produtividade do indivíduo significa capacitar para a execução da tarefa a ele designada. Capacitar envolve a educação formal nas universidades e o treinamento nos métodos e ferramentas que serão utilizados no trabalho. Uma pessoa que não sabe usar uma ferramenta vai levar certo tempo para aprendê-la sozinho. Aprendendo sozinho vai criar vícios que não teria se houvesse uma capacitação adequada.

A produtividade do indivíduo pode ser arruinada por problemas pessoais ou pela falta de comprometimento, para citar alguns. Esses aspectos não entram na conta, é de cada indivíduo.

A segunda parte são as ferramentas. Chamo de ferramentas aquelas que são utilizadas para auxiliar o trabalho e aquelas que compõem o software, que fazem parte da infraestrutura do software. Daquelas que auxiliam, existem as que fazem o trabalho e as que fazem o trabalho de forma mais eficiente. Só pra citar, existem umas que disponibilizam formas de refactoring e existem outras que implementam vários níveis de refactoring. No dia-a-dia, aquelas que têm os vários níveis podem melhorar a produtividade, executando um determinado refactoring de forma mais rápida. E para aquelas ferramentas que compõem o software não é muito diferente. Mas considero as que fazem o trabalho e aquelas que fazem o trabalho de forma simples. Exemplo: uma ferramenta que implementa uma tabela e uma outra que implementa uma tabela associada a uma fonte de dados. A última já lida diretamente com os dados, independentemente da forma que gera a apresentação da tabela. A primeira deixa que o desenvolvedor se preocupe em como apresentar os dados, em detalhes executados de forma mecânica.

A terceira parte são os métodos. Considero métodos tanto a forma de trabalho – o processo de desenvolvimento do software – quanto a arquitetura para o desenvolvimento. O processo de software determina quão simples será a designação de atividade e a extração das métricas do desenvolvimento. Esses são os principais fatores que podem impactar na produtividade do desenvolvedor do software. Um processo simples no qual podem ser incluídas, alteradas e removidas atividades tenderá a ser mais produtivo, pois a produção do software sempre requer a absorção de mudanças de forma rápida. A arquitetura do software pode determinar o esforço necessário para criar pontos de função. No final, o que vai importar para o cliente é:

  • Que o software atenda ao principal propósito dele. Para quem desenvolve é melhor gastar mais esforço no básico, no que é mais importante, do que se preocupar em fazer a mais. Agradar ao cliente significa fazer bem o que ele pediu.
  • Que o software seja rápido. Ninguém gosta quando um clique demora vários segundos.
  • Que o código tenha certa ordem. Todo software deve evoluir com o tempo, seja por mudanças no processo do cliente, seja por melhorias na interface com o usuário. Enfim, sempre há espaço para melhorar. Um código desordenado vai dificultar essas modificações do software.

A arquitetura do software está relacionada com a performance e a organização do código.

Desses três aspectos de produtividade do software minha impressão e no que acredito fortemente é na capacitação das pessoas. O desenvolvimento de software é um trabalho criativo, não pode ser considerado uma produção mecanizada. As pessoas determinam tanto a qualidade quanto o custo que aquele software vai ter. As ferramentas e métodos são meios complementares para alcançar a melhor produtividade, mas o básico mesmo é investir em capacitação. Se toda empresa tivesse um planejamento financeiro e de tempo para capacitação o resultado final é que todo o conglomerado de empresas alcançaria uma produtividade mundialmente competitiva, independemente se o investimento feito em determinada pessoa seja perdido pela saída dela para uma outra empresa. Acho que devemos repensar de quem é mesmo a responsabilidade de treinar os funcionários. Os heróis não são as pessoas, mas sim a capacidade de cada uma delas.