Categories
.NET Desarrollo de Software Mono NHibernate PostgreSQL Software Libre

NHibernate y PostgreSQL

Esta es la primera de dos entradas donde mostraré -de manera básica, como realizar reportes usando NHibernate , PostgreSQL y los controles para Reportes (ReportViewer) que trae cualquier instalación de Visual Studio 2005 -corríjanme si me equivoco 🙂 .

NHibernate es un framework que hace el mapeo de un modelo orientado a objetos a uno relacional.

Al usar NHibernate para el acceso a datos el desarrollador se asegura de que su aplicación es agnóstica en cuanto al motor de base de datos a utilizar en producción, pues NHibernate soporta los más habituales en el mercado: MySQL, PostgreSQL, Oracle, MS SQL Server, etc.

NHibernate tiene demasiadas características como para hablar sobre alguna en especial en este par de entradas, además que ya se ha escrito bastante sobre estos temas. En este apartado, sólo quiero hacer notar un pequeño detalle al momento de trabajar con PostgreSQL como base de datos.

xml:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler" />
  </configSections>
  <nhibernate>
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
    <add key="hibernate.dialect" value="NHibernate.Dialect.PostgreSQLDialect" />
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.NpgsqlDriver" />
    <add key="hibernate.connection.connection_string"
         value="Server=192.168.1.20;Database=test;User Id=alex;Encoding=LATIN1;" />

  </nhibernate>
</configuration>

Como se puede apreciar en el código mostrado, la cadena de conexión incluye un parámetro Encoding -sólo sirve para PostgreSQL, donde se especifica la codificación de caracteres que usará nuestra aplicación en la comunicación con el servidor de Base de Datos, si bien es cierto que PostgreSQL intentará hacer automáticamente una conversión entre la codificación definida en el servidor y la del cliente, es recomendable utilizar explícitamente la misma codificación en ambos extremos.

En la siguiente entrada, se tocará específicamente el diseño de reportes usando un ensamblado que contiene nuestro modelo.

Class Diagram for NHibernate Sample

Categories
.NET ASP.NET Internet Explorer Web Windows Forms

Capturar una página Web de manera sencilla

Por si alguien necesita una funcionalidad parecida a lo que ofrecen sitios como WebSnapr o Snap, a continuación pongo la manera de capturar una página web como imagen.

csharp:

string url = "http://www.buayacorp.com/";
using (WebBrowser navegador = new WebBrowser())
{
    // Tamaño del navegador
    navegador.Size = new Size(1024, 768);
    // Deshabilitar la barra de scroll
    navegador.ScrollBarsEnabled = false;

    // Cargar la página
    navegador.Navigate(url);

    // Esperar a que cargue completamente la página
    while (navegador.ReadyState != WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }
    // Tamaño de la imagen a capturar
    Rectangle tamaño = new Rectangle(0, 0, 1024, 768);
    Bitmap bitmap = new Bitmap(tamaño.Width, tamaño.Height);

    // Guardar la imagen de la página con el tamaño especificado
    navegador.DrawToBitmap(bitmap, tamaño);

    // Convertir y guardar la imagen como jpg
    Bitmap thumbnail = new Bitmap(tamaño.Width, tamaño.Height);
    Graphics gfx = Graphics.FromImage(thumbnail);
    gfx.DrawImage(bitmap, tamaño, tamaño, GraphicsUnit.Pixel);

    thumbnail.Save(@"E:\demos\demo.jpg", ImageFormat.Jpeg);
}

Esa porción de código hace una captura de 1024x728 pixeles, si se quiere capturar la página completa sólo es necesario jugar con los valores de navegador.Document.Body.ClientRectangle.

Por otro lado, como seguramente saben la clase WebControl usa internamente los controles de Internet Explorer disponibles en la máquina donde se ejecuta la aplicación, así que si un sitio se ve mal con este navegador, la imagen capturada también tendrá este pequeño problema.

Categories
.NET ASP.NET Desarrollo de Software Utilidades Web Windows Forms

Reflector 5.0

Al parecer ayer se liberó una nueva versión de Reflector, una herramienta muy útil que permite explorar, analizar, ver, etc. los ensamblados de .NET.

Entre las novedades que trae esta versión, están:

  • Soporte para LINQ y el .NET Framework 3. 5
  • Existe un nuevo protocolo "code://" que hace que Reflector cargue el tipo especificado, por ejemplo code://System.Web/System.Web.HttpResponse/TransmitFile(String) debería ubicarlos en el método TransmitFile de la clase HttpResponse.
  • Existe la posibilidad de registrar una extensión (Reflector.exe /register) para que cada vez que se haga click derecho sobre un ensamblado compatible con .NET, aparezca una opción "Browse with .NET Reflector" en el menú contextual.

Para sacarle más provecho a esta herramienta, se pueden agregar plugins de acuerdo a las necesidades que tenga uno.

Categories
.NET ASP.NET Desarrollo de Software Web

Response.TransmitFile, nueva forma para enviar archivos al cliente en ASP.NET 2

Existen algunos escenarios donde hay la necesidad de que antes de autorizar la descarga de un archivo desde nuestra aplicación, debamos realizar algún tipo de proceso. En estos casos lo que básicamente hacía es lo siguiente:

csharp:

// Algun tipo de validación o proceso
// ...
string file = Request.Params["file"];
if (!string.IsNullOrEmpty(file))
{
    file = Path.Combine(Server.MapPath("downloads"), Path.GetFileName(file));

    Response.Clear();
    Response.ContentType = "application/octect-stream";
    Response.AddHeader("Content–Disposition", "attachment; filename=foo.xyz");
    Response.WriteFile(file);
    Response.End();
}

Categories
.NET Desarrollo de Software Utilidades Windows Forms

Zoner & Seguridad de Acceso a Código

Los que han estado desarrollando aplicaciones de escritorio con .NET, seguramente saben que el CLR es el encargado de lo que puede o no hacer una aplicación en función a los permisos que reciba.

Code Access Security

Por si no saben todavía de la existencia de Zoner, ésta es una pequeña herramienta que permite probar si una determinada aplicación funciona o no en una zona determinada.

Este es el código de Zoner:

csharp:

using System;
using System.Reflection;
using System.Security;
using System.Security.Policy;

class App
{
    public static void Main(String[] args)
    {
        try
        {
            SecurityZone zone = SecurityZone.Internet;
            String url = "http://www.IBuySpy.com";
            String exe;
            String[] newArgs = null;

            for (Int32 index = 0; ; index++)
            {
                if (args[index][0] != '-' && args[index][0] != '/')
                {
                    exe = args[index];
                    newArgs = new String[args.Length - (index + 1)];
                    Array.Copy(args, index + 1, newArgs, 0, newArgs.Length);
                    break;
                }

                String setting = args[index].Substring(3);

                switch (args[index].ToUpper()[1])
                {
                    case 'Z': // Set zone
                        zone = (SecurityZone) Enum.Parse(typeof(SecurityZone), setting, true);
                        break;
                    case 'U': // Set url
                        url = setting;
                        break;
                    default:
                        throw (new ApplicationException());
                }
            }
            StartApp(exe, newArgs, zone, url);
        }
        catch (ArgumentException)
        {
            Usage();
        }
        catch (IndexOutOfRangeException)
        {
            Usage();
        }
        catch (ApplicationException) { Usage(); }
    }
    static void Usage()
    {
        Console.WriteLine(
           "Usage: zoner /u:[url] /z:[zone] [Executable File]\n" +
           "[url]\tUrl indicating the source of this .exe");
        Console.WriteLine();
        Console.Write("[zone]");
       
        String[] zones = Enum.GetNames(typeof(SecurityZone));
        foreach (String zone in zones)
        {
            Console.WriteLine("\t{0}", zone);
        }
        Console.WriteLine(
           "\nDefault:  zoner /u:http://www.IBuySpy.com /z:Internet");
    }
   
    static void StartApp(String exe,
       String[] newArgs, SecurityZone zone, String url)
    {
        Evidence evidence = new Evidence();

        evidence.AddHost(new Zone(zone));
        evidence.AddHost(new Url(url));
        AppDomain app = AppDomain.CreateDomain(exe, evidence);
        app.ExecuteAssembly(exe, evidence, newArgs);
    }
}

Lo que hace esta porción de código, es simplemente ejecutar en otro dominio la aplicación que se quiere probar, pero adjuntando información de la zona escogida.

Espero que esta pequeña utilidad les ayude a ahorrar un poco de tiempo :).