Tips VirtualBox en Debian GNU/Linux

Written by psep on 11 Mayo, 2013 Categories: Debian, GNU-Linux Tags: , , , , , , ,

- Si usas la rama sid/experimental, probablemente tendrás problemas con el servicio del Virtualbox. Esto debido a que quien maneja los controladores del kernel (virtualbox-dkms) no soporta nuevas versiones del núcleo Linux.

Actualmente sid tiene la versión 3.8.x del kernel linux y Virtualbox 4.1.x. El panorama no mejora mirando a la rama experimental, donde aún hay una versión “más nueva” de la misma rama 4.1.x de Virtualbox, por lo que es recomendable bajar Virtualbox directamente de su web oficial https://www.virtualbox.org/wiki/Linux_Downloads (dónde dice Debian…) e instalar el paquete deb con un simple dpkg -i nombredelpaquete.deb.

- Para redimensionar particiones (y otras funciones más), VirtualBox posee la herramienta VboxManage en la shell. Sólo basta con:

VBoxManage modifyhd --resize 20000 imagen.vdi

La descripción del comando es demasiado evidente.

Sin comentarios

Debianizando: Empaquetar aplicaciones en Java

Written by psep on 31 Marzo, 2013 Categories: Debian, GNU-Linux, Java, Programación Tags: , , , , ,

deb-dpkg

Mantener y empaquetar software no es muy complejo. Las grandes ventajas de empaquetar tu software hecho en Java es poder entregar instaladores fáciles y rápidos para otras distribuciones “debian like”, sin necesidad de ejecutar el .jar desde la shell con java -jar (en algunos casos). Esa es una de las ventajas.

Para llevar a cabo esto, es necesario realizar un árbol de directorios, completar unos ficheros y ejecutar la herramienta dpkg.

Todo el procedimiento está detallado en este post y mi intención no es copiar lo que ya está hecho, por lo que hice un script en bash que genera el empaquetado, el cual puedes descargar en el siguiente enlace.

Saludos.

Sin comentarios

Base de Datos Embebidas: De SQLite a Java con JDBC

Written by psep on 30 Marzo, 2013 Categories: Java, Programación Tags: , ,

No es mi intención profundizar mucho sobre las diversas bases de datos embebidas que existen, sino lo más importante, sus funcionalidades y para lo que sirven.

En algunas ocasiones, cuando desarrollamos aplicaciones para el escritorio (que tal parece que está pasado de moda versus la web), y queremos ser prácticos a la hora de implementar bases de datos con estas futuras apps lo indicado sería usar db embebidas. A menos que nuestra aplicación se conectara a una base de datos externa por una URL. Pero si nuestra app no necesita compartir su base de datos sería un gasto innecesario tenerla en un servidor externo y mucho menos que nuestra aplicación se conectara a ella.

Es donde viene el concepto de base de datos embebida, donde podamos guardar información tanto temporal (que volquemos las tablas una vez cerrada la aplicación) como tener diversas propiedades que queramos que sean dinámicas, etc.

Un ejemplo es SQLite. Éste un motor de base de datos que no necesita implementación en un servidor ni configuración, es relacional y obviamente utiliza SQL para sus transacciones, además de ser rápida y ágil. Sus fuentes son de dominio público y es muy utilizado por ejemplo en aplicaciones Android, entre otros.

Tampoco me quiero extender con las bondades y obviamente desventajas de SQLite, para mayor información podemos usar Wikipedia o Google.

La mayoría de las distribuciones cuenta en sus repositorios con SQLite, sino puedes descargarlo desde su web oficial http://www.sqlite.org/.

El cliente que ocupo para este motor de base de datos es un complemento para Mozilla Firefox (compatible con Iceweasel e Icecat) llamado SQLite Manager y es bastante completo.

sqlite_manager

Del como crear una base de datos SQLite (extensión .sqlite) y tablas es bastante intuitivo y dar una explicación sobre ello estaría demás.

Para conectarnos desde Java necesitamos el driver jdbc, que podemos descargar desde su web oficial.

Una vez incluida la librería en nuestro proyecto, basta con lo siguiente:

    protected Connection loadConnection(){
        Connection con = null;

        try{
            //Instancia del driver JDBC de SQLite
            DriverManager.registerDriver(new org.sqlite.JDBC());

            //Creamos un objeto StringBuilder para concatenar String de conexión
            StringBuilder strConUrl = new StringBuilder();
            strConUrl.append("jdbc:sqlite:");
            strConUrl.append("exampleApp.sqlite"); // URL de nuestra base de datos

            con = DriverManager.getConnection(strConUrl.toString());

        }catch(Exception e){
            e.printStackTrace();
        }

        return con;
    }

Del porqué ese método está protected, por la sencilla razón que por lo general, manejo las conexiones en una clase abstracta, para que las clases que necesiten conexiones tengan extender esta misma y sólo así puedan usar el método de conexión loadConnection(). Ese método retorna un objeto de tipo conexión a la base de datos SQLite.

Sin comentarios

Clase Iterator (tipo Java) en PHP y update de ArrayList

Written by psep on 18 Marzo, 2013 Categories: PHP, Programación Tags: , , ,

Viendo que la implementación de este patrón en PHP era pobre, decidí hacer mi propia clase tomando las características del Iterator de Java, así como ya lo hice con StringBuilder.

<?php

        /**
     	 * Copyright (C) 2013 - Pablo Sepúlveda @psep
         *
	 * IteratorPattern v1.0a
	 *
     	 * This file is part of gEvents.
     	 * gEvents is free software: you can redistribute it and/or modify
     	 * it under the terms of the GNU General Public License as published by
    	 * the Free Software Foundation, either version 3 of the License, or
     	 * any later version.
     	 *
     	 * gEvents is distributed in the hope that it will be useful,
     	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     	 * GNU General Public License for more details.
     	 *
     	 * You should have received a copy of the GNU General Public License
	 * along with gEvents.  If not, see <http://www.gnu.org/licenses/>.
	 *
	 */
	final class IteratorPattern{

		private $position;
		private $sizeList;
		private $array;

		function __construct($list){
			$this->position	= 0;
			$this->array	= $list;
			$this->sizeList = $this->size();		
		}

		/*
		 * @return tamaño de la lista
		 */
		final private function size(){
			$size = 0;

			foreach ($this->array as $item) {
        			$size++;
      			}

			return $size;		
		}

		/*
		 * @return boolean
		 * 
		 * Retorna true cuando el puntero (position) 
		 * está dentro de la lista.
		 */
		final public function hasNext(){
			$result = false;

			if($this->position == 0 && $this->sizeList > 0){
				$result	= true;	
			}else if($this->position < $this->sizeList){
				$result	= true;
			}

			return $result;		
		}

		/*
		 * @return item de la lista según posición
		 */
		final public function next(){
			$item = NULL;

			if($this->position < $this->sizeList){
				$item = $this->array[$this->position];
				$this->position++;
			}

			return $item;
		}	

	}

?>

La clase lleva por nombre IteratorPattern para diferenciarse de la Interface Iterator de PHP (nombre protegido).

Así también hice unas mejoras para la clase ArrayList que hice un tiempo atrás:

<?php

	/*
	 * Copyright (C) 2013 - Pablo Sepúlveda @psep
     	 *
	 * ArrayList v1.5a
	 *
     	 * This file is part of gEvents.
     	 * gEvents is free software: you can redistribute it and/or modify
     	 * it under the terms of the GNU General Public License as published by
     	 * the Free Software Foundation, either version 3 of the License, or
     	 * any later version.
     	 *
      	 * gEvents is distributed in the hope that it will be useful,
     	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     	 * GNU General Public License for more details.
     	 *
     	 * You should have received a copy of the GNU General Public License
     	 * along with gEvents.  If not, see <http://www.gnu.org/licenses/>.
     	 *
     	 */
	final class ArrayList {

		private $array = array();

		/*
		 * @return valor del ArrayList
		 */
		final public function getArrayList(){
			return $this->array;
		}

		/*
		 * Limpia el array()
		 */
		final public function clear(){
			$this->array = array();
		}

 		/*
		 * @param $item
		 * 
		 * Agrega un nuevo item al array
		 */
    		final public function add($item){
      			$this->array[] = $item ;
    		}

 		/*
		 * @return array como una cadena de string
		 */
    		final public function toString(){
    			$cadena = "";
      			foreach ($this->array as $item) {
        			$cadena .= $item;
      			}
      			return $cadena;
    		}

 		/*
		 * @param $item
		 * 
		 * Remueve un item determinado del array
		 */
    		final public function remove($item){
    			unset($this->array[$item]);
    		}

		/*
		 * @param $item
		 * 
		 * Retorna un item determinado
		 */
    		final public function get($item){
			return $this->array[$item];
    		}

 		/*
		 * @return tamaño del array
		 */
 		final public function size(){
    			$size = 0;
      			foreach ($this->array as $item) {
        			$size++;
      			}
      			return $size;
    		}

	}
?>

Todas las clases que he hecho y que haré como implementaciones las iré subiendo al proyecto “My PHP Classes” en Code Google para que queden a libre disposición. Pronto redactaré la wiki en el proyecto para que usuarios nóveles puedan usar las clases de manera fácil.

Sin comentarios

Manejo de servicios en Debian GNU/Linux con rcconf

Written by psep on 17 Marzo, 2013 Categories: Debian, GNU-Linux Tags: , , , , ,

Un simple programa vía shell para el manejo de servicios del equipo, en esos casos cuando por ejemplo no quiero que se levante el Servidor Apache, MySQL, etc., al inicio del sistema. Sólo basta instalarlo desde los repositorios.

# apt-get install rcconf

Luego lo ejecutas desde la shell como root:

# rcconf

rcconf_cap

Es bastante simple e intuitivo para usar, los que están marcados representan a los servicios activos que se inician al iniciar (valga la redundancia) el sistema. Si quieres que un servicio no se cargue al inicio sólo lo desmarcas y pones aceptar. Bastante fácil, ¿no?

 

2 Comentarios

Switch to our mobile site