Out
01

Garbage collector - Coletor de lixo

Autor // Marcello Piola Holtz

O garbage collector, ou coletor de lixo, muitas vezes é ignorado pelos programadores e analistas, mas é um ponto importante a ser considerado.

 

O princípio básico de como um garbage collector funciona é:

  1. Determinar que objetos não mais serão utilizados no futuro.
  2. Liberar os recursos utilizados por esses objetos

Em linguagens mais antigas, esses recursos deveriam ser liberados manualmente, ficando a cargo do programador o controle de objetos não utilizados.
Com o garbage collector, encontrado em linguagens atuais como, por exemplo, JAVA, C# e a grande maioria das linguagens script, não temos mais que nos preocupar com a liberação de recursos enquanto desenvolvemos ( com exceção para celulares, ou aparelhos com hardware limitado , porém, será que a liberação manual não nos trás alguns benefícios?

A resposta é sim. Deixar o garbage collector trabalhar por nós significa perder processamento para verificar quais objetos não serão mais utilizados no futuro, o que não é uma tarefa tão simples se pensarmos em lógica.

Quando liberamos recursos no sistema manualmente, esse processo deixa de ser longo, logo, o processamento utilizado pelo garbage collector é menor e sua aplicação vai rodar mais rápido.

Em compensação, o programador tem um trabalho maior e a chance de bugs acontecerem também aumenta.

  • Bugs causados por ponteiros
  • Doubble free - Bug causado pela tentativa de liberar memória quando essa já está livre.
  • Memory leaks - Quando a tentativa de liberar memória falha, causando sua exaustão.
Add a comment
Set
26

Recursividade no SQL Server 2005

Autor // Renato Tarantelli

Aqueles que tem problemas em relacionar dados em um banco de dados onde há uma amarração por meio de árvore, segue uma boa dica de como utilizar querys recursivas no SQL Server.

Antes de mais nada vamos preparar a tabela que utilizaremos em nosso exemplo:

 CREATE TABLE Hierarquia (
    IdHierarquia INT PRIMARY KEY,
    IdHierarquiaPai INT
)

INSERT INTO Hierarquia VALUES (1,NULL);
INSERT INTO Hierarquia VALUES (2,4);
INSERT INTO Hierarquia VALUES (3,1);
INSERT INTO Hierarquia VALUES (4,1);
INSERT INTO Hierarquia VALUES (5,2);
INSERT INTO Hierarquia VALUES (6,4);
INSERT INTO Hierarquia VALUES (7,3);
INSERT INTO Hierarquia VALUES (8,1);
INSERT INTO Hierarquia VALUES (9,2);
INSERT INTO Hierarquia VALUES (10,1);
INSERT INTO Hierarquia VALUES (11,4);
INSERT INTO Hierarquia VALUES (12,2);
INSERT INTO Hierarquia VALUES (13,3);
INSERT INTO Hierarquia VALUES (14,1);
INSERT INTO Hierarquia VALUES (15,4);
INSERT INTO Hierarquia VALUES (16,3);
INSERT INTO Hierarquia VALUES (17,2);
INSERT INTO Hierarquia VALUES (18,2);
INSERT INTO Hierarquia VALUES (19,1);
INSERT INTO Hierarquia VALUES (20,1);
Criada a tabela e inserida seu elementos vamos a nossa query de recursividade:
WITH Filhos(IdHierarquia, IdHierarquiaPai, nivel, coluna)
AS
(
    -- Membro Ancora
    SELECT
        IdHierarquia,
        IdHierarquiaPai,
        0,
        CAST(IdHierarquia AS BINARY(900))
    FROM Hierarquia

    UNION ALL
   
    -- Membros Recursivos
    SELECT
       H.IdHierarquia,
        H.IdHierarquiaPai,
        F.nivel + 1,
        CAST(coluna + CAST(H.IdHierarquia AS BINARY(10)) AS BINARY(900))
    FROM Hierarquia H
        INNER JOIN Filhos F ON H.IdHierarquiaPai = F.IdHierarquia
)
-- Query com Resultado
SELECT
    IdHierarquiaPai,
    IdHierarquia,
    REPLICATE('|         ' , nivel)
        + (CAST(IdHierarquia AS VARCHAR(20))) AS [Arvore de Hierarquia]
FROM Filhos
ORDER BY coluna

Vamos entender oque foi feito.

1º  A utlização do WITH vem de um dos novos recursos atribuídos ao SQL Server 2005, onde é utilizado para criação de views temporárias,  válida somente dentro do seu batch atual. Esse recurso é denomindado de Common Table Expressions(CTE).

Sintaxe: 

WITH [name] AS (

[instrução SELECT]

)

 

2º A utilização de UNION ALL separando as querys a serem utilizadas, sendo que a primeira é a própria view criada a partir do primeiro elemento de comparação, no nosso caso:

   --  Membro Ancora
    SELECT
        IdHierarquia,
        IdHierarquiaPai,
        0,
        CAST(IdHierarquia AS BINARY(900))
    FROM Hierarquia

 

O primeiro SELECT é denominado de membro âncora, definindo o ponto de entrada da hirarquia.

O segundo SELECT é denominado de membros recursivos onde é incluído o CTE criado em JOIN com a tabela a ser buscado os elementos:

    --  Membros Recursivos
    SELECT
       H.IdHierarquia,
        H.IdHierarquiaPai,
        F.nivel + 1,
        CAST(coluna + CAST(H.IdHierarquia AS BINARY(10)) AS BINARY(900))
    FROM Hierarquia H
        INNER JOIN Filhos F ON H.IdHierarquiaPai = F.IdHierarquia  

Acho que valeu a dica.

Bom Divertimento!


referências:

Linha de Código

MSDN

Add a comment
Set
25

Ordenar DataTable usando um DataView

Autor // Fabiano Madeira

Segue um exemplo de ordenação de DataTable utilizando um DataView com C#.

// Imagine o Datatable abaixo já carregado com os dados

DataTable dados;

// Criaremos um DataView usando a DefaultView do
// DataTable (lembrando que o DataTable já deve estar
// carregado com os dados neste momento).

DataView dvOrdenado = dados.DefaultView;

// Usamos o método Sort do DataView passando como
// argumento o nome das colunas na sequência que
// deseja a ordenaçãodvOrdenado.Sort = "Coluna5, Coluna2";

// Um foreach para percorrer o DataView já ordenado

String coluna1;
String coluna2;

foreach (DataRow drDados in dvOrdenado.Table.Rows){
//Dentro do foreach pode fazer o que quiser com os dados
coluna1 = drDados["Coluna1"].ToString(); coluna2 = drDados["Coluna2"].ToString();
}


Bom divertimento. Add a comment
Set
25

Regex - Validação de e-mail

Autor // Fabiano Madeira

Segue uma ótima regex para validação de e-mails com C#.

// Método que retorna verdadeiro se o e-mail for válido e falso caso não.
private bool ValidaEmail(string email){

// Expressão regular que vai validar os e-mails

string emailRegex = @"^(([^<>()[\]\\.,;áàãâäéèêëíìîïóòõôöúùûüç:\s@\""]+"
+ @"(\.[^<>()[\]\\.,;áàãâäéèêëíìîïóòõôöúùûüç:\s@\""]+)*)|(\"".+\""))@"
+ @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|"
+ @"(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";

// Instância da classe Regex, passando como
// argumento sua Expressão Regular

Regex rx = new Regex(emailRegex);

// Método IsMatch da classe Regex que retorna
// verdadeiro caso o e-mail passado estiver
// dentro das regras da sua regex.

return rx.IsMatch(email);
}

// Não esqueça de no início da sua classe importar o pacote abaixo.
using System.Text.RegularExpressions;

Lembrando que o código acima está escrito em C#,  porém o uso de Regex é aceito na maioria das linguagens. Bom divertimento!

Add a comment