quarta-feira, outubro 20, 2010

Criando um web site - Sample WebSite Parte 1

A pouco tempo ministrei o curso 2310 - Developing Web Applications Using Microsoft Visual Studio 2008 e resolvi criar uma aplicação para mostrar um pouco mais da implementação na vida real.

Vou abordar essa aplicação em varias partes para não ficar muito extensa e focar mais no exemplo de cada artigo.

Banco de dados - inicialmente o banco vai conter três tabelas:
Usuario
Produto
UsuarioXProduto
A estrutura do projeto consiste em três camadas, Business Layer(Regras de Negocios), DBAccess(Acesso a Dados) e DB Model(Modelo do Banco).

Funcionamento:
DBModel - contém o modelo do banco de dados
Business Layer - contém todas as regras de negócios da aplicação
DBAccess - contém os métodos de acesso a dados

sexta-feira, outubro 01, 2010

TCP Client & Server

Essa semana precisei fazer um server e um client usando TCP. Depois de muita busca achei a melhor solução no livro C# CookBook 2nd Edition da Editora O´Reilly. Mas claro que no livro a solução não estava 100%, faltava declarar uns namespaces e um objeto.

No livro o autor cita que será usado o System.Net mas assim que comecei a ler o codigo percebi que ia precisar de outras namespaces, então declarei as seguintes:

using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;

No meu caso utilizei as listadas a cima mas para seguir o exemplo do livro também é necessário declarar a seguinte namespace para utilizar o Trace:

using System.Diagnostics;

Com isso fiz a seguinte alteração no codigo, troquei o Trace.WriteLine por Console.WriteLine, assim consigo ver todos os resultados no console, quando o Trace aparece apenas no output do debug.

Como a classe é meio grande vou fatiar em pedaços para ficar mais claro mas fica o link para baixar o codigo.

A estrutura inicial da classe é a seguinte:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;

namespace TCP_UDP_Server
{
    public class TCPServer
    {
        private TcpListener listener = null;
        private IPAddress address;
        private int port;
        private bool listening = false;
        private object _syncRoot;

        public TCPServer(IPAddress address, int port)
        {
            this.address = address;
            this.port = port;
            _syncRoot = this;
        }

        public void Listen()
        {
            //CODE HERE
        }

        public void StopListening()
        {
            if (listening)
            {
                lock (_syncRoot)
                {
                    listening = false;
                    listener.Stop();
                }
            }
        }

        private void ProcessClient(object client)
        {
            //CODE HERE
        }

        public IPAddress Address
        {
            get { return address; }
        }

        public int Port
        {
            get { return port; }
        }

        public bool Listening
        {
            get { return listening; }
        }
    }
}

No método Listen() é criado uma escuta para o endereço e a porta configurada. Após isso fica escutando a porta por mensagens do client(o client não vou comentar nesse post, vou criar outro só para explicar sua funcionalidade).

try
{
    lock (_syncRoot)
    {
        listener = new TcpListener(address, port);
        listener.Start();
        listening = true;
    }

    do
    {
        Console.Write("Looking for someone to talk to... ");

        TcpClient newClient = listener.AcceptTcpClient();
        Console.Write("Connected to new client");

        ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessClient), newClient);

    } while (listening);
}
catch (SocketException se)
{
    Console.WriteLine("SocketException: ", se.ToString());
}
finally
{
    StopListening();
}

E no método ProcessClient() é recebido o pacote e transformado em uma string. Ao receber os dados retorna uma mensagem para o client avisando o recebimento.

TcpClient newClient = (TcpClient)client;
try
{
    byte[] bytes = new byte[1024];
    StringBuilder clientData = new StringBuilder();

    using (NetworkStream ns = newClient.GetStream())
    {
        ns.ReadTimeout = 60000;
        int bytesRead = 0;
        do
        {
            try
            {
                bytesRead = ns.Read(bytes, 0, bytes.Length);
                if (bytesRead > 0)
                {
                    clientData.Append(Encoding.ASCII.GetString(bytes, 0, bytesRead));
                    ns.ReadTimeout = 3000;
                }
            }
            catch (IOException ioe)
            {
                Console.WriteLine("Read time out: "+ ioe.Message);
                bytesRead = 0;
            }
        } while (bytesRead > 0);

        Console.WriteLine("Client says: " + clientData.ToString());

        bytes = Encoding.ASCII.GetBytes("Thanks call again!");

        ns.Write(bytes, 0, bytes.Length);
    }
}
finally 
{
    if (newClient != null)
        newClient.Close();
}

sexta-feira, maio 21, 2010

PAC MAN!

Pacman completa 30 anos, e o google não podia ficar de fora. Criou uma versão comemorativa do game na tela inicial. Eu como sou viciado em games não pude deixar de dar uma conferida no game. Para quem não conhece ou nunca jogou fica uma imagem da versão original, ou umas dela.

quinta-feira, abril 22, 2010

Bordas usando apenas CSS

Li em algum artigo sobre como fazer bordas sem usar javascript ou imagem. Achei interessante e útil então vou deixar arquivado aqui. Vou ficar devendo o link, mas assim que achar posto aqui.

A técnica é simples, basta criar divs ou outro elemento com margens diferentes na parte superior e inferior do conteúdo. De forma que uma margem fique menor ou maior que a outra gradativamente.

O CSS fica assim:

/*ROUNDED BORDER DIV*/
#Borda h1, #Borda h2, #Borda p {margin:0 10px; letter-spacing:1px; padding:0;}
#Borda h1 {font-size:2.5em; color:#fff;}
#Borda h2 {font-size:2em;color:#06a; border:0;}
#Borda p {padding-bottom:0.5em;}
#Borda h2 {padding-top:0.5em;}
#Borda {background: transparent;}

.xtop, .xbottom {display:block; background:transparent; font-size:1px;}
.xb1, .xb2, .xb3, .xb4 {display:block; overflow:hidden;}
.xb1, .xb2, .xb3 {height:1px;}
.xb2, .xb3, .xb4 {background:#E5E5E5; border-left:1px solid #CCC; border-right:1px solid #CCC;}
.xb1 {margin:0 5px; background:#CCC;}
.xb2 {margin:0 3px; border-width:0 2px;}
.xb3 {margin:0 2px;}
.xb4 {height:2px; margin:0 1px;}

.Conteudo {display:block; background:#E5E5E5; border:0 solid #CCC; border-width:0 1px;}


E no HTML.

<div id="Borda">
    <b class="xtop">
        <b class="xb1"></b>
        <b class="xb2"></b>
        <b class="xb3"></b>
        <b class="xb4"></b>
    </b>
    <div class="Conteudo">
        CONTENT
    </div>
    <b class="xbottom">
        <b class="xb4"></b>
        <b class="xb3"></b>
        <b class="xb2"></b>
        <b class="xb1"></b>
    </b>
</div>

terça-feira, janeiro 26, 2010

ASP.NET e C# definindo a cultura do site

Para definir a cultura, basta colocar o codigo abaixo no web config.
<system.web>
    <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1" culture="pt-br" uiCulture="pt-br"/>
</system.web>
Caso não funcione, tente fazer um override no método abaixo para forçar a cultura. Se funcionar provavelmente a cultura está sendo alterada em outro lugar.
protected override void OnLoadComplete(EventArgs e)
{
    base.OnLoadComplete(e);
    Page.Culture = "pt-br";
}
Neste caso, re-veja o código da MasterPage ou na própria pagina verifique a primeira linha no aspx onde define a herança e os vinculos.
<%@ ... Culture="pt-br" %>

terça-feira, janeiro 19, 2010

Executando um processo C# :: Code Snippet

Utilizar a System.Diagnostics e System.Security.
Process p;
Process[] processos;
processos = Process.GetProcessesByName("calc");

if (processos.Length == 0)
{
    p = new Process();
    ProcessStartInfo info = new ProcessStartInfo();
    //para executar o processo com um usuario e senha
    //info.UserName = "user";
    //info.Password = SecureString("pass");
    //info.UseShellExecute = false;
    info.FileName = "calc";
    p.StartInfo = info;
    p.Start();
}
protected SecureString SecureString(string pass)
{
    SecureString ss = new SecureString();
    foreach (char c in pass)
    {
        ss.AppendChar(c);
    }
    return ss;
}