sexta-feira, 31 de julho de 2009

Microsoft Future Vision

Incrível este vídeo, dá uma bela ideia de como será a vida digital no futuro. Se reparar, a data sugerida em uma das telas é 2018. Esses recursos já são todos conhecidos, tecnologias como Wave, Surface, baseadas em WPF. Vários filmes, como The Ilsand, mostram recursos como o Surface. Esse filme inclusive, rola boatos, teve $ajuda$ da MS. O Surface é mostrado na sala do médico, a mesa. Outro é o Minority Report.



Saiba mais:

Microsoft Surface

Microsoft Wave

WPF

Silverlight

quinta-feira, 30 de julho de 2009

Livro de Emerson Facunte Free


O Facunte disponibilizou todos os capítulos do livro Delphi 7 Internet e Banco de Dados em PDF (gratuito).

Google Wave

Espero que um dia a Google faça um robozinho que consiga fechar uma revista, do início ao fim, contatando colaboradoes, organizando planilhas, cobrando autores, controlando prazos, editando artigos etc.

Google Wave

Falta mão de obra em TI

Setor em crescimento oferece cada vez mais vagas para profissionais qualificados

A 20ª Pesquisa Sobre Administração de Recursos de Informática, realizada pela Fundação Getúlio Vargas entre agosto do ano passado e abril de 2009 com duas mil empresas (incluindo 60% das 500 maiores corporações do país), comprova o crescimento do setor de Tecnologia da Informação no Brasil. De acordo com o estudo, 6% do faturamento líquido das companhias foi investido em TI – quase o dobro do investimento feito pelas empresas dez anos atrás.

Recentemente, o IBGE registrou em suas pesquisas sobre emprego que o setor de TI sofreu um aumento no número de vagas da ordem de 40% nos últimos três anos, devido não apenas à expansão econômica e ao uso da tecnologia, como também ao crescimento da exportação de serviços tecnológicos.

Mesmo com todos esses dados favoráveis, as empresas dessa área enfrentam um grande revés: a falta de mão de obra especializada. Para a supervisora de Recursos Humanos da HBSIS, empresa blumenauense desenvolvedora de soluções corporativas na área de TI, existe no mercado um grande número de candidatos, no entanto, com pouca expertise. “Como a tecnologia é ágil, assim são as ambições dos jovens. Cada vez mais, procuram novos conhecimentos e desafios, faltando mergulhar e amadurecer nos processos em que se encontram”, aponta.

Falta mão-de-obra qualificada – Na opinião de Ximena Luengo, a mão de obra qualificada é essencial para as empresas, porque soma novos recursos. Segundo ela, o que diferencia os profissionais são características como conhecimento e maturidade, além do perfil comportamental. “Às vezes o conhecimento e a experiência são bons, mas os comportamentos do profissional são nocivos à equipe, prejudicando o resultado final”, assinala a supervisora de RH. Com uma mão de obra capacitada para cumprir as exigências do mercado, o setor de TI tende a se tornar cada vez mais forte, contribuindo para o fortalecimento das empresas e maior geração de emprego no país.

A influência da crise – Para os especialistas, não foram todas as empresas de TI que sofreram com a crise mundial. “O impacto vem dos projetos que estavam sendo desenvolvidos e o planejamento que a empresa teve frente à crise”, destaca Luengo. Na opinião dela, o momento é de desafio, dentro e fora das empresas. Isso porque o profissional pode contribuir para melhorar o desempenho corporativo e, por outro lado, gerenciar sua carreira com as inúmeras possibilidades que a área de TI oferece.

Números do mercado de TI

- O capital humano representa para a tecnologia da informação 70% de seu desenvolvimento.
- O mercado brasileiro de software e de serviços movimentou, em 2007, US$ 11,12 bilhões, segundo pesquisa divulgada pela Associação Brasileira de Empresas de Software (Abes).
- Um levantamento da Catho aponta que será necessário formar 100 mil profissionais para atender a demanda dos próximos dois anos.
Para a Abes, o déficit será de 50 mil técnicos, graduados, especialistas e pós-graduados.
- Filipe Rizzo, da Politec S.A., é menos otimista. Segundo ele, “vão faltar 200 mil profissionais até 2010, 40 mil técnicos - aqueles que têm entre 16 e 24 anos”. Para esse profissional iniciante, são oferecidos, atualmente, salários iniciais de R$ 1,5 mil a R$ 2 mil.
- A média brasileira é de um computador para cada três habitantes, cenário melhor que a média no resto do planeta – a previsão, em três anos, é que o número chegue a 100 milhões de PCs, ou seja, um a cada dois brasileiros.

Fonte: PRESSE Comunicação Empresarial

quarta-feira, 29 de julho de 2009

dbExpress Query Editor

Um plug-in que criei para criar automaticamente conexões dbExpress, tudo visualmente.

Artigo disponível no site da DevMedia

Código-fonte disponível no site da Embarcadero (CodeCentral)

Guinther Pauli
Editor Geral Revista ClubeDelphi
Editor Geral Revista .net Magazine

segunda-feira, 27 de julho de 2009

LINQ to NHibernate

Lançado o LINQ to NHibernate

Leia um Tutorial

Configurando o Team Foundation Server e VSTS

O Rodrigo Sendin, colaborador e membro da comissão editorial da .net Magazine, postou em seu blog um artigo muito interessante, e quase inédito, de como configurar o TFS. Como são vários passos e prerequisitos, o tutorial é uma preciosidade para guardar nos favoritos:

Configurando o Team Foundation Server e VSTS

Guinther Pauli
Editor Geral .net Magazine Brasil

sexta-feira, 24 de julho de 2009

.net Magazine 63



Lançada mais uma edição da .net Magazine! Confira a lista de artigos:

Tipos implícitos e anônimos - Por: RODRIGO SENDIN
ASP.NET Dynamic Data - Por: RODRIGO SENDIN
Trabalhando com Azure Blobs - Por: Giovanni Bassi
Código de barras na plataforma .Net - Por: Drausio Henrique Chiarotti
Criptografia - Por: Carlos Henrique
Projetando com Generics - Por: Marco Antonio Correa Alves
Utilizando Kanban com a metodologia ágil SCRUM - Por: Marcelo Martins e Fábio Câmara
Construa uma Aplicação 100% OO – Parte 3 - Por: Guilherme Vieira e Fernando Antonio Diniz Corrêa
Desvendando os Data Controls em ASP.NET - Por: Thomas Alexander Semple

Boa leitura!

Guinther Pauli
Editor Geral .NET Magazine Brazil

Cursos em Andamento

Estou com vários cursos em andamento em nosso portal www.devmedia.com.br

Delphi Prism - Curso em vídeo aulas
C# e OO - Curso em vídeo aulas
Delphi Prism - Language - Revista ClubeDelphi
Delphi OO - Revista ClubeDelphi

Vaga para programador Delphi em Londrina/PR

A Info e Cia ampliando o quadro de funcionários contrata:

- Programador Delphi

Conhecimentos Necessários:
- Conhecimento em Lógica de Programação
- Linguagem de Programação Delphi
- Desejavel conhecimento em Bancos de Dados (SQL Server)

Remuneração compativel com a função

Interessados favor encaminhar curriculo para o email empregoinhotmail.com
especificando no assunto do email “Delphi”.

A vaga anunciada é para trabalhar em LondrinalPr.

Acesse nosso site e conheça nossos Sistemas de Gestão Empresariais.

www.infoeciasoftware.com.br

Chamando métodos assíncronos no servidor com AJAX

Um exemplo simples, um Web Form ASPX que cadastra dados no BD de forma assíncrona, ou seja, envia os dados com XML-HTTP sem dar postback no form inteiro. É fácil:

Web Form ASPX:
Formulário com TextBoxs e Labels e um botão HTML (Input)


   1: <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Cadastro.aspx.cs" Inherits="Cadastro" %>
   2: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   3: <html xmlns="http://www.w3.org/1999/xhtml">
   4: <head runat="server"><title></title>
   5:     <style type="text/css">
   6:         .Texto
   7:         {
   8:             font-family: Tahoma;
   9:             font-size: small;
  10:             font-weight: bold;
  11:         }
  12:         .Titulo
  13:         {
  14:             font-family: Tahoma;
  15:             font-weight: bold;
  16:             color: #0066FF;
  17:         }
  18:     </style>
  19: </head>
  20:     <body>
  21:         <form id="Form1" runat="server">
  22:             <span class="Titulo">Cadastro de Usuários</span><br/>
  23:             <asp:Label id="Label2" runat="server" CssClass="Texto">Login</asp:Label>
  24:             <br/>
  25:             <asp:TextBox id="tbLOGIN" runat="server"></asp:TextBox>
  26:             <br/>
  27:             <asp:Label id="Label3"  runat="server" CssClass="Texto">Nome</asp:Label>
  28:             <br/>
  29:             <asp:TextBox id="tbNOME" runat="server"></asp:TextBox>
  30:             <br/>
  31:             <asp:Label id="Label4"  runat="server" CssClass="Texto">Senha</asp:Label>
  32:             <br/>
  33:             <asp:TextBox id="tbSENHA" runat="server" TextMode="Password"></asp:TextBox>
  34:             <br/>
  35:             <asp:Label id="Label6" runat="server" CssClass="Texto">E-mail</asp:Label>
  36:             <br/>
  37:             <asp:TextBox id="tbEMAIL" runat="server" Width="190px"></asp:TextBox>            
  38:             <br />
  39:             <br/>            
  40:             <asp:Button id="Button1" runat="server"
  41:                 Text="Cadastrar" onclick="Button1_Click"> 
  42:             </asp:Button>
  43:             <input type="reset" value="Limpar"/>
  44:             </form>    
  45:     </body>
  46: </html>
  47:  
  48:  


Script na página ASPX


   1: <script type="text/javascript">
   2:     function pageLoad()
   3:     {
   4:         $addHandler( $get("Button2"), "click", Insert );
   5:     }
   6:     function Insert() {
   7:         WebService.Insert(
   8:             $get("tbLOGIN").value,
   9:             $get("tbNOME").value,
  10:             $get("tbSENHA").value,
  11:             $get("tbEMAIL").value,
  12:             Sucesso,Erro);
  13:     }
  14:     function Sucesso() {
  15:         alert("Usuário inserido com sucesso");
  16:     }
  17:     function Erro() {
  18:         alert("Erro ao inserir usuário");
  19:     }
  20: </script>
  21:  


Web Service


   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.Services;
   6:  
   7: /// <summary>
   8: /// Summary description for WebService
   9: /// </summary>
  10: [WebService(Namespace = "http://tempuri.org/")]
  11: [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  12: // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
  13: [System.Web.Script.Services.ScriptService]
  14: public class WebService : System.Web.Services.WebService {
  15:  
  16:     public WebService () {
  17:  
  18:         //Uncomment the following line if using designed components 
  19:         //InitializeComponent(); 
  20:     }
  21:  
  22:     [WebMethod]
  23:     public void Insert(
  24: String LOGIN, String NOME, 
  25: String SENHA, String EMAIL)
  26:     {
  27:         var con = new SqlConnection(ConStr);
  28:         var cmd = new SqlCommand(){
  29:             CommandText = "INSERT INTO USUARIOS (LOGIN, NOME, SENHA, EMAIL) " +
  30:                 "VALUES (@LOGIN, @NOME, @SENHA, @EMAIL)",
  31:             Connection = con};
  32:         var cmd = new SqlCommand() {
  33:             CommandText = "INSERT_USUARIO",
  34:             CommandType = CommandType.StoredProcedure,
  35:             Connection = con };
  36:  cmd.Parameters.AddWithValue("@LOGIN", LOGIN);
  37:  cmd.Parameters.AddWithValue("@NOME", NOME);
  38:  cmd.Parameters.AddWithValue("@SENHA", SENHA);
  39:  cmd.Parameters.AddWithValue("@EMAIL", EMAIL);
  40:         con.Open();
  41:         try {
  42:             cmd.ExecuteNonQuery();
  43:         }
  44:         finally {
  45:             con.Close();
  46:         }    
  47:     }    
  48: }
  49:  
  50:  


Guinther Pauli
Desenvolvedor RIA

quinta-feira, 23 de julho de 2009

Aplicações ASP.NET Multicamadas

Uma boa prática na arquitetura de soluções ASP.NET é desenvolver em camadas (multitier). A técnica consiste basicamente em separar regras de negócio, acesso a dados, interfaces, de forma que fiquem o mais independente possíveis, ligando-se por um único ponto.

Minha proposta de arquitetura consiste em:
Camada 1 - Interface ASP.NET Web Forms + AJAX
Camada 2 - Classe de regras de negócio (BLL - Businesse Logic Layer)
Camada 3 - Classe de acesso a dados (DAL - Data Access Layer)
Camada 4 - Banco de Dados (SQL Server)

Os dados trafegam entre as camadas em classes DTO (Data Transfer Objects).

Abaixo seguem exemplos da implementação das camadas.

Interface ASP.NET Web Forms + AJAX

[ASPX]
UpdatePanel
GridView
DetailsView
ObjectDataSource

[Code-Behind]
(não existe código na classe de interface, todo o acesso com as demais camadas é gerenciado pelo ObjectDataSource)

Classe de regras de negócio (BLL - Businesse Logic Layer)


   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4:  
   5: namespace BLL
   6: {
   7:     public class Products
   8:     {
   9:         public Types.Products Select()
  10:         {
  11:             DAL.Products DALProds = new DAL.Products();
  12:             return DALProds.Select();
  13:         }
  14:         public void Update(Types.Product Prod)
  15:         {
  16:             if (Prod.Price < 0)
  17:                 throw new Exception("Invalid value");
  18:             DAL.Products DALProds = new DAL.Products();
  19:             DALProds.Update(Prod);
  20:         }
  21:         public void Insert(Types.Product Prod)
  22:         {
  23:             DAL.Products DALProds = new DAL.Products();
  24:             DALProds.Insert(Prod);
  25:         }
  26:         public void Delete(Types.Product Prod)
  27:         {
  28:             DAL.Products DALProds = new DAL.Products();
  29:             DALProds.Delete(Prod);
  30:         }
  31:     }
  32: }


Observe que a BLL contém uma regra de negócio e passa todas as chamadas CRUD para a DAL (abaixo).

Classe de acesso a dados (DAL - Data Access Layer)


   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.Data;
   5: using System.Data.SqlClient;
   6:  
   7: namespace DAL
   8: {
   9:     public class Products
  10:     {
  11:         private const string ConStr =
  12:             @"Data Source=.\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=True";
  13:  
  14:         public Types.Products Select()
  15:         {
  16:             Types.Products Prods = new Types.Products();
  17:             SqlConnection con = new SqlConnection(ConStr);
  18:             string SQL = "select ProductID,ProductName,UnitPrice from PRODUCTS";
  19:             //string SQL = "SelectPRODUCTS";
  20:             SqlCommand cmd = new SqlCommand(SQL, con);
  21:             //cmd.CommandType = CommandType.StoredProcedure;
  22:             con.Open();
  23:             SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  24:             while (dr.Read())
  25:             {
  26:                 Types.Product NewObj = new Types.Product();
  27:                 NewObj.ProductId = int.Parse(dr[0].ToString());
  28:                 NewObj.Description = dr[1].ToString();
  29:                 NewObj.Price = Convert.ToDouble(dr[2].ToString());
  30:                 Prods.Add(NewObj);
  31:             }
  32:             dr.Close();
  33:             return Prods;
  34:         }
  35:  
  36:         public void Update(Types.Product Prod)
  37:         {
  38:             SqlConnection con = new SqlConnection(ConStr);
  39:             string SQL = "update PRODUCTS set ProductName = @ProductName, UnitPrice = @UnitPrice " +
  40:                 " where ProductID = @Original_ProductID";
  41:             //string SQL = "UpdateProduct";
  42:             SqlCommand cmd = new SqlCommand(SQL, con);
  43:             cmd.CommandType = CommandType.StoredProcedure;
  44:             cmd.Parameters.AddWithValue("@ProductName", Prod.Description);
  45:             cmd.Parameters.AddWithValue("@UnitPrice", Prod.Price);
  46:             cmd.Parameters.AddWithValue("@ProductID", Prod.ProductId);
  47:             con.Open();
  48:             try
  49:             {
  50:                 cmd.ExecuteNonQuery();
  51:             }
  52:             finally
  53:             {
  54:                 con.Close();
  55:             }
  56:         }
  57:         public void Insert(Types.Product Prod)
  58:         {
  59:             SqlConnection con = new SqlConnection(ConStr);
  60:             string SQL = "insert into PRODUCTS (ProductName,UnitPrice) " +
  61:                 "values (@ProductName,@UnitPrice)";
  62:             //string SQL = "InsertProduct";
  63:             SqlCommand cmd = new SqlCommand(SQL, con);
  64:             cmd.CommandType = CommandType.StoredProcedure;
  65:             cmd.Parameters.AddWithValue("@ProductName", Prod.Description);
  66:             cmd.Parameters.AddWithValue("@UnitPrice", Prod.Price);
  67:             try
  68:             {
  69:                 cmd.ExecuteNonQuery();
  70:             }
  71:             finally
  72:             {
  73:                 con.Close();
  74:             }
  75:         }
  76:  
  77:         public void Delete(Types.Product Prod)
  78:         {
  79:             SqlConnection con = new SqlConnection(ConStr);
  80:             string SQL = "delete PRODUCTS where ProductID = @Original_ProductID";
  81:             //string SQL = "deleteProduct";
  82:             SqlCommand cmd = new SqlCommand(SQL, con);
  83:             cmd.CommandType = CommandType.StoredProcedure;
  84:             cmd.Parameters.AddWithValue("@ProductID", Prod.ProductId);
  85:             con.Open();
  86:             try
  87:             {
  88:                 cmd.ExecuteNonQuery();
  89:             }
  90:             finally
  91:             {
  92:                 con.Close();
  93:             }
  94:         }
  95:     }
  96: }


Aqui usamos basicamente ADO.NET para receber as chamadas da BLL e repassar ao banco de dados. O ideal é usar Stored Procedures para armazenar as instruções SQL no BD e aumentar a performance.

DTO
Note que na DAL e BLL usamos tipos predefinidos, uma classe que contém os dados a serem manipulados.


   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4:  
   5: namespace Types
   6: {
   7:     public class Products : List<product>
   8:     {
   9:     }
  10:     public class Product
  11:     {
  12:         private int _ProductId;
  13:  
  14:         public int ProductId
  15:         {
  16:             get { return _ProductId; }
  17:             set { _ProductId = value; }
  18:         }
  19:         private string _Description;
  20:  
  21:         public string Description
  22:         {
  23:             get { return _Description; }
  24:             set { _Description = value; }
  25:         }
  26:         private double _Price;
  27:  
  28:         public double Price
  29:         {
  30:             get { return _Price; }
  31:             set { _Price = value; }
  32:         }
  33:     }
  34: }


Vantagens da Arquitetura:
- Independência de banco de dados
- Modularização
- Facilidade de manutenção
- Menor impacto na mudança de requisitos
- Possibilidade de usar outros tipo de interfaces como WinForms, Mobile, WPF

Guinther Pauli
Arquiteto de Sistemas