Powered By Blogger

domingo, 3 de diciembre de 2017

Instalación de Apache Derby 10.14.1.0 en Ubuntu Server 16.04 Parte II

En esta segunda entrega sobre Apache Derby, veremos cómo interactuar directamente con esta base.

Este post ha sido siguiendo la guía inicial de Apache Derby, de la cuál por acá dejo el link respectivo:

Empezando con Apache Derby

En la guía destaco que hay varias maneras de interactuar con Derby, según sea la necesidad:
  • Network Server.
  • Derby embebida en la aplicación.
  • Por medio de derbyrun.jar
Para efectos prácticos trabajaremos con la última opción: derbyrun.jar

Por medio de derbyrun.jar podremos interactuar desde modo consola con Apache Derby, les recuerdo que si es la primera vez que me leen, pueden referirse a la primera parte de esta entrega en un blog anterior:

Instalación de Apache Derby 10.14.1.0 en Ubuntu Server 16.04 Parte I

Por tanto, nuestro ejercicio se desarrolla en el entorno de Ubuntu 16.04 (GNU/Linux). Aclaro esto ya que la semántica de comandos, está totalmente aplicada en el sistema operativo antes mencionado.
Entremos ya en esencia...


1. Colocando las variables de ambiente respectivas.
La guía inicial de Derby recomienda establecer una variable de ambiente llamada DERBY_HOME, esta referenciando el directorio donde encontraremos los binarios de Derby. Para ello recomiendo hacer un bash/script en el cuál podamos definir estas variables al momento de operar dentro del sistema operativo con Derby.

Por acá les dejo cómo me quedó mi script:

 
* Quiero aclarar que si hemos realizado una instalación desde PPA del JDK de Java, la variable DERBY_HOME, estará originalmente apuntada hacia el directorio de instalación del JDK y no hacia Derby. Es por ello que recomiendo hacerlo de esta manera.

Ejecutaremos el script por medio del comando source, para que en la sesión activa las variables tomen el valor correspondiente:



Ojo:
Recomiendo que dentro del directorio de su afinidad creen una carpeta en la cual puedan realizar las operaciones con Derby, ya que Derby realizará los cambios, sobre el directorio que se encuentren.
* En el caso de este tutorial, el directorio de prácticas es /home/derby/derbytutor.

2. Probando nuestra instalación.
Podemos validar que la instalación previa de Derby se haya hecho correctamente, para ello comenzaremos a interactuar con derbyrun.jar:

Ejecutemos el comando sysinfo, el cuál nos mostrará la información de nuestro sistema operativo:



En la imagen anterior podemos ver qué importante se vuelve el seteo de la variable de ambiente DERBY_HOME. Puesto que al usar la interacción con derbyrun.jar estaremos recurrentemente interactuando con este programa.


3. Creando nuestra base de datos, tablas, proyecciones, inserciones, eliminaciones, actualizaciones...

Para estas operaciones, utilizaremos otra utilidad de Derby: ij (nos recuerda a sqlplus de Oracle XD)
ij nos permitirá ya ver materializado el objetivo de un motor RDBMS: Llenar de datos una base.


Creemos la base:

derby@vps158271:~/derbytutor$ java -jar $DERBY_HOME/lib/derbyrun.jar ij
ij version 10.14
ij> CONNECT 'jdbc:derby:mundialito;create=true';

ij> EXIT;


Por medio de este comando, ya dentro de ij creamos una base. Para salir de la interfaz usamos "exit;" 

Salí de la interfaz de ij para que validemos qué se crea a nivel de archivos físicos al momento de crear un base en Derby:

Carpeta con el nombre de la base y este es su contenido. Advierto que la modificación directa sobre estos archivos físicos puede generar inconsistencias posteriores, asi que procuremos no tocarlos directamente:

derby@vps158271:~/derbytutor$ ls -thor
total 148K
-rw-r--r-- 1 derby  26K Nov 25 15:41 loadFLIGHTS1.sql
-rw-r--r-- 1 derby  17K Nov 25 15:41 loadFLIGHTAVAILABILITY2.sql
-rw-r--r-- 1 derby  22K Nov 25 15:41 loadFLIGHTAVAILABILITY1.sql
-rw-r--r-- 1 derby 7.6K Nov 25 15:41 loadCOUNTRIES.sql
-rw-r--r-- 1 derby 7.3K Nov 25 15:41 loadCITIES.sql
-rw-r--r-- 1 derby  984 Nov 25 15:41 loadAIRLINES.sql
-rw-r--r-- 1 derby 1019 Nov 25 15:41 loadTables.sql
-rw-r--r-- 1 derby  29K Nov 25 15:41 loadFLIGHTS2.sql
-rw-r--r-- 1 derby 5.1K Nov 25 15:41 ToursDB_schema.sql
drwxrwxr-x 4 derby 4.0K Nov 25 16:10 firstdb
-rw-rw-r-- 1 derby  661 Dec  2 23:26 derby.log
drwxrwxr-x 5 derby 4.0K Dec  2 23:26 mundialito


derby@vps158271:~/derbytutor$ pwd
/home/derby/derbytutor
derby@vps158271:~/derbytutor$ tree mundialito/
mundialito/
├── dbex.lck
├── db.lck
├── log
│   ├── log1.dat
│   ├── log.ctrl
│   ├── logmirror.ctrl
│   └── README_DO_NOT_TOUCH_FILES.txt
├── README_DO_NOT_TOUCH_FILES.txt
├── seg0
│   ├── c101.dat
│   ├── c10.dat
│   ├── c111.dat
│   ├── c121.dat
 ...
│   ├── cd1.dat
│   ├── ce1.dat
│   ├── cf0.dat
│   └── README_DO_NOT_TOUCH_FILES.txt
├── service.properties
└── tmp


Ahora interactuemos con DDL y sentencias SQL en la base mundialito:

Creemos las tabla SELECCION, que contendrá las 32 selecciones clasificadas al mundial:


derby@vps158271:~/derbytutor$ java -jar $DERBY_HOME/lib/derbyrun.jar ij
ij version 10.14
ij> CONNECT 'jdbc:derby:mundialito';
ij> CREATE TABLE SELECCION
> (ID INT PRIMARY KEY,
> NAME VARCHAR(50));
0 rows inserted/updated/deleted
ij> SELECT * FROM SELECCION;
ID |NAME
--------------------------------------------------------------

0 rows selected


Procedamos a insertar registros y proyectemos el registro recién insertado:

ij> INSERT INTO SELECCION (ID, NAME)
> VALUES
> (1,'ALEMANIA');
1 row inserted/updated/deleted
ij> SELECT * FROM SELECCION;
ID |NAME
--------------------------------------------------------------
1 |ALEMANIA

1 row selected 


Ahora, eliminemos el registro recién insertado:

ij> DELETE FROM SELECCION
> WHERE ID = 1;
1 row inserted/updated/deleted


En Derby, también podemos hacer ejecuciones de archivos scripts .sql. Basta con que el archivo se encuentre dentro del directorio de ejecución. En el siguiente ejemplo insertaremos todas las selecciones clasificadas:

Mi archivo sigue la siguiente estructura:

 

Ejecución:

ij> run 'selecciones2018.sql';
ij> INSERT INTO SELECCION (ID, NAME) VALUES (1, 'ALEMANIA');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (2,'EGIPTO');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (3,'MARRUECOS');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (4,'NIGERIA');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (5,'SENEGAL');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (6,'TUNEZ');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (7,'ARABIA SAUDITA');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (8,'AUSTRALIA');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (9,'IRAN');
1 row inserted/updated/deleted
ij> INSERT INTO SELECCION (ID, NAME) VALUES (10,'JAPON');
1 row inserted/updated/deleted

...


Proyectemos los datos recién ingresados:

ij> SELECT * FROM SELECCION; 
ID         |NAME                                              
--------------------------------------------------------------
1          |ALEMANIA                                          
2          |EGIPTO                                            
3          |MARRUECOS                                         
4          |NIGERIA                                           
5          |SENEGAL                                           
6          |TUNEZ                                             
7          |ARABIA SAUDITA                                    
8          |AUSTRALIA                                         
9          |IRAN                                              
10         |JAPON                                             
 ...


 Y concluiremos esta segunda entrega, con la actualización de un registro:

ij> UPDATE SELECCION
> SET NAME = 'ESPANA'
> WHERE ID = 15;
1 row inserted/updated/deleted
ij> SELECT * FROM SELECCION WHERE ID = 15;
ID         |NAME                                              
--------------------------------------------------------------
15         |ESPANA                                            

1 row selected
ij> 

sábado, 25 de noviembre de 2017

Instalación de Apache Derby 10.14.1.0 en Ubuntu Server 16.04 Parte I

Como siempre por acá haciendo cosas fuera de lo común con miras en algún día ser alguién también fuera de lo común.
De hecho ser un usuario Linux te hace un poco especial, pero aún más cuando soy un usuario Linux que no está en contra del software privativo.
Al final, si tienes dinero y puedes pagar licenciamiento de un producto, y estás de acuerdo con todas las letras pequeñas del contrato, adquiérelo de manera legal.

Pues el desafío es el siguiente:

De hace un tiempo, Henry desea hacerse de un VPS (Virtual Private Server) para usarlo doquiera donde vaya como laboratorio. Sobre todo porque en algún momento hasta las máquinas virtuales le han hecho pasar grandes angustias.
En vista de ellos desea encontrar una solución económica para sus problemas de infraestructura (que no supere los $35.00). Por estos días la palabra Black Friday ha sonado mucho y como es de esperarlo, aguardó a encontrar una buena oferta la cuál se materializó en un VPS con las siguientes características:
  • OS: Ubuntu 16.04.
  • RAM: 2G.
  • HDD: 10G
  • CORE: 1
Todo conocedor de la optimización sabe que contra tales disposiciones debe buscar herramientas que se acoplen  a las limitantes y al bolsillo. Henry desea tener un RDBMS dentro de este pequeño servidor y se da a la tarea de investigar qué opciones hay...
Por descarte, ya sabe qué no va, y qué pudiera ir...
En el qué pudiera ir se ocurre SQLite pero tampoco desea algo tan ligero... Y como entusiasta de todas las herramientas de la Apache Foundation, decide investigar qué RDBMS tienen a disposición.

Nos topamos con Apache Derby (pequeño (22Mb), java... parece que encaja).

Y nos diponemos a instalar...

Prerrequisitos:

Primero (Deberás ya tener instalado JAVA)...


  • Lo recomendado a la hora de instalar aplicaciones en un servidor y con miras de exponerlas como servicio, es crear un usuario exclusivo en el sistema operativo, crearemos el usuario (* con root o sudo): derby
$ useradd derby
 
  • Luego le asignaremo un espacio en home:
$ mkhomedir_helper derby


  • Asignamos contraseña al nuevo usuario creado:
$ passwd derby
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully 



  • Aprovechando que tenemos root, procederemos a crear un directorio dedicado para la instalación de Derby. Me gusta el /opt y recomendaría que fuera ahí. Crearemos un directorio donde dejaremos el zip original (yo sé qué es reinstalar de cero). Ubicados en el /opt procedemos, a medio camino comenzaremos a utilizar ya el usuario derby:
$ mkdir apache-derby
$ chown -R derby:derby apache-derby
$ cd apache-derby
$ su derby
$ cd /opt/apache-derby
$ mkdir media
$ mv /home/derby/ db-derby-10.14.1.0-bin.zip  media/


  • Ya en media, procederemos a descomprimir la carpeta y ubicarla en el directorio anterior:
$ cd media/
$ unzip  db-derby-10.14.1.0-bin.zip
...

...   
inflating: db-derby-10.14.1.0-bin/lib/derbynet.jar 
 inflating: db-derby-10.14.1.0-bin/lib/derbyoptionaltools.jar 
 inflating: db-derby-10.14.1.0-bin/lib/derbyrun.jar 
 inflating: db-derby-10.14.1.0-bin/lib/derbytools.jar 
 creating: db-derby-10.14.1.0-bin/test/
 inflating: db-derby-10.14.1.0-bin/test/derbyTesting.jar 
 inflating: db-derby-10.14.1.0-bin/test/README.htm  

$ mv db-derby-10.14.1.0-bin ..
$ cd ..

$ pwd
/opt/apache-derby

Este es el fin de la primera fase de instalación. 
Crearé una segunda entrada para no cargar el contenido.


sábado, 28 de octubre de 2017

Zsnes no funciona en Ubuntu 16.04 - Snes9x una buena opción.

Varios días atrás empecé a planear la instalación de Zsnes de nueva cuenta en mi computadora (temporadas de nostalgia).

Como nos suele suceder, en ciertas ocasiones nos acomodamos a que los repositorios de Linux instalen todo lo necesario para hechar a andar las aplicaciones que deseamos usar.

Para sorpresa mía, apareció lo realmente indeseable: "Una dependencia no satisfecha"




Está demás decir que me puse a la ardua tarea de querer instalar las dependencias subyacentes a la que ven an la imagen anterior. :P

Ví que sería muy complicado lograr la instalación, sin correr con el riesgo de alterar una o que otra librería común con otros recursos previamente instalados en mi Ubuntu.
Investigando un poco, encontré mi redención hacia los tiempos hermosos de nostalgia infantil: snes9x 

Descargando snes9x.
Podrán descargar snes9x del siguiente sitio, de forma totalmente gratuita y legal:
http://www.s9x-w32.de/dl/

Luego yo descargué el siguiente archivo:

 

Instalación y ejecución de snes9x.
Una vez descargado el archivo, procedí a ubicarlo en mi directorio /opt habiendo previamente creado una carpeta con un nombre intuitivo a snes9x.
El directorio podrá variar al de tu gusto, sólamente asegúrate de contar con los permisos adecuados para lograr la ejecución del programa.


Les dejo la secuencia de pasos a seguir para correr el emulador:



Acá la secuencia de comandos:



$ cd snes9x/
/snes9x$ ls
snes9x-1.52-gtk-79-x86-64.tar.bz2
/snes9x$ sudo tar -xjvf snes9x-1.52-gtk-79-x86-64.tar.bz2
snes9x-1.52/
snes9x-1.52/snes9x-gtk
snes9x-1.52/data/
snes9x-1.52/data/snes9x_32x32.png
snes9x-1.52/data/snes9x.desktop
snes9x-1.52/data/snes9x_16x16.png
snes9x-1.52/data/snes9x_24x24.png
snes9x-1.52/data/snes9x.svg
snes9x-1.52/docs/
snes9x-1.52/docs/gpl-2.0.txt
snes9x-1.52/docs/gtk/
snes9x-1.52/docs/gtk/README
snes9x-1.52/docs/gtk/lgpl.txt
snes9x-1.52/docs/gtk/LICENSE
snes9x-1.52/docs/control-inputs.txt
snes9x-1.52/docs/snapshots.txt
snes9x-1.52/docs/porting.html
snes9x-1.52/docs/lgpl-2.1.txt
snes9x-1.52/docs/snes9x-license.txt
snes9x-1.52/docs/snes9x.conf.default
snes9x-1.52/docs/controls.txt
snes9x-1.52/docs/changes.txt
/snes9x$ ls
snes9x-1.52  snes9x-1.52-gtk-79-x86-64.tar.bz2
/snes9x$ cd snes9x-1.52/
/snes9x/snes9x-1.52$ ls
data  docs  snes9x-gtk
/snes9x/snes9x-1.52$ ./snes9x-gtk
Sound buffer size: 8192 (2048 samples)
OSS sound driver initializing...
    --> (Device: /dev/dsp)...OK
    --> (Format: 16-bit)...OK
    --> (Stereo)...OK
    --> (Frequency: 32000)...OK
    --> (Buffer size: 8192 bytes, 64ms latency)...OK


Me encantó que el emulador trae opciones para cambio del tamaño de la imagen, configuración de joystick, etc. Lo suficiente para jugar bien:

 


 
Listo, acá comienza la diversión: