terça-feira, 7 de janeiro de 2014

Entendendo o que é virtualização

Em meu primeiro artigo, apresentei o conceito de virtualização, quando ou não utiliza-la e algumas características que a tornam uma tendência nas empresas. Neste artigo abordarei alguns conceitos importantes referentes à virtualização. Boa leitura!

Entendendo o que é virtualização

Tipos de virtualização

Este artigo iremos apresentar os tipos de virtualização existentes. Basicamente temos dois tipos: por hardware e por software. A seguir, será apresentado detalhes de cada um. Boa leitura!!

Veja em: Tipos de virtualização

História da Virtualização

Dando continuidade a série de artigos sobre virtualização, iremos agora mostrar um pouco sobre a história da mesma, e alguns momentos marcantes, que tornaram hoje, a virtualização um tema tão requisitado. Boa leitura!


História da virtualização

O que é virtualização

Este foi o meu primeiro artigo que escrevi no portal Projetos e TI. O objetivo deste é apresentar uma visão geral sobre o que é virtualização e os benefícios que podem trazer, quando se deve ou não virtualizar um ambiente computacional.

Confira: O que é virtualização

sexta-feira, 7 de dezembro de 2007

Ubuntu Server Edition JeOS - Ubuntu para virtualização de servidores

A Canonical Ltda, responsável pelo Ubuntu Linux, lançou uma versão especifica para virtualização de servidores: a Ubuntu Server Edition JeOS.
A JeOs, é uma variação do seu SO versão server, configurado especificamente para servidores virtuais.
Feito especificamente para virtualização, otimizado para VMWare ESX, VMWare Server, ocupa menos espaço em disco e é mais eficiente nestes ambientes, do que versões não otimizadas para virtualização.

Pode ser baixada no site: http://cdimage.ubuntu.com/jeos/

Dica Delphi: Ordenando StringGrid clicando no título - crescente e decrescente

Essa dica é pra galera que programa em Delphi. Quem já se arriscou em usar o StringGrid. Ele não tem recurso nativo para ordenar os campos, clicando no título da coluna. Alias, clicando em seu titulo, nem realiza o movimento de 'clicado', como em outros componentes, tais como o DBGrid, por exemplo.
Por isto, com o auxilio de algumas soluções na internet, montei algumas funções, que ao clicar no título da coluna, ele ordena em ordem crescente; clicando novamente, em decrescente, além de simular o efeito de 'clicado'! Essa solução foi inspirada em soluções de Cristiano Kliemann (http://www.cristianok.hpg.com.br) e no site http://www.clubdelphi.com/foros/showthread.php?t=21456.

  • Na seção type:

type
TSGSortCompareProc = function(SG: TStringGrid; Col, Row1, Row2: Integer): Integer;

  • Crie as seguintes funções:

procedure SGQuickSort(SG: TStringGrid; L, R: Integer;
SCompare: TSGSortCompareProc; Col: Integer);
var
I, J, C, M: Integer;
begin
repeat
I := L;
J := R;
M := (L + R) shr 1;
repeat
while SCompare(SG, Col, I, M) < 0 do
Inc(I);
while SCompare(SG, Col, J, M) > 0 do
Dec(J);
if I <= J then
begin
for C := 0 to SG.ColCount - 1 do
SG.Cols[C].Exchange(I, J);
if I = M then
M := J
else
if J = M then M := I;
Inc(I);
Dec(J);
end;
until I > J;
if L < J then
SGQuickSort(SG, L, J, SCompare, Col);
L := I;
until I >= R;
end;



function ComparaString(SG: TStringGrid; Col, Row1, Row2: Integer): Integer;
begin
Result := AnsiCompareText(SG.Cells[Col, Row1], SG.Cells[Col, Row2]);
end;

function ComparaStringInvertido(SG: TStringGrid; Col, Row1, Row2: Integer): Integer;
begin
Result := AnsiCompareText(SG.Cells[Col, Row2], SG.Cells[Col, Row1]);
end;

function ComparaNumeros(SG: TStringGrid; Col, Row1, Row2: Integer): Integer;
var a,b : real;
begin
try a := StrToFloat(SG.Cells[col,row1]); except a := 0; end;
try b := StrToFloat(SG.Cells[col,row2]); except b := 0; end;
Result := Round( (a - b)*100000 );
end;

function ComparaNumerosInvertido(SG: TStringGrid; Col, Row1, Row2: Integer): Integer;
var a,b : real;
begin
try a := StrToFloat(SG.Cells[col,row1]); except a := 0; end;
try b := StrToFloat(SG.Cells[col,row2]); except b := 0; end;
Result := Round( (b - a)*100000 );
end;

function ComparaData(SG: TStringGrid; Col, Row1, Row2: Integer): Integer;
var a, b: TDate;
begin
try a:=StrToDate(SG.Cells[Col,Row1]); except a := Date(); end;
try b:=StrToDate(SG.Cells[Col,Row2]); except b := Date(); end;
Result := round(a - b ) ;
end;

function ComparaDataInvertido(SG: TStringGrid; Col, Row1, Row2: Integer): Integer;
var a, b: TDate;
begin
try a:=StrToDate(SG.Cells[Col,Row1]); except a := Date(); end;
try b:=StrToDate(SG.Cells[Col,Row2]); except b := Date(); end;
Result := round(b - a ) ;

end;

procedure StrGridSort(SG: TStringGrid; Col: Integer; tipo: integer; decrescente: boolean; total: boolean);
var linhas: integer;
begin
if total then
linhas := SG.RowCount - 2
else
linhas := SG.RowCount - 1;
if (tipo=1) then //caso for numerico
begin
if decrescente then //Comeca pela linha 2 porque a Linha 1 é usada para definir o tipo
SGQuickSort(SG, 2, linhas, @ComparaNumerosInvertido, Col)
else
SGQuickSort(SG, 2, linhas, @ComparaNumeros, Col);
end
else if (tipo=2) then//caso for string
begin
if decrescente then
SGQuickSort(SG, 2, linhas, @ComparaStringInvertido, Col)
else
SGQuickSort(SG, 2, linhas, @ComparaString, Col);
end
else //caso for data
if decrescente then
SGQuickSort(SG, 2, linhas, @ComparaDataInvertido, Col)
else
SGQuickSort(SG, 2, linhas, @ComparaData, Col);
end;

  • PARA UTILIZAR AS FUNÇÕES:
Declare as seguintes variaveis na seção private do form:
_cod, GiRow, GiCol, coluna : integer;
GCelda : TRect;

Para ordenar a StringGrid, utiliza-se a seguinte procedure:

StrGridSort(SG: TStringGrid; Col: Integer; tipo: integer; decrescente: boolean; total: boolean);

Onde:
SG: O Nome da StringGrid
Col: A coluna que irá ser utilizada como refetencia
tipo: 1: Conteúdo numérico; 2: String; 3: Data
decrescente: True: ordena em ordem decrescente. False: Ordem Crescente
Total: True: Não ordena a ultima linha. False: Ordena a ultima linha

Ao criar a StringGrid, a linha 1 é utilizada para definir o tipo do campo.
Por exemplo, ao criar uma StringGrid com 3 campos: Codigo(numerico), Nome(String),Data_Emissao(Data),
usa-se o seguinte codigo:

grid.Cells[0,1] := 'N';
grid.Cells[1,1] := 'S';
grid.Cells[2,1] := 'D';
grid.RowHeights[1]:=0;

  • No Evento OnMouseDown do StringGrid:

procedure StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
Valor :String;
tipo : integer;
LGcCoord: TGridCoord; //Define as coordenadas do mouse na grid
begin

LGcCoord := TCustomGrid(StringGrid1).MouseCoord(x,y);
GiCol := LGcCoord.X;
GiRow := LGcCoord.Y;
if (GiRow = 0) And (Button = mbleft) And (GiCol <> -1) then
Begin
with StringGrid1 do
Begin
GCelda := CellRect(GiCol,0);
Valor := Cells[GiCol, 0];
Canvas.Font := Font;
Canvas.Brush.Color := clInactiveCaptionText;
Canvas.FillRect(GCelda);
Canvas.TextRect(GCelda, GCelda.Left + 2, GCelda.Top + 2, Valor);
DrawEdge(Canvas.Handle, GCelda, 10, 2 or 4 or 8);
DrawEdge(Canvas.Handle, GCelda, 2 or 4, 1);
End;

if (StringGrid1.Cells[GiCol,1]='N') then
tipo := 1
else
if (Grid.Cells[GiCol,1]='S') then
tipo := 2
else
tipo := 3;

if ( (GiCol > 0) and (GiRow < (Grid.RowCount-1)) ) then begin if (GiCol=coluna) then begin StrGridSort(StringGrid1,GiCol,tipo, true, false); coluna := -1; end else begin StrGridSort(StringGrid1,GiCol,tipo, false,false); coluna := GiCol; end; end; end; end;
  • No evento OnMouseUp:
procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var Valor :String; begin if (GiRow = 0) And (Button = mbleft) And (GiCol <> -1) then
Begin
with StringGrid1 do
Begin
Valor := Cells[Gicol, 0];
Canvas.Font := Font;
Canvas.Brush.Color := clInactiveCaptionText;
Canvas.FillRect(GCelda);
Canvas.TextRect(GCelda, GCelda.Left + 2, GCelda.Top + 2, Valor);
DrawEdge(Canvas.Handle, GCelda, 4, 4 or 8);
DrawEdge(Canvas.Handle, GCelda, 4, 1 or 2);
GCelda := StringGrid1.CellRect(1, 1);
End;
End;

end;

sexta-feira, 30 de novembro de 2007

Ponha um tubarão em sua vida

Os japoneses sempre adoraram peixe fresco. Porém, as águas perto do Japão não produzem muitos peixes há décadas. Assim, para alimentar a sua população, os japoneses aumentaram o tamanho dos navios pesqueiros e começaram a pescar mais longe do que nunca. Quanto mais longe os pescadores iam, mais tempo levava para o peixe chegar. Se a viagem de volta levasse mais do que alguns dias, o peixe já não era mais fresco. E os japoneses não gostaram do gosto destes peixes.
Para resolver este problema, as empresas de pesca instalaram congeladores em seus barcos. Eles pescavam e congelavam os peixes em alto-mar. Os congeladores permitiram que os pesqueiros fossem mais longe e ficassem em alto mar por muito mais tempo. Os japoneses conseguiram notar a diferença entre peixe fresco e peixe congelado e, é claro, eles não gostaram do peixe congelado.
Então, as empresas de pesca instalaram tanques de peixe nos navios pesqueiros. Eles podiam pescar e enfiar esses peixes nos tanques, como 'sardinhas'. Depois de certo tempo, pela falta de espaço, eles paravam de se debater e não se moviam mais.
Eles chegavam vivos, porém cansados e abatidos. Infelizmente, os japoneses ainda podiam
notar a diferença do gosto. Por não se mexerem por dias, os peixes perdiam o gosto de frescor. Os consumidores japoneses preferiam o gosto de peixe fresco e não o gosto de peixe apático.
Como os japoneses resolveram este problema? Como eles conseguiram trazer ao Japão peixes com gosto de puro frescor?Antes da resposta, leia o que vem abaixo: Quando as pessoas atingem seus objetivos - tais como: quando encontram uma namorada maravilhosa, quando começam com sucesso numa empresa nova, quando pagam todas as suas dívidas, ou o que quer que seja, elas podem perder as suas paixões. Elas podem começar a pensar que não precisam mais trabalhar tanto, então, relaxam.
Elas passam pelo mesmo problema dos ganhadores de loteria, que gastam todo seu dinheiro,
o mesmo problema de herdeiros, que nunca crescem, e de donas-de-casa, entediadas, que ficam dependentes de remédios de tarja preta.
Para esses problemas, inclusive no caso dos peixes dos japoneses, a solução é bem simples. L. Ron Hubbard observou, no começo dos anos 50: 'O homem progride, estranhamente, somente perante a um ambiente desafiador'. Quanto mais inteligente, persistente e competitivo você é, mais você gosta de um bom problema.
Se seus desafios estão de um tamanho correto e você consegue, passo a passo, conquistar esses desafios, você fica muito feliz. Você pensa em seus desafios e se sente com mais energia.Você fica excitado e com vontade de tentar novas soluções.
Você se diverte. Você fica vivo! Para conservar o gosto de peixe fresco, as empresas de pesca japonesas ainda colocam os peixes dentro de tanques, nos seus barcos.Mas, eles também adicionam um pequeno tubarão em cada tanque. O tubarão come alguns peixes, mas a maioria dos peixes chega 'muito vivo'. E fresco no desembarque. Tudo porque os peixes são desafiados, lá nos tanques.
Portanto, como norma de vida, ao invés de evitar desafios, pule dentro deles. Massacre-os. Curta o jogo. Se seus desafios são muito grandes e numerosos, não desista, se reorganize! Busque mais determinação, mais conhecimento e mais ajuda.
Se você alcançou seus objetivos, coloque objetivos maiores. Uma vez que suas necessidades pessoais ou familiares forem atingidas, vá ao encontro dos objetivos do seu grupo, da sociedade e, até mesmo, da humanidade. Crie seu sucesso pessoal e não se acomode nele. Você tem recursos, habilidades e destrezas para fazer a diferença.

'Ponha um tubarão no seu tanque e veja quão longe você realmente pode chegar'.

Sucesso!

(autor desconhecido)