Oracle + Sun

Sun CustomersEl día de ayer, Enero 27 de 2010, Oracle anunció terminada su adquisición de Sun.

Oracle nos invita a ver su serie de Webcast sobre la estrategia de productos Oracle + Sun, en los cuales podremos conocer mas acerca de la combinación Sun y Oracle y de lo que ello significará para nosotros.

Mayor información en: oracle.com/us/sun

SOFTWARE STRATEGY WEBCASTS

HARDWARE STRATEGY WEBCASTS

SYSTEMS STRATEGY WEBCASTS

SOLUTIONS STRATEGY WEBCASTS

PARTNER STRATEGY WEBCASTS

Otros Links:

Publicado en Informática e Internet, Java, Servicios | Deja un comentario

Ejecutar solo una instancia (C#)

Para prevenir que sea ejecutada más de una instancia de una aplicación Windows o WPF con C# (incluso cuando se realice una copia del archivo ejecutable) podríamos utilizar algo como lo siguiente:

private static bool FirstInstance
{
    get
    {
        bool created;
        string name = Assembly.GetEntryAssembly().FullName;
        // created will be True if the current thread creates and owns the mutex.
        // Otherwise created will be False if a previous instance already exists.
        Mutex mutex = new Mutex(true, name, out created);
        return created;
    }
}

Nota: Para una mayor certidumbre se podría hacer uso de una cadena GUID en ‘name’.

Cuando la primera instancia crea el Mutex pasa a ser su propietario y la variable created se le asigna el valor True. Cuando una nueva instancia se ejecuta intenta tomar posesión del Mutex, pero dado que solo un hilo puede ser propietario de mismo (y primera instancia ya lo es) la nueva no puede tomar posesión del Mutex, por lo cual el valor de created permanece en False, misma que se regresa para indicar si existe (o no) una instancia de la aplicación en ejecución.

Así pues la propiedad FirstInstance la colocaremos en la clase principal de nuestra aplicación WinForm (“Program.cs”) o bien de nuestra aplicación WPF (“App.xaml.cs”) para ser utilizada según corresponda:

WinForm (Program.cs):

[STAThread]
static void Main()
{
    if (FirstInstance)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    else
    {
        MessageBox.Show("Application is already running.");
        Application.Exit();
    }
}

WPF (App.xaml.cs):

protected override void OnStartup(StartupEventArgs e)
{
    if (FirstInstance)
        base.OnStartup(e);
    else
    {
        MessageBox.Show("Application is already running.");
        Application.Current.Shutdown();
    }
}

Adicionalmente, usando la clase System.Diagnostics.Process se puede obtener la ventana principal y activarla mediante una llamada a la API SetForegroundWindow, tal como se muestra en: Comprobar si hay una instancia previa de nuestra aplicación, escrito en VB.NET por Eduardo Morcillo.

 

Usando WindowsFormsApplicationBase de VB

Otra opción sería recurrir al Modelo de Aplicaciones de Visual Basic (aka My) para crear un gestor de instancias mediante el WindowsFormsApplicationBase (el cual además nos ofrece el evento OnStartupNextInstance) tal como se muestra a continuación para Windows Forms con C#:

Nota: No es necesario traducir el siguiente código para una aplicación Windows Forms con VB. En ese caso solo basta seguir las instrucciones de la segunda mitad del post: Ejecutar solamente una instancia (VB 2005+).

Program.cs

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace WinForm1
{
    public static class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            SingleInstanceManager manager = new SingleInstanceManager();
            manager.Run(args);
        }
    }

    // Using VB bits to detect single instances and process accordingly:
    //  * OnStartup is fired when the first instance loads
    //  * OnStartupNextInstance is fired when the application is re-run again
    //    NOTE: it is redirected to this instance thanks to IsSingleInstance
    public class SingleInstanceManager : WindowsFormsApplicationBase
    {
        SingleInstanceApplication app;

        public SingleInstanceManager()
        {
            this.IsSingleInstance = true;
        }

        protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
        {
            // First time app is launched
            app = new SingleInstanceApplication();
            app.Run();
            return false;
        }

        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
        {
            // Subsequent launches            
            base.OnStartupNextInstance(eventArgs);
            app.Activate();
        }
    }

    public class SingleInstanceApplication
    {
        protected Form mainForm;

        public void Activate()
        {
            // Reactivate application's main window            
            mainForm.Activate();
        }    

        public void Run()
        {
            Application.Run(mainForm = new Form1());
        }
    }
}

Para un ejemplo con WPF usando WindowsFormsApplicationBase tanto con VB como con C# ver: WPF: Single Instance Detection Sample.

Publicado en .NET | Etiquetado , | 9 comentarios

Añeja Vulnerabilidad en el Kernel de Windows

Cuando leí los primeros reportes pensé que se trataba de hoax, por lo que no hice caso al principio. Mas sin embargo resulta que es verdad. Se trata de una vulnerabilidad hecha pública el martes pasado en seclists.org y firmado por Tavis Ormandy, quien además facilita un exploit. Por su parte Microsoft ha publicado el aviso de seguridad al respecto:

Microsoft Security Advisory (979682)
Vulnerability in Windows Kernel Could Allow Elevation of Privilege

La vulnerabilidad se encuentra específicamente en el subsistema Virtual DOS Machine de Windows NT (NTVDM). Por lo que dicha vulnerabilidad afecta a toda la familia de sistemas operativos NT de 32 bits, desde el extinto NT 3.5, pasando por Windows 2000 y hasta el reciente Windows 7, estando exentos sólo los sistemas de 64-bits. De hecho eso es lo que ha incendiado la web, pero sobretodo porque el problema tiene su buena cantidad de años.

A su favor MS afirma que la vulnerabilidad es difícil de explotar, ya que requiere que sea explotada con una cuenta local y no puede hacerse remotamente. Empero no obstante la mayoría de los usuarios no son muy cuidadosos al abrir/ejecutar archivos, por lo que fácilmente podrían abrir/ejecutar un archivo adjunto o bien descargado desde las redes P2P.

En el aviso MS señala que aún esta bajo investigación por lo que aún no existe parche (fix) para mitigar la vulnerabilidad. Por lo mientras solo recomiendan “bloquear” la ejecución de programas de 16 bits mediante el deshabilitado del subsistema NTVDM vía la consola de políticas de grupo (gpedit.msc), el cual no obstante no está presente en las ediciones “básicas” (aka Home y Started) de Windows XP/Vista/7. Por lo que ciertos blogs proponen la siguiente medida alterna, la cual he comprobado y (aparentemente) funciona:

1. Cree un archivo de texto con la extensión *.reg, por ejemplo: “VDMDisallowed.reg” (y asegúrese que tiene dicha extensión y no *.reg.txt).

2. Introduzca en el archivo el siguiente texto:

Windows Registry Editor Version 5.00


[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat]
"VDMDisallowed"=dword:00000001


3. Guarde el archivo.

4. De click derecho sobre el archivo y en el menú contextual elija la opción “Combinar”.

Nota: Para poder combinar el archivo con el Registro de Windows se requieren privilegios de administrador. Si no sabe de que hablo pregunte a su administrador local o su amigo geek pro-MS mas cercano.

5. De Aceptar en el cuadro de dialogo que aparece.

Eso es todo, de ahora en adelante sus viejos programas y juegos de MS-DOS/Win16 ya no se ejecutarán mas, al menos hasta que MS publique el parche que solucione correctamente el problema.

Para volver habilitar VDM cree otro archivo *.reg (“VDMAllowed.reg”) con lo siguiente:

Windows Registry Editor Version 5.00


[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat]
"VDMDisallowed"=dword:00000000


Guarde el archivo y combínelo.

ADVERTENCIA Y RENUNCIA: La manipulación del Registro de Windows puede llegar a ocasionar efectos adversos al sistema si no se realiza adecuadamente. Tenga en cuenta que si lo realiza es bajo su propio riesgo, por lo que no me hago responsable por cualquier daño que pueda sufrir su sistema/equipo y/o persona, ni por el mal uso que se le pueda dar a ésta información.

Publicado en Advertencias, Seguridad, Windows | 1 Comentario

Roadmap de EntLib 5.0

Para quien no sepa que es EntLib:

Microsoft Enterprise Library (aka EntLib) es una colección de componentes de software reutilizables (conocidos como “Application Blocks”) diseñados para ayudar a los desarrolladores de software de la plataforma .NET a lidiar con los problemas comunes en el desarrollo empresarial tales como registro, validación, acceso a datos, manejo de excepciones, y muchos otros. Los application blocks son un tipo de guías directivas, proporcionadas en forma de código fuente, casos de prueba, y documentación que se pueden utilizar "tal cual", o bien ampliarse o modificarse por los desarrolladores para utilizarse en proyectos de desarrollo.

Unity Application Block (o simplemente Unity) es un contenedor DI (dependency injection) ligero y extensible, que puede utilizarse de forma independiente (existiendo una versión para Silverlight) como integralmente con EntLib.

Mayor información en:

A continuación el diagrama del Roadmap para EntLib 5.0 y Unity 2.0.

La imagen habla por si misma, pero para que quede mas claro:

  • Primera Beta en Febrero, solo para VS2008 SP1
  • Segunda Beta en Marzo, tanto para VS2008 SP1 como VS2010 RC (a liberarse en Febrero)
  • El RTW se espera sea lanzado en Abril (a la par de VS2010)

Mayor información en:

Publicado en .NET | Etiquetado , , | Deja un comentario

Gordon: Flash runtime

Tobias Schneider ha construido un runtime de Flash denominado Gordon, el cual está implementado en Javascript puro y HTML5 (utiliza canvas), y todo es código abierto (licencia MIT) y alojado en GitHub.

Para utilizarlo solo basta colocar en la página algo como:

  <head>
    <script type="text/javascript" src="gordon.js"></script>
  </head>
  <body onload="new Gordon.Movie('movie.swf', 
    {id: 'stage', width: 400, height: 200})"> 
    <div id="stage"></div> 
  </body>

En el sitio del autor podemos ver en vivo algunos ejemplos de Gordon. De momento Gordon solo soporta el formato SWF 1.0 y el soporte para SWF 2.0 se encuentra en desarrollo. Por otra parte, dado que depende de HTML5, solo funciona bien en versiones recientes de Firefox, Chrome, y Safari.

Así mismo Gordon ha sido probado en el iPhone con resultados favorables, por lo que a pesar que Apple no desea incluir el reproductor de Flash de Adobe, en un futuro próximo dicho formato podría desplegarse en el iPhone gracias a Gordon.

La documentación de Gordon aún es escasa, por lo pronto hay una tabla de soporte de tags SWF y una tabla de soporte de navegadores, así como el código mismo. Así que hacer:

git clone git://github.com/tobeytailor/gordon.git
Publicado en Informática e Internet | Etiquetado , , | Deja un comentario