Capturar sólo números en C++ Builder

Junio 22, 2009 by rtmex

En ocasiones necesitamos validar que en un control TEdit el usuario sólo pueda teclear números. Lo que hay que hacer es poner el siguiente código en el evento OnKeyPress de nuestro TEdit.


void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
 if (!((Key >= '0' && Key <= '9') || Key == '\b'))
    Key = 0;
}

Lo que hace este código es ignorar la tecla pulsada si dicha tecla no está dentro del rango de 0 a 9 y tampoco es el backspace (retroceso). Si queremos que los números estén alineados a la derecha, el truco es no utilizar un TEdit, sino un control TMemo haciendolo del tamaño deseado y seleccionando la opción taRightJustify en la propiedad Alignment e indicando el número máximo de caracteres en la propiedad MaxLength.

Alternativas a GNU/Linux

Mayo 22, 2009 by rtmex

Recibí un comentario de Pedro en la página “Acerca de…” de este blog, y este post es en respuesta a su comentario ya que creo que alguien más puede tener la misma inquietud.

Es cierto que existen otros sistemas operativos y algunos seguramente mejores que GNU/Linux, por ejemplo en mi opinión, los BSD (FreeBSD, NetDBSD, etc.) son un poco mas robustos y eficientes que GNU/Linux.
El que un sistema operativo sea mejor que otro tiene una parte subjetiva, ya que hay que tomar en cuenta el tipo de computadora para la que estemos seleccionando el sistema operativo y también la función que desempeñará la computadora en cuestión.

Por tipo de computadora no me refiero a el procesador, sino a la clasificación, es decir PC’s (notese que en esta categoría entran también las Mac, ya que PC significa computadora personal y la Mac es una computadora personal), mini computadoras (por ejemplo la AS/400), estaciones de trabajo (como la RS/6000), mainframes (como la S/390), etc.
Cuando digo “la función que desempeñará la computadora” me refiero a tomar en cuenta si es una PC que usará un usuario final para navegar en internet, chatear, escuchar música y enviar y recibir mails o si será un servidor que funcionará como servidor web, servidor de correo, servidor FTP, o cualquier otro uso.

Entonces tenemos que para computadoras personales no hay muchos sistemas operativos que valgan la pena entre los cuales elegir, por ejemplo aparte de GNU/Linux tenemos los basados en BSD (FreeBSD, NetBSD, OpenBSD, y los derivados de estos 3 como PC-BSD, DesktopBSD, DragonFly BSD, etc.). Dentro de los que no son software libre ni open source, tenemos a Mac OS X, el sistema operativo de las Mac, que está basado en Darwin. Aunque Mac OS X no es software libre ni open source, y mucho menos gratuito, Darwin si es open source (http://developer.apple.com/Darwin).

Ahora, para quienes tienen PC’s “antiguas” con procesadores desde 8088 con 640k de RAM existe FreeDOS que es una alternativa a los DOS que no son open source, como MS-DOS de Microsoft, DRDOS de la desaparecida Digital Research, PC-DOS de IBM, etc. Para aquellas PC’s con 512k de RAM o menos, probablemente sirva el sitema operativo CP/M que usaban las Apple IIe y pueden descargar desde aqui http://www.cpm.z80.de/ (lean la licencia antes de usarlo)

Como alternativas para servidores (además de GNU/Linux y los BSD) existen varias versiones de Unix como Solaris cuya versión open source es Open Solaris, AIX de IBM, y otros.

Para las mini computadoras, estaciones de trabajo, etc. existen otros sistemas operativos, la mayoría se puede decir que fueron creados para un modelo específico de computadora, como el OS/400 para las AS/400, el OS/390 para las S/370 y S/390, que antes usaban el sistema operativo MVS. Las computadoras VAX utilizan el sistema operativo OpenVMS, antes llamado sólo VMS.

Espero esto sirva como referencia y ya será iniciativa de cada quien investigar más al respecto.

Renombrar archivos usando C++ en GNU/Linux

Mayo 8, 2009 by rtmex

En GNU/Linux (en los sistemas operativos tipo Unix en general, incluidos FreeBSD, etc.) no es recomendable manejar nombres de archivo que contengan espacios.

Puede darse el caso de que copiemos desde otro sistema operativo archivos que contienen espacios en su nombre, a nuestra máquina con GNU/Linux. Entónces, ¿qué hacer en esos casos?

Efectivamente… “lo recomendable” es renombrarlos para eliminar los espacios que contiene el nombre de archivo. Como puede ser una cantidad considerable de archivos, nos tomaría mucho tiempo ir renombrando archivo por archivo.

Exísten diferentes opciones para automatizar esa tarea, haciendo un script para bash, utilizando AWK y muchas otras soluciones.

A continuación un programa en C++ al que le podemos enviar una lista de directorios para que renombre todos los archivos que se encuentran en ellos eliminando los espacios del nombre de archivo.


/****************************************
 * Archivo: renombrar_archivos.cpp               
 * Autor  : SALOMON RINCON TORRES       
 * Fecha  : 08/05/2009 (dd/mm/yyyy)
 */

#include <iostream>
#include <string>
#include <sys/types.h>
#include <dirent.h>

using namespace std;

string QuitaEspacios(string s_cadena)
{
 string s_aux;

 for (int i_pos = 0; i_pos < s_cadena.length(); i_pos++)
     {
       if (s_cadena[i_pos] != ' ')
           s_aux += s_cadena[i_pos];
     }
 return s_aux;
}

int main (int argc, char *argv[])
{
 DIR *dirh;
 struct dirent *dirp;
 string s_dir, s_nombre, s_nuevonombre;
 int i_renombrados = 0, i_ok = 0, i_fallos = 0;

 for(int i = 1; i < argc; i++)
    {
     s_dir = argv[i];
     i_renombrados = 0;
     i_ok = 0;
     i_fallos = 0;

     cout << "******************** Directorio \"" << s_dir << "\" ********************\n" << endl;

     if ((dirh = opendir(s_dir.c_str())) == NULL)
         perror("No se pudo accesar al directorio ");
     else
        {
         for (dirp = readdir(dirh); dirp != NULL; dirp = readdir(dirh))
             {
              s_nombre = dirp->d_name;

              // Checamo que no sea el directorio . o ..
              if (s_nombre != "." && s_nombre != "..")
                 {
                  cout << "Archivo: " << s_nombre << endl;

                  // Si el nombre del archivo tiene un espacio, lo renombramos
                  if (s_nombre.find(" ") != string::npos)
                     {           
                      s_nuevonombre = QuitaEspacios(s_nombre);

                      if (rename((s_dir+"/"+dirp->d_name).c_str(), (s_dir+"/"+s_nuevonombre).c_str()) == 0)
                         {
                          i_renombrados++;
                          cout << "   === Renombrado como: " << s_nuevonombre.c_str() << endl;
                         }
                      else
                          {
                           i_fallos++;
                           perror("No se pudo renombrar");
                          }
                     } /* if */
                  else
                      {
                       i_ok++;
                       cout << "OK\n";
                      }
                 } /* if */
             } /* for */

         closedir(dirh);
         cout << endl;
         cout << "--- Archivos renombrados: " << i_renombrados << endl;
         cout << "--- Archivos OK: " << i_ok << endl;
         cout << "--- Archivos que no se pudieron renombrar: " << i_fallos << endl << endl;
        } /* else */
    } /* for */
 return 0;
}

Validar Entry en Gtk#

Abril 24, 2009 by rtmex

Recientemente necesitaba validar un “Entry” en gtk-sharp para que el usuario sólo pudiera capturar números. Nunca antes había programado en Mono y tampoco había desarrollado interfaces gráficas usando Gtk o Gtk#, asi que probablemente este post le sea útil únicamente a novatos en Mono y Gtk# ( como yo :) ).

Buscando en internet encontré 2 posts, de los cuales tome código y le hice pequeñas adecuaciones para crear 2 clases que son subclases de la clase Entry.

Lo que hace el código es capturar el evento KeyPress y verificar la tecla que pulsó el usuario, a partir de ahi decide si es una tecla o caracter permitido o no.

Creé una clase llamada EntryEnteros y una clase llamada EntryDecimales. Las clases son casí idénticas, la diferencia es que la segunda acepta el punto como caracter permitido y la primera no. Esto implica que en la segunda clase se agrega el caracter “.” en la cadena s_charvalidos pero también se captura cuando el usuario pulsa el punto del teclado numérico (Gdk.Key.KP_Decimal).

El código del post http://nexus.developarts.com/limitar_la_captura_de_un_entry#comment-769 no funciona si el usuario usa el teclado numérico para introducir datos, sólo acepta los números de la parte superior del teclado; tampoco permite al usuario moverse con las flechas izquierda o derecha. El código que me sirvió de base para incluir eso está en el post http://mbrenes.blogspot.com/2007_02_01_archive.html pero es para Gtk, así que sólo hice los cambios necesarios para pasarlo a Gtk#.

Este ejemplo fue realizado en Debian Lenny

Esta es la clase EntryEnteros


/* Archivo entryenteros.cs */

using System;
using Gtk;

public class EntryEnteros : Entry
{
   public EntryEnteros()
   {
      KeyPressEvent +=  new KeyPressEventHandler(TeclaPulsada);
   }

   // Conectamos el manejador de eventos antes del evento KeyPress
   [GLib.ConnectBefore ()]

   private void TeclaPulsada(object o, KeyPressEventArgs args)
   {
      string s_charvalidos = "0123456789";

      // Para que al pulsar enter el foco se pase al siguiente control
      if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter)
         {           
          Toplevel.ChildFocus (DirectionType.TabForward);
          args.RetVal = true;
         }
      else
          // Solo se permiten los caracteres en s_charvalidos, los números del teclado numérico (KP_0...),
          // el backspace, el delete, flecha izquierda, flecha derecha
          if (Array.IndexOf(s_charvalidos.ToCharArray(), Convert.ToChar(args.Event.Key)) == -1 && args.Event.Key!=Gdk.Key.BackSpace && args.Event.Key!=Gdk.Key.Delete && args.Event.Key!=Gdk.Key.Left && args.Event.Key!=Gdk.Key.Right && !(args.Event.Key >=Gdk.Key.KP_0 && args.Event.Key <=Gdk.Key.KP_9))
              args.RetVal = true;     
   }
}

Esta es la clase EntryDecimales


/* Archivo entrydecimales.cs */

using System;
using Gtk;

public class EntryDecimales : Entry
{
   public EntryDecimales()
   {
      KeyPressEvent +=  new KeyPressEventHandler(TeclaPulsada);
   }

   // Conectamos el manejador de eventos antes del evento KeyPress
   [GLib.ConnectBefore ()]

   private void TeclaPulsada(object o, KeyPressEventArgs args)
   {
      string s_charvalidos = "0123456789.";

      // Para que al pulsar enter el foco se pase al siguiente control
      if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter)
         {           
          Toplevel.ChildFocus (DirectionType.TabForward);
          args.RetVal = true;
         }
      else
          // Solo se permiten los caracteres en s_charvalidos, los números del teclado numérico (KP_0...),
          // el backspace, el delete, flecha izquierda, flecha derecha
          if (Array.IndexOf(s_charvalidos.ToCharArray(), Convert.ToChar(args.Event.Key)) == -1 && args.Event.Key!=Gdk.Key.BackSpace && args.Event.Key!=Gdk.Key.Delete && args.Event.Key!=Gdk.Key.Left && args.Event.Key!=Gdk.Key.Right && args.Event.Key!=Gdk.Key.KP_Decimal && !(args.Event.Key >=Gdk.Key.KP_0 && args.Event.Key <=Gdk.Key.KP_9))
              args.RetVal = true;     
   }
}

Con el siguiente programa podemos probar nuestras 2 clases


/* Archivo prueba.cs */

using System;
using Gtk;

public class prueba
{
    public static void Main()
    {
        Application.Init();
        Window w_principal = new Window("Limitar captura en un Entry");
        w_principal.DeleteEvent += delete_event;

        EntryEnteros e_cantidad = new EntryEnteros ();
        EntryDecimales e_precio = new EntryDecimales ();
        HBox hb_cantidad = new HBox (true, 0);
        HBox hb_precio = new HBox (true, 0);
        VBox vb_contenedor = new VBox();

        hb_cantidad.PackStart (new Label ("Cantidad: "), false, false, 0);
        hb_cantidad.PackStart (e_cantidad);
        hb_precio.PackStart (new Label ("Precio: "), false, false, 0);
        hb_precio.PackStart (e_precio);
        vb_contenedor.PackStart (hb_cantidad, true, true, 0);
        vb_contenedor.PackStart (hb_precio, true, true, 0);

        w_principal.Add(vb_contenedor);
        w_principal.ShowAll();
        Application.Run();
    }

    static void delete_event (object obj, DeleteEventArgs args)
    {
        Application.Quit();
    }
}

Compilamos

gmcs -pkg:gtk-sharp-2.0 prueba.cs entryenteros.cs entrydecimales.cs

Con esto tenemos nuestro archivo prueba.exe, el cual ejecutamos tecleando ./prueba.exe

A continuación una captura de la pantalla ya con datos introducidos

prueba

¿Usar GNU/Linux es dificil?

Marzo 24, 2009 by rtmex

Muchas personas (incluso algunas relacionadas con el campo de la informática) tienen la idea de que usar GNU/Linux (cualquier distribución) es dificil.

Yo considero que no es dificil, el problema es que los que tienen esa idea es porque están acostumbrados a usar otro sistema operativo (generalmene alguna versión de Windows) y les da “miedo” o flojera aprender a utilizar un sistema operativo que nunca han usado. Pero lo mismo pasaría si a una persona que aprendió a usar las computadoras y lo hizo utilizando una computadora con GNU/Linux instalado, despues de algunos años se le pide que utilize Windows.

A todos aquellos que no han utilizado GNU/Linux no me queda mas que decirles que no saben de lo que se están perdiendo. Entre algunas de las ventajas que tienen sistemas operativos como GNU/Linux o cualquiera de los BSD (FreeBSD, NetBSD, OpenBSD, etc.) es su estabilidad, el uso eficiente de los recursos, la seguridad, etc.

Si no eres ingeniero/licenciado en sistemas o informática (digamos que eres contador, abogado, estudiante, o cualquiera que sea tu actividad) y estás pensando que es imposible que dejes de usar Windows y empieces a utilizar GNU/Linux, te invito a que sigas leyendo.

Existe una persona en Argentina llamada Maria Elena Casañas que no estudio sistemas, informática ni algo parecido. Después de haber usado Windows por 15 años descubrio (según sus propias palabras) el software libre y decidió de un dia para otro empezar a utilizar Mandriva (una distribución de GNU/Linux).

¿Qué es lo sorprendente de este relato?, bueno, Maria Elena Casañas aprendió a utilizar una computadora despues de los 50 años (esto quiere decir que con mas de 65 años empezó a utilizar GNU/Linux).

En está página pueden leer la reproducción de un post que ella misma escribió

http://www.kriptopolis.org/linux-para-informaticos

Las sorpresas no terminan ahi, Maria Elena Casañas está tan feliz usando software libre y tan convencida de sus beneficios que tiene una página web dedicada a ayudar a personas comunes, sin conocimientos avanzados de informática a descubrir el mundo del software libre.

http://www.casanas.com.ar/

Además tiene un blog

http://elblogdemec.blogspot.com/

En la página podrán encontrar mucho material que además está explicado con un lenguaje fácil de comprender.

Desde luego la migración de software privativo a software libre no tiene que ser de un dia para otro (no tienes que cambiar de Windows a GNU/Linux en 24 horas), lo más recomendable es hacerlo por etapas; puedes por jemplo empezar por utilizar OpenOffice en lugar de Microsoft Office, instalandolo sobre tu PC con Windows sin problema alguno. Open Office además de ser software libre también es gratuito, te permite hacer prácticamente lo mismo que haces con Microsoft Office y puedes leer archivos generados por Microsoft Office y guardar tus archivos con los formatos utilizados por Microsoft Office (.doc. xls, etc.), para que tus archivos los puedan leer personas que no tengan OpenOffice instalado.

Probablemente estes pensando: “Bueno, el caso de Maria Elena Casañas es un caso extraordinario, no creo que algo asi pase muy seguido”.

Así que dejame darte otro ejemplo: “El cocinero que instaló Debian GNU/Linux y tuvo éxito”

http://casidiablo.net/el-cocinero-que-instalo-debian-gnulinux-y-tuvo-exito/

Te invito a que te hagas las siguientes preguntas:

  1. ¿Será realmente tan difícil usar GNU/Linux cuando una persona de mas de 65 años, “no informática” aprendió a usarlo y lo sigue usando actualmente?
  2. ¿Si Maria Elena Casañas pudo dejar de utilizar Windows después de 15 años para utilizar GNU/Linux, no puedo hacerlo yo?

Si te animas, la página de Maria Elena Casañas es un buen punto de partida.

Agregar y borrar usuarios de Firebird desde C++ builder

Febrero 23, 2009 by rtmex

Agregar usuario

En la pestaña InterBase Admin de C++ builder 6 existe el componente TIBSecurityService, este componente sirve para agregar o borrar usuarios de un servidor de base de datos Firebird, así como para mostrar o modificar su información.

Suponiendo que dejamos la contraseña por default del usuario sysdba de Firebird y tenemos en un formulario de C++ Builder 6 (llamado Form1) un componente TButton llamado Button1 y 4 componentes TEdit llamados e_usuario, e_nombre, e_apellido y e_clave respectivamente, podríamos agregar un componente TIBSecurityService llamado IBSecurityService1 y poner el siguiente código en el evento OnClick de Button1 para agregar un usuario al servidor Firebird con los datos que contengan los TEdit.


void __fastcall TForm1::Button1Click(TObject *Sender)
{
  IBSecurityService1->Params->Values["user_name"]="sysdba";
  IBSecurityService1->Params->Values["password"]="masterkey";

  IBSecurityService1->Active = true;
  try
     {
      IBSecurityService1->UserName = e_usuario->Text;
      IBSecurityService1->FirstName = e_nombre->Text;
      IBSecurityService1->LastName = e_apellido->Text;
      IBSecurityService1->Password = e_clave->Text;
      IBSecurityService1->AddUser();
     }
  __finally
           {
            IBSecurityService1->Active = false;
           }
}

Notese que para indicar el usuario y password con el que se conectará el componente TIBSecurityService se usó

IBSecurityService1->Params->Values["user_name"]=”sysdba”;
IBSecurityService1->Params->Values["password"]=”masterkey”;

y no:

IBSecurityService1->Params->Add(”user_name = sysdba”);
IBSecurityService1->Params->Add(”password = masterkey”);

Ya que marcaría un error como “SPB Constant Unknown

Con esto queda agregado el usuario, pero falta hacer los grants para darle permisos de consulta (grant select), inserción (grant insert), borrado (grant delete) y actualización (grant update) sobre las tablas de la base de datos deseada.

Otorgar grants al usuario

Para esto, crearemos un stored procedure (procedimiento almacenado) en la base de datos.

El stored procedure (que llamaremos sp_Grants) otorgará todos los grants a un usuario sobre una tabla determinada; recibirá como parámetros el usuario y el nombre de la tabla.


/* Este procedure otorga todos los permisos al usuario que recibe como parámetro
   sobre la tabla que recibe como parámetro */

set term !! ;
create procedure sp_Grants(s_tabla varchar(65), s_usuario varchar(8))
as
  begin
        execute statement 'grant all on ' || :s_tabla || ' to ' || :s_usuario;
  end !!
set term ; !!

Agregamos a nuestro formulario un componente TIBDatabase llamado IBDatabase1 y un componente TIBStoredProc llamado IBSP_grants. En la propiedad Database del TIBStoredProc ponemos IBDatabase1 y en la propiedad StoredProcName SP_GRANTS (que es el nombre del stored procedure que creamos en la base de datos).

Por último agregamos un componente TListBox al que llamaremos lb_tablas. Lo que haremos será conectarnos a la base de datos, obtener los nombres de todas las tablas y pasarlos al ListBox, después iremos recorriendo el ListBox para otorgar todos los grants sobre todas las tablas al usuario llamando a nuestro stored procedure.

Basta con agregar el siguiente código al final del código que pusimos anteriormente en el evento OnClick del TButton llamado Button1.

En el ejemplo nuestra base de datos se llama prueba.fdb y se encuentra en el directorio llamado prueba de la unidad c:


 // Asigna la ruta a la base de datos
 IBDatabase1->Params->Values["user_name"]="sysdba";
 IBDatabase1->Params->Values["password"]="masterkey";
 IBDatabase1->DatabaseName = "c:\\prueba\\prueba.fdb";

 // Hace la conexión a la base de datos
 IBDatabase1->Connected=true;

 // Pasa los nombres de las tablas de la base de datos al ListBox
 IBDatabase1->GetTableNames(lb_tablas->Items,False);

 // Se desconecta de la base de datos
 IBDatabase1->Connected=false;

 for (int i_x=0; i_x<lb_tablas->Items->Count; i_x++)
     {
      IBSP_grants->ParamByName("s_tabla")->AsString = Trim(lb_tablas->Items->Strings[i_x]);
      IBSP_grants->ParamByName("s_usuario")->AsString = e_usuario->Text;
      IBSP_grants->ExecProc();
      lb_tablas->ItemIndex++;
     }
 lb_tablas->Clear();

Si queremos que no se vea el ListBox sólo debemos poner false en su propiedad Visible

Borrar usuario

Agregamos un componente TButton al que llamaremos Button2 y en su evento OnClick pondremos el siguiente código


void __fastcall TForm1::Button2Click(TObject *Sender)
{
  IBSecurityService1->Params->Values["user_name"]="sysdba";
  IBSecurityService1->Params->Values["password"]="masterkey";

  IBSecurityService1->Active = true;
  try
     {
      IBSecurityService1->UserName = e_usuario->Text;     
      IBSecurityService1->DeleteUser();
     }
  __finally
           {
            IBSecurityService1->Active = false;
           }
}

Nota: En el post la macro [sourcecode..] de wordpress muestra finally, pero debe ser __finally

Error java.lang.NoClassDefFoundError en Debian Etch

Febrero 11, 2009 by rtmex

En una PC con Windows instalé NetBeans 6.5 y desarrollé una aplicación GUI muy sencilla en java.

Después intenté ejecutar esta aplicación en una PC con Debian Etch escribiendo desde consola:

java -jar nombre_aplicacion.jar

y aparecia el siguiente error:

Exception in thread “main” java.lang.NoClassDefFoundError: javax/swing/GroupLayo
ut$Group

Este error se debe a que está instalada la versión 5.0 del JRE (Java Runtime Environment) de Sun que viene en el paquete sun-java5-jre de Debian Etch y NetBeans 6.5 utiliza una versión más nueva.

La version 6 del JRE viene en el paquete sun-java6-jre que se encuentra en el repositorio de backports para Debian Etch http://packages.debian.org/etch-backports/sun-java6-jre

En mi post sobre instalar firebird 2.0 en Debian Etch explico como agregar este repositorio.

Ya que tenemos agregado el repositorio a nuestro archivo de fuentes (/etc/apt/sources.list) y hecho el respectivo apt-get update procedemos a desinstalar la versión 5.o del JRE

Para ver que paquetes de java tenemos instalados ejecutamos

dpkg -l |grep sun-java

En mi caso aparecen los siguientes paquetes

ii sun-java5-bin 1.5.0-14-1etch1 Sun Java(TM) Runtime Environment (JRE) 5.0 (
ii sun-java5-demo 1.5.0-14-1etch1 Sun Java(TM) Development Kit (JDK) 5.0 demos
ii sun-java5-jdk 1.5.0-14-1etch1 Sun Java(TM) Development Kit (JDK) 5.0
ii sun-java5-jre 1.5.0-14-1etch1 Sun Java(TM) Runtime Environment (JRE) 5.0 (

Esto es porque además del JRE también tengo instalado el kit para desarolladores JDK (Java Development Kit).

Para eliminar los paquetes ejecutamos

sudo apt-get –purge remove sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre

Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Los siguientes paquetes se ELIMINARÁN:
sun-java5-bin* sun-java5-demo* sun-java5-jdk* sun-java5-jre*
0 actualizados, 0 se instalarán, 4 para eliminar y 38 no actualizados.
Necesito descargar 0B de archivos.
Se liberarán 114MB después de desempaquetar.
¿Desea continuar [S/n]?

Decimos que si y la desinstalación termina

La instalación de java en Debian normalmente crea algunos enlaces simbólicos, para ver si existen enlaces simbólicos para java ejecutamos

sudo update-alternatives –display java

En mi caso muestra
No hay alternativas para java.

Pero si se hubieran encontrado enlaces simbólicos habría que eliminarlos ejecutando

sudo update-alternatives –remove-all java

Después ejecutamos

sudo update-alternatives –display javac

En mi caso muestra
javac – el estado es manual.
el enlace apunta actualmente a /usr/lib/jvm/java-1.5.0-sun/bin/javac
No hay ninguna versión disponible.

Como en el caso anterior, para eliminar todos los enlaces simbólicos ejectuamos

sudo update-alternatives –remove-all javac

Nota: Los siguientes enlaces son útiles para conocer más sobre la administración de paquetes en Debian (instalación, desinstalación, saber el estatus de un paquete, etc.)

http://www.debian.org/doc/manuals/apt-howto/ch-search.es.html
http://www.debian.org/doc/manuals/quick-reference/ch-package.es.html

Ahora si procedemos a instalar el JRE 6 de Sun para lo cual ejecutamos

sudo apt-get install sun-java6-jre

Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Se instalarán los siguientes paquetes extras:
sun-java6-bin
Paquetes sugeridos:
binfmt-support sun-java6-plugin ia32-sun-java6-plugin sun-java6-fonts ttf-baekmuk ttf-unfonts ttf-unfonts-core ttf-kochi-gothic ttf-sazanami-gothic
ttf-kochi-mincho ttf-sazanami-mincho ttf-arphic-uming
Paquetes recomendados
libnss-mdns gsfonts-x11
Se instalarán los siguientes paquetes NUEVOS:
sun-java6-bin sun-java6-jre
0 actualizados, 2 se instalarán, 0 para eliminar y 38 no actualizados.
Necesito descargar 33.6MB de archivos.
Se utilizarán 96.4MB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]?

Decimos que si y aparece la siguiente pantalla

java6

Seleccionamos aceptar y ahora aparece la siguiente pantalla

java6_2

Después de aceptar los términos de la licencia la instalación termina

Seleccionando el paquete sun-java6-bin previamente no seleccionado.
Desempaquetando sun-java6-bin (de …/sun-java6-bin_6-07-3~bpo40+1_i386.deb) …
sun-dlj-v1-1 license has already been accepted
Configurando sun-java6-bin (6-07-3~bpo40+1) …

Configurando sun-java6-jre (6-07-3~bpo40+1) …

Si ejecutamos

dpkg -l |grep sun-java

Ahora nos muestra

ii sun-java6-bin 6-07-3~bpo40+1 Sun Java(TM) Runtime Environment (JRE) 6 (ar
ii sun-java6-jre 6-07-3~bpo40+1 Sun Java(TM) Runtime Environment (JRE) 6 (ar

Ahora ya podemos ejecutar nuestra aplicacion java que contiene una interfaz gráfica de usuario (GUI) sin problemas.

Convertir una cadena a double en c++ builder

Febrero 9, 2009 by rtmex

La siguiente función recibe una cadena, elimina de la misma todos los caracteres que no sean números y regresa un double.

Acepta el caracter – al principio de la cadena para indicar números negativos y un punto para separar decimales (sólo se acepta el primer punto que contenga la cadena)

Ejemplo:  Si la función recibe la cadena “5-A-6200″, regresará un double cuyo valor será 56200.

Si la cadena no se puede convertir a un número, la función regresa el número cero.


double __fastcall TForm1::ConvierteANumero(String s_cadena)
{
 String s_aux="";
 bool bl_negativo=false;

 // Si la cadena que recibe está vacia, regresa 0
 if (s_cadena=="")
     s_aux="0";
 else
     {
      // Checa el primer caracter para ver si es el signo menos
      if (s_cadena.SubString(1,1)=="-")
          bl_negativo=true;

      // Va recorriendo la cadena que recibe y pasando a s_aux sólo los números y el punto
      for (int i_x=1;i_x <=s_cadena.Length();i_x++)
          {
           if (s_cadena.SubString(i_x,1)>= '0' && s_cadena.SubString(i_x,1)<= '9')
               s_aux=s_aux+s_cadena.SubString(i_x,1);
           else
               {
                // Si el caracter es un punto, verifica que no exista ya un punto en la cadena
                if (s_cadena.SubString(i_x,1) == '.' && s_aux.Pos('.')==0)
                    s_aux=s_aux+s_cadena.SubString(i_x,1);
               }
          }
     }
 if (bl_negativo)
     s_aux="-"+s_aux;

 // Si la cadena resultante está vacia, segnifica que s_cadena no contenía ningún número, sólo caracteres. así que se convierte a 0
 if (s_aux.IsEmpty())
     s_aux="0";
 else
     if (s_aux.Length()==1 && !(s_aux >= '0' && s_aux <= '9'))
         s_aux="0";

 return s_aux.ToDouble();
}

Instalar firebird 2.0 en Debian Etch

Febrero 5, 2009 by rtmex

En Debian Etch se encuentra el paquete firebird2-super-server pero la versión de firebird que contiene corresponde a la rama 1.5.x y no a la 2.0.x.

Para instalar la versión de firebird correspondiente a la rama 2.0.x debemos instalar el paquete firebird2.0-super que se encuentra en el repositorio de backports http://packages.debian.org/etch-backports/firebird2.0-super

Nota: La instalación fue realizada en una PC con la versión de Debian Etch en inglés, por lo que los mensajes y pantallas que se muestran contienen los textos en inglés pero el proceso que se debe seguir en la versión en español es el mismo.

Lo primero que debemos hacer es agregar el repositorio de backports al archivo de fuentes /etc/apt/sources.list para lo cual insertamos las siguientes lineas:

deb http://www.backports.org/debian etch-backports main contrib non-free
deb-src http://www.backports.org/debian etch-backports main contrib non-free

Despues hacemos sudo apt-get update
Cuando termina, al final nos muestra un mensaje como el siguiente:

Reading package lists… Done
W: GPG error: http://www.backports.org etch-backports Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY EA8E8B2116BA136C

No hay problema, el error es porque no tenemos la clave para la autenticación del repositorio backports.
Lo solucionamos instalando el paquete debian-backports-keyring:

sudo apt-get install debian-backports-keyring

Aparece el siguiente mensaje:

Reading package lists… Done
Building dependency tree… Done
The following NEW packages will be installed:
debian-backports-keyring
0 upgraded, 1 newly installed, 0 to remove and 86 not upgraded.
Need to get 3310B of archives.
After unpacking 49.2kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
debian-backports-keyring
Install these packages without verification [y/N]?

Decimos que si y la instalación continúa

Get:1 http://www.backports.org etch-backports/main debian-backports-keyring 2007.06.10 [3310B]
Fetched 3310B in 2s (1640B/s)
Selecting previously deselected package debian-backports-keyring.
(Reading database … 43431 files and directories currently installed.)
Unpacking debian-backports-keyring (from …/debian-backports-keyring_2007.06.10_all.deb) …
Setting up debian-backports-keyring (2007.06.10) …
OK

Ahora si procedemos a instalar firebird 2.0 en su arquitectura super server

sudo apt-get install firebird2.0-super

Al final muestra este mensaje

Setting up firebird2.0-super (2.0.3.12981.ds1-14~bpo40+1) …
Created default security.fdb
Firebird 2.0 server manager not running.
* Not starting Firebird 2.0 server manager
* Use `dpkg-reconfigure firebird2.0-super’ to enable.

Ejecutamos sudo dpkg-reconfigure firebird2.0-super y en la pantalla que aparece seleccionamos Yes
config_firebird_1
En la siguiente pantalla ponemos un password para el usuario SYSDBA

config_firebird_2
y después de dar OK la instalación termina indicandonos que el servidor ya esta funcionando.

Firebird 2.0 server manager not running.
Starting Firebird 2.0 server manager…done.
GSEC> GSEC> Firebird 2.0 server manager already running.

Para verificar que está corriendo el servidor ejecutamos

top -b -n1 | grep fb

Debe aparecer un proceso llamado fbguard y uno llamado fbserver

2353 firebird  20   0  3720 1492 1240 S  0.0  0.8   0:00.00 fbguard
2354 firebird  19   0 36272 4192 3060 S  0.0  2.2   0:00.05 fbserver

Creamos un directorio en donde pondremos la base de datos que será accesible desde los clientes remotos con Windows

sudo mkdir /database

Ponemos como propietario del directorio al usuario firebird

sudo chown firebird.firebird /database

Copiamos a este directorio la base de datos, en este caso se llama baseprueba.fdb.
Ya que tenemos la base de datos en ese directorio, ponemos como propietario al usuario firebird

cd /database
sudo chown firebird.firebird baseprueba.fdb

Ahora vamos al directorio /etc/firebird/2.0 y editamos el archivo aliases.conf para crear un alias para la base de datos indicando la ruta en que se encuentra:

Agregamos la siguiente linea al final del archivo aliases.conf
baseprueba.fdb = /database/baseprueba.fdb

Eso es todo, la ruta que deben usar las maquinas cliente en windows para accesar a la base de datos es la IP del servidor, seguido de dos puntos y el alias de la base de datos.

Por ejemplo 192.168.1.10:baseprueba.fdb

Para información de firebird en español se puede consultar el siguiente enlace http://www.firebird.com.mx

Convertir archivo PostScript a PDF

Febrero 2, 2009 by rtmex

Para convertir un archivo PostScript (ps) a formato PDF en Debian Etch podemos utilizar el script ps2pdf, que es parte del paquete gs. Para instalar el paquete gs, debemos teclear desde consola:

sudo apt-get install gs

A continuación, un ejemplo en donde convertimos un archivo PostScript llamado book.ps a formato PDF:

ps2pdf book.ps book.pdf