Categories
linux programación

Mono, C# y los iconos en la bandeja del sistema

No hace mucho me uní a un proyecto open source alojado en sourceforge. Dicho proyecto está escrito en c# y compilado para Mono. La verdad es que nunca había programado nada en dicho lenguaje así que estoy en un periodo de “aprendizaje”.

Una de las primeras cosas que hice en el proyecto fue actualizar el sistema usado para mostrar un icono en la bandeja del sistema. Al buscar información por internet, encontré un ejemplo (han actualizado el ejemplo a petición mía, en base a mi post :P) en la documentación de mono, pero que resultó ser el mismo sistema que ya se usaba en la aplicación y que estaba en desuso. En la lista de correo de mono me informaron de que existía una clase llamada StatusIcon, con la que fácilmente se podía crear un icono así que emplee esa finalmente. Y para que algún día pueda ser de utilidad a alguien, hago mi aportación poniendo un ejemplo de un “hola mundo” para mono con icono incluido:

using Gtk;
using Gdk;
using System;

class Hello {
  private static StatusIcon trayIcon;

  private static Gtk.Window window;

  // Método principal de la clase, que se ejecuta al invocar
  // la aplicación
  static void Main()

  {
    // Iniciliza Gtk+ para su funcionamiento
    Application.Init ();

    // Creación de una ventana con título
    window = new Gtk.Window ("Hola mundo");

    // Asociación del evento delete_event() cuando la ventana es cerrada
    window.DeleteEvent += delete_event;

    // Carga de la imagen del icono de la bandeja del sistema
    Pixbuf iconTray = new Pixbuf ("/tmp/iconoBandeja.png");

    // Creación del icono
    trayIcon = new StatusIcon(iconTray);
    // Activar la visibilidad del icono
    trayIcon.Visible = true;

    // Asociar al evento de clic sobre el icono el método OnTrayIconClicked
    trayIcon.Activate += OnTrayIconClicked;
    // Asociar al evento de clic derecho sobre el icono el método OnTrayPopup
    trayIcon.PopupMenu += OnTrayIconPopup;

    // Poner un tooltip al icono
    trayIcon.Tooltip = "icono hola mundo";

    // Mostrar la ventana
    window.ShowAll ();

    // Arranca el bucle principal
    Application.Run ();
  }

  static void OnTrayIconPopup (object o, EventArgs args) // handler for mouse click

  {
    // Crear menu
    Menu popupMenu = new Menu();
    // Crea un item en el menú con el texto 'Salir'

    ImageMenuItem menuItemQuit = new ImageMenuItem ("Salir");
    // Crea una imagen para el item del menu
    Gtk.Image appimg = new Gtk.Image(Stock.Quit, IconSize.Menu);

    // Asociar la imagen con el item
    menuItemQuit.Image = appimg;
    // Añadir el item al menu
    popupMenu.Add(menuItemQuit);

    // Asociar al evento de clic sobre el item el evento OnPopupClick
    menuItemQuit.Activated += OnPopupClick;
    // Hace visible el menu
    popupMenu.ShowAll();

    // Muestra el menu
    popupMenu.Popup();
}

  static void OnPopupClick(object o, EventArgs args)

  {
    // Termina la aplicación cuando el usuario pulsa el botón Salir
    Application.Quit();
  }

  static void OnTrayIconClicked(object sender, EventArgs a)
  {
    // Cambia el estado de la ventana de la aplicación entre visible y no visible

    if (window.Visible)
    {
      window.Visible = false;

    }
    else
    {
      window.Visible = true;

    }
  }

  static void delete_event (object obj, DeleteEventArgs args)

  {
    // Termina la aplicación cuando el usuario cierra la ventana
    Application.Quit ();
  }
}

Para compilar la aplicación:

mcs holaMundoIcono.cs -pkg:gtk-sharp-2.0

Y para ejecutarla:

./holaMundoIcono.exe

Categories
linux

Particiones en la memoria Ram

Hoy me han enviado un enlace, en el cual se anuncia la salida al mercado de un dispositivo que se conecta al ordenador como un disco duro, pero que realiza el almacenamiento de los datos en módulos de memoria DDR. Lo que consiguen de esta forma es obtener unas prestaciones que a día de hoy son muy superiores a las de un disco duro convencional e incluso a uno de servidor(e.g. SAS).

A parte del problema de la perdida de datos cuando se corta el suministro eléctrico, el precio de dicho dispositivo es disparatado 1.619,46 euros ($2390 US) por 16GB.

De todos modos, esto no es una tremenda novedad ya que estos dispositivos tienen precedentes pasados(con menores capacidades y características, pero los tienen), y también está la posibilidad de que los sistemas operativos puedan usar una parte de la memoria Ram de un ordenador como si de un disco duro se tratase. En el caso de linux el caso más evidente en el que se hace uso de este tipo de discos virtuales es en los LiveCD. En estos se carga el sistema desde un CD-ROM hacia la memoria Ram y allí se ejecutan.

Pasemos ahora a lo interesante. En linux es posible crear una partición cuyos datos se encuentren por completo en la memoria Ram, dando como resultado que el acceso a los datos ahí contenidos sea mucho más rápido que a disco. Esto puede ser útil para casos en los cuales se haga uso de una máquina virtual o una gran cantidad de librerías. Si es este tu caso, o simplemente te apetece experimentar y sacar tus propias conclusiones, es tan sencillo como ejecutar los siguientes comandos:

1º – Creamos una carpeta donde montaremos la partición:

mkdir /tmp/RAM

2º – Montamos la partición con el sistema de ficheros tmpfs

sudo mount none /tmp/RAM -t tmpfs

Y listo, a partir de ahora todo lo que copiemos a la carpeta “/tmp/RAM” estará almacenado en la memoria Ram del ordenador. Para otro día quizá me entretenga haciendo unas mediciones de tiempos acerca de la velocidad que se gana poniendo determinadas aplicaciones en esta partición, hasta entonces, ¡a experimentar se ha dicho!