• Categorías

  • Archivos

CINDERELLA MAN: EL HOMBRE QUE NO SE DEJÓ TUMBAR

Una interesante historia llevada al cine e interpretada por un grande, como no podría ser de otra manera, Russell Crowe.

Para más información, visitar:

BBC Horizon (2011) – What is Reality (sub en Español)

Planes de Gobierno 2011-2016

PPK

Plan-de-Gobierno-Peru-Posible-2011-2016

PlandeGobierno_GanaPeru_2011-2016

plan_de_gobierno_fuerza2011

Diferencia entre Diagrama de Actividad y Diagrama de Flujo

Los diagramas de actividad son similares a los diagramas de flujo, con la diferencia de que todas las actividades están claramente unidas a objetos.

Los diagramas de actividad siempre están asociados a una clase, a una operación o a un caso de uso.

Los diagramas de actividad describen la secuencia de las actividades en un sistema. Los diagramas de actividad son una forma especial de los diagramas de estado, que únicamente (o mayormente) contienen actividades.

Un diagrama de Actividad demuestra la serie de actividades que deben ser realizadas en un caso de uso, así como las distintas rutas que pueden irse desencadenando en el uso-caso.

Es importante recalcar que aunque un diagrama de actividad es muy similar en definición a un diagrama de flujo (típicamente asociado en el diseño de Software), estos no son lo mismo. Un diagrama de actividad es utilizado en conjunción de un diagrama de caso de uso para auxiliar a los miembros del equipo de desarrollo a entender como es utilizado el sistema y como reacciona en determinados eventos. Lo anterior, en contraste con un diagrama de flujo que ayuda a un programador a desarrollar código a través de una descripción lógica de un proceso. Se pudiera considerar que un diagrama de actividad describe el problema, mientras un diagrama de flujo describe la solución.

 

Fuentes:

Arquitectura de Software

ACCEDER A LA API DE WINDOWS DESDE JAVA

Tarde o temprano ocurre lo inevitable, en este caso, trabajar con la API de Windows. El problema surgió cuando quería actualizar el tiempo de espera del protector de pantalla. Lo primero que hice fue identificar la clave del registro involucrada en este proceso:


Ruta: HKEY_CURRENT_USER\Control Panel\Desktop
Clave: ScreenSaveTimeOut
Tipo: REG_SZ

Una vez identificada procedí a modificarla desde el editor de registros, dándome con la ingrata sorpresa que el valor no se actualizaba en la ficha “Protector de Pantalla” de la ventana de configuración “Propiedades de Pantalla”. Sólo se actualizaba cuando reiniciaba la sesión de usuario o reiniciaba la PC.

Caballo nomás…googleando un poco encontré que la mejor manera de hacerlo era invocando a una función de la API de Windows. Ahí está el detalle!!!

Llegado a este punto tenía dos alternativas: seguir con Java y ver la manera de llamar a una función de la API de Windows o migrar todo el código que ya había avanzado hasta ese momento a otro lenguaje que sea apropiado para esas tareas.

A la final me venció la pereza y me incliné por la primera opción. Ahora la cuestión estaba en como diablos llamar a una función de la API de Windows desde un programa hecho en Java, motivo de este artículo (ya lo había olvidado XD).

Una vez un amigo me comento que para esa labor podría utilizar JNI (Java Native Interface), pero la verdad no sé porque se me dio por buscar otra alternativa (vamos…cada vez que escucho hablar de JNI me da escalofríos), es en esta búsqueda que encontré algo que se hace llamar JNA (Java Native Access). La definición de Wikipedia me encanto (especialmente lo resaltado en negrita XD):

Java Native Access provides Java programs easy access to native shared libraries without using the Java Native Interface. JNA’s design aims to provide native access in a natural way with a minimum of effort. No boilerplate or generated glue code is required.

Esa definición fue más que suficiente para mí y antes de que me olvide el porque sigo escribiendo, les dejo a continuación un ejemplo utilizando la librería JNA para llamar a la función SystemParametersInfo, la cual me va permitir modificar el tiempo de espera del protector de pantalla.

Antes de empezar a codificar les recomiendo que revisen detenidamente la función que desean invocar, esto es, sus parámetros, valor de retorno y su estructura. Más adelante verán porque les va ser útil conocer todo eso.
La estructura de la función es como sigue:


BOOL WINAPI SystemParametersInfo(
__in UINT uiAction,
__in UINT uiParam,
__inout PVOID pvParam,
__in UINT fWinIni
);

Algo que se me estaba olvidando es conocer a que librería de la API de Windows pertenece la función que deseamos invocar. Para este trabajo utilice un utilitario gratuito llamado DLL Export Viewer. Gracias a este útil programa me pude dar cuenta que no tenía ninguna función con ese nombre SystemParametersInfo, en su lugar tenía estas dos funciones: SystemParametersInfoA, SystemParametersInfoW.

La diferencia entre estas dos funciones esta en el tipo de codificación que utilizan, les recomiendo ésta lectura para que vean de que va el asunto.

La función que utilice finalmente fue SystemParametersInfoA.

Una vez aclarado todo eso (al menos eso creo), empecemos con la codificación en Java. Está demás decir que deben descargar la librería JNA para enlazarla a su programa. Lo primero que necesitamos es una interface que declare la función SystemParametersInfoA y que extienda a la interface StdCallLibrary.

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public interface MyUser32 extends StdCallLibrary {

    MyUser32 INSTANCE = (MyUser32) Native.loadLibrary(
            "user32", MyUser32.class);

    boolean SystemParametersInfoA(
            int uiAction,
            int uiParam,
            String fnm,
            int fWinIni);
}

Finalmente, una clase para invocar a la función SystemParametersInfoA.

public class DisplayManager {

    private final static int SPI_SETSCREENSAVETIMEOUT = 0x000F;
    private final static int SPIF_UPDATEINIFILE = 0x01;
    private final static int SPIF_SENDWININICHANGE = 0x02;

    private static boolean setScreenSaveTimeOut(int time) {

        boolean result = MyUser32.INSTANCE.SystemParametersInfoA(
                SPI_SETSCREENSAVETIMEOUT, time, "",
                SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

        return result;
    }

    public static void main(String args[]) {
        setScreenSaveTimeOut(180);
    }
}

Hasta la próxima…

P.D: Este post va dedicado para todos los zánganos.

ACCEDER AL REGEDIT DE WINDOWS DESDE JAVA

En algunas tareas de programación es necesario acceder al registro de Windows ya sea para crear, leer o modificar claves. Buscando en google encontré una librería llamada WinRegistry, muy fácil de usar y lo mejor de todo es que es libre.

A continuación les dejo una función para probar algunas funcionalidades que permite realizar esta librería.

public void test() throws RegistryErrorException  {
        Regor reg = null;
        Key key = null;
        String SBK = "Software\\MySoftware";

        reg = new Regor();

        //create a subkey
        if(reg.openKey(Regor.HKEY_CURRENT_USER, SBK) == null) {
            reg.createKey(Regor.HKEY_CURRENT_USER, SBK);
        }

        //open a subkey
        key = reg.openKey(Regor.HKEY_CURRENT_USER, SBK);

        //save an entry type REG_SZ
        reg.saveValue(key, "KeyActivation", "SF1F-P983-8DF1");

        //save an entry type REG_DWORD
        reg.saveDword(key, "Count", "1");

        //delete an entry any type
        reg.deleteEntry(key, "KeyActivation");

        //delete a subkey
        reg.delKey(Regor.HKEY_CURRENT_USER, SBK);
}