lunes, 24 de octubre de 2011

Aplicativos útiles y gratuitos

Los necesitamos y no sabemos que ahí están:
  • PDFCreator: impresora virtual que nos permite imprimir en un archivo pdf.
  • CCleaner: optimización y limpieza de Windows.
  • Defraggler: un desfragmentador de disco más eficiente.
  • Recuva: recuperador de archivos borrados.
  • Speccy: herramienta que permite obtener información del sistema.
  • GParted: un distro de Linux que te permite bootear con el y realizar cambios en las particiones de los discos con una interfaz muy agradable.
  • 7-Zip: para mi, uno de los mejores de su género, permite comprimir y descomprimir archivos, así como verificar la integridad de los mismos y esta disponible en arquitectura de 32 y 64btis.
  • Foxit Reader: una alternativa al Adobe Reader, que es muy liviano y aparte de eso es menos atacado por los Hackers. La interfaz es muy agradable.
  • FileZilla Client y Server: son aplicaciones que te permiten conectarte a servidores FTP o convertir tu PC en un servidor FTP de forma muy sencilla y rápida.
  • CloneVDI: permite clonar Discos Virtuales.
  • VLC: de los mejores reproductores de vídeos, lo recomiendo mucho.
  • Calibre: herramienta que te permite administrar libros digitales, convertirlos y sincronizarlos con casi todos los lectores de libros digitales más conocidos.
  • Freemake Video / Audio converter: son herramientas que te permiten convertir vídeo y audio en los formatos más conocidos y lo mejor de todo es que permite conversión de vídeo HD.
  • FreeStudio: suite de conversión de medios, muy bueno también.
  • VirtualBox: permite virtualizar PCs, es muy bueno, lo recomiendo.
  • MagicISO: permite virtualizar unidades DVD para montar imágenes de disco en distintos formatos (*.iso, *.cue, etc).
  • Daemon Tools Lite: es similar al MagicISO pero más estilizado y "pesado", éste permite Blu-ray.
  • Sigil: es un editor WYSIWYG (acrónimo de What You See Is What You Get, "lo que ves es lo que obtienes") de libros digitales.
  • ArgoUML: herramienta de modelado UML e incluye soporte para todos los estándar UML 1.4. Se ejecuta en cualquier plataforma Java y está disponible en diez idiomas. Permite ingeniería inversa de código java.
  • DrJava: es un entorno de desarrollo ligero para escribir programas Java. Está diseñado principalmente para los estudiantes, proporcionando una interfaz intuitiva y la capacidad de evaluar de forma interactiva el código de Java.
  • OpenOffice o LibreOffice: e utilizado desde la versión 1.1 de OpenOffice hasta la actual y nunca he tenido que utilizar Microsoft Office a excepción del Outlook por el trabajo; pero hay que ser realizastas, la aplicación para diseñar presentaciones esta muy, muy lejos de ser tan amigable y versátil como lo es el Powerpoint, a parte de eso todas las demás herramientas son muy completas y hasta tienen funcionalidades que el mismo Microsoft Office no tiene.
  • Firefox: navegador web que utilizo siempre, recomiendo agregar los complementos: NoScript, DownThemAll!, DownloadHelper y el diccionario de Español/España.
  • ThunderBird: es un cliente de correos electrónicos que también utilizo mucho en mi PC personal.
Bueno estos son algunos de los que me he acordado, cuando me acuerde de más los estaré actualizando.

martes, 19 de julio de 2011

¿Cuántas filas retorna un ResultSet?

En uno de mis blogs doy un ejemplo de como retornar un vector con las filas de un ResultSet aún sin saber cuantas filas ha retornado éste, otra forma sencilla de saber la cantidad de filas que retorna un ResultSet es irnos hasta la última fila y extraer el número de ella, como ya sabemos, un ResultSet comienza en la fila 1 así que al irnos a la última fila, podremos saber cuantas filas tiene el ResultSet y cuando ya tengamos el valor nos devolvemos al inicio del ResultSet. He aquí un ejemplo simple y sin validaciones:

miResultSet.moveLast();
int cantFilas = miResultSet.getRow();
miResultSet.beforeFirst();

Para lograr esta funcionalidad (Scrollable ResultSet) debemos declarar el objeto Statement de la siguiente manera:

Statement stmt miConexion.createStatement(
   ResultSet.TYPE_SCROLL_INSENSITIVE,
   ResultSet.CONCUR_READ_ONLY
);
ResultSet miResultSet = stmt.executeQuery( miQuerySQL );


De esta manera también puedes utilizar otras funcionalidades como:
  • absolute( x ) mueve el cursor a la fila x.
  • relative( x ) mueve el cursor x filas hacia adelante o hacia atrás si -x.
  • previous( x ) mueve el cursor una fila hacia atrás, equivalente a previous(-1).
  • first() mueve el cursor a la primera fila, = beforeFirst() + next().
  • last() mueve el cursor a la última fila, = afterLast() + previous().
  • afterLast() mueve el cursor al final del ResultSet, aquí los métodos getXXX() y updateYYY() fallarán ya que estamos sobre una fila.
  • beforeFirst() mueve el cursor al inicio del ResultSet y al igual que el afterLast() los métodos getXXX() y updateYYY() no se deben utilizar.

  • Espero les sea de utilidad, de ser así cheka en [x]útil abajo ;)

    jueves, 7 de julio de 2011

    Paginación de filas desde SQL

    En alguna ocasión hemos visto que en una aplicación mostramos una tabla con los resultados de una consulta SQL, pero cuando la cantidad de filas es muy grande, la tabla también crece hacia abajo, que bonito sería poder mostrar solo una cantidad explícita de filas a la vez y que con solo oprimir siguiente nos muestre la siguiente secuencia de filas sin repetir, bueno, esta podría ser una solución:


    // La página que deseamos mostrar.
    DECLARE @Pagina INT = 2
    // Número de filas por página.
    DECLARE @Cant_deFilas INT = 10
    SELECT * FROM (
        SELECT RowNum = ROW_NUMBER() OVER (
            ORDER BY Campo_deOrdenamiento
        ), * FROM tbMiTabla ) AS t
    WHERE
        RowNum > (@Cant_deFilas * (@Pagina - 1)) AND
        RowNum <= (@Cant_deFilas * (@Pagina - 1)) + @Cant_deFilas
    ORDER BY Campo_deOrdenamiento


    Donde el Campo_deOrdenamiento es un campo de la tabla que nos funcione de orden para el contenido de ésta, puede ser un campo de fecha o algún ID.
    En éste ejemplo nos muestra el segundo grupo de 10 filas.
    Referencia completa: MSSQL Tips

    martes, 4 de mayo de 2010

    Manejo de errores en SQL Server

    BEGIN TRANSACTION
    BEGIN TRY

        -- Tu implementación aquí...
        -- ...
    COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK
        DECLARE @err varchar(MAX)
        SELECT @err = ERROR_MESSAGE()
        RAISERROR(
            N'Desde [Nombre del Procedimiento Almacenado]: %s',
            13, -- Severidad.
            1, -- Estado.
            @err –- Mensage original de error
        );
    END CATCH;

    jueves, 9 de abril de 2009

    tieneCamposVacios( Component ) : boolean

    Algo muy útil es un método que nos permita verificar si un JFrame tiene campos en blanco ( en este caso JTextField ); aquí les dejo un ejemplo básico de como realizar dicha operación y lo más importante es que al ser recursivo verificará para todos los objetos dentro del componente indicado, y si lo desean pueden modificar el método para que verifique también otros tipos de objetos como JFormattedTextField y más, solo deben utilizar su imaginación.


    /**
      * Verifica que los campos del Componente contenedores no estén vacíos.
      * @param elComponente Objeto contenedor, puede ser un JFrame u otros componentes similares.
      * @return <code>True:</code> Si los campos tienen valores.
    **/
    public static boolean tieneCamposVacios( Component elComponente ){
        if( elComponente instanceof Container )
            if( ((Container)elComponente).getComponents().length > 0 )
                for (Component elem : ((Container)elComponente).getComponents()) {
                    if( tieneCamposVasios( elem ) )
                        return true;
                }
            if( elComponente instanceof JTextField ){
                if( ((JTextField)elComponente).getText().trim().equals("") ){
                    return true;
                }
            }
            return false;
    }

    lunes, 6 de abril de 2009

    isNumeric( String ) en Java

    Algo que también es sumamente sencillo en .Net es poder determinar si un String representa un número. Aquí les dejo un método sencillo para implementar dicha función.

    /**
      * Método que recibe una cadena de caracteres y verifica si éste corresponde a un número.
      * @param s String a verificar.
      * @return <code>true:</code> Si el String corresponde a un número.
    **/

    public static boolean isNumeric( String s ){
        try{
            double y = Double.parseDouble( s );
            return true;
        }
        catch( NumberFormatException err ){
            return false;
        }
    }


    Si lo piensan, en java el tipo de dato numérico más grande es el double, si intentamos convertir el String ingresado en un double y éste nos genera una Excepción, ésto quiere decir que el String no es un número.

    viernes, 3 de abril de 2009

    Manipulación de los datos de un ResultSet en Java

    Algo que no me agrada de la manipulación de datos SQL en Java es que algunas cosas que son tan fáciles de realizar en .NET y otros lenguajes de programación, no lo son en Java.

    Un ejemplo sencillo de ésto es el poder determinar la cantidad de filas que retorna una consulta SQL en un objeto ResultSet; en muchos foros de programación recomiendan el realizar nuevamente una consulta a la BD con un COUNT pero eso es algo que no me resulta muy funcional, especialmente en BD excesivamente grandes como las que manejo en la empresa (600Gb)
    , piensen: "realizar otra consulta", como que no...

    Después de un tiempo logré diseñar una solución que en realidad es muy simple; en Java existe una librería llamada java.util que contiene una clase List, la cual permite agregar objetos a la lista de forma dinámica (como ya saben en java los vectores son de longitud fíja y por esta razón no podemos utilizarla ya que no sabemos la cantidad de filas retornadas), utilizando ésta Clase podemos implementar un método que consulte por ejemplo todos los Empleados de un Departamento X y que este método nos retorne un vector de tipo Empleado con todos los datos extraidos de la BD.

    Codigo Ejemplo:

    /**
      * Método que recibe el código del Departamento y retorna un vector de tipo Empleado con los datos de éstos.
      * @param idDepart Id del departamento del cual se desea extraer la información.
      * @return <code>Persona[]</code> Vector de Tipo Persona con los datos de los empleados pertenecientes al departamento.
      * @throws java.lang.Exception En caso de cualquier error de ejecución.
     */
    public static Emplado[] getEmpleadosX_Departamento( int idDepart ) throws Exception{
        try{
            /* Configuraciones de conexión. */
            String DRIVER_SQL = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
            String DRIVER_ORACLE = "oracle.jdbc.driver.OracleDriver";
            Class.forName( /* Alguno de los dos anteriores. */ );
            Connection Cnx = DriverManager.getConnection( /* String de conexión aquí. */ );
            Cnx.setAutoCommit( true );

            /* Ejecusión de la consulta. */
            String strSQL = "SELECT cedula, nombre FROM tbEmpleados WHERE idDept = " + idDepart;
            Statement stmt = Cnx.createStatement();
            ResultSet rsltEmpleados = stmt.executeQuery( strSQL );

            /*
            Instanciasión de la Lista.
            Como pueden observar al crear la lista se le indica que c/ítem
            de la lista es de tipo Empleado.
            */
            java.util.List<Empleado> listaEmpleados = new ArrayList<Empleado>();

            /*
            Se recorre cada fila del ResultSet para instancia a cada empleado y agregarlo a la lista de empleados.
            */
            while( rsltEmpleados.next() ){
                /* Se instancia del nuevo Empleado. */
                Empleado tempEmpleado = new Empleado(
                    rsltEmpleados.getString( "cedula" ) ),
                    rsltEmpleados.getString( "nombre" ) )
                );
                /* Se agrega el empleado a la lista. */
                listaEmpleados.add( tempEmpleado );
            }

            /* Cierre de la conexión con la BD. */
            Cnx.close();

            /*
            Se retorna el contenido de la Lista pero convirtiéndola en vector de tipo Empleado ingresando un nuevo vector de tipo Empleado y esta vez si sabemos el tamaño trayendo el tamaño de la lista.
            */
            return listaEmpleados.toArray( new Empleado[ listaEmpleados.size() ] );
        }
        catch( Exception err ){
            throw new Exception(
                "Error en getEmpleadosX_Departamento( int ).\nDetalle:\n + " + err.getMessage()
            );
        }
    }


    Este es un ejemplo básico y me disculpo si existen errores de sintaxis ya que lo he digitado y programado directamente del Blog y no le he compilado.

    Importante: En este ejemplo me he saltado una capa de programación y he agregado la capa de acceso a datos directamente a la capa de lógica de negocios, esto no es recomendable ya que deben de implementar una clase dedicada únicamente al acceso de los datos, conectar-desconectar-ejecutar-consultar, etc...