jueves, 27 de marzo de 2014

Cita apropiada para ITs - Alfred North Whitehead



Civilization advances by extending the number of important operations that we can perform without thinking about them. 


Alfred North Whitehead realizó grandes aportaciones a la lógica matemática y la filosofía, especialmente al estudio de las relaciones. Se le considera uno de los padres del naturalismo. Extraído de la wikipedia:

...sostuvo que la realidad es un proceso construido por acontecimientos en vez de sustancias, de manera que estos no se pueden definir fuera de sus relaciones con otros eventos. Rechazaba así la teoría de las sustancias con existencia independiente y creaba la Filosofía del proceso...

También se interesó por la didáctica, en 1928 escribe Los fines de la educación dejando perlas como esta:


Desde los primeros pasos de su educación el niño debe experimentar el placer del descubrimiento.


A pesar de ser un gran británico, durante su estancia en USA quedó admirado del carácter norteamericano:


De las ideas no se puede vivir, hay que hacer algo con ellas.



Más info: 

martes, 25 de marzo de 2014

Django llamar a procedimientos almacenados Oracle con parámetros de salida

En el momento de escribir esto (1.6 de django) y después de darle varias vueltas, he llegado a la conclusión de que no es factible acceder al contenido de los parámetros de retorno sin usar directamente cx_Oracle, lo que en un momento dado puede repercutir en la portabilidad de la aplicación.

Teniendo esto claro, se trata de diseñar una estrategia que nos permita usar toda la potencia de los procedimientos almacenados con el mínimo coste en caso de cambiar de gestor de base de datos.

He intentado alejarme del estándar lo menos posible pero, como he comentado, no veo forma de librarse del uso directo de cx_Oracle. Esto es debido a las particularidades que presenta cada gestor a la hora de reservar espacio para las variables de salida en función del tipo. Por ello, lo que he hecho es escribir una función para cada tipo de parámetro de salida, por ejemplo,


from django.db import connection
import cx_Oracle

def call_proc_str1(cadena, valors=None):

   """ llama a un procedimiento Oracle cuyo ultimo parámetro es un string de salida """    cur = connection.cursor()

    # preparam cadena per a Oracle
    cadena="BEGIN %s; END;;" % (cadena,)
    # preparam el parametre de sortida
    sortida=cur.cursor.var(cx_Oracle.STRING)
    # afeixim paràmetre com a darrer
    valors.append(sortida)
    try:
        cur.execute(cadena, valors)
        # retornam paràmetre de sortida
        return sortida.getvalue()
    except Exception, e:
        mensaje="%s Error: call_proc cadena#%s valors#%s" % (e, cadena, valors)
        logger.error(mensaje)
        raise Exception(mensaje)
    finally:
        cur.close()

Se observan varios detalles:
  1. Hay que formar la cadena de la llamada como cadena="BEGIN %s; END;;" % (cadena,). Es debido a la forma cómo se hace la llamada via execute.
  2. Se crea y se reserva espacio para un string mediante cur.cursor.var(cx_Oracle.STRING) y se añade al final de los parámetros de conexión.
  3. Extraemos el valor del parámetro mediante sortida.getvalue()

Para un procedimiento como este:

create or replace procedure prueba(
  param1 in varchar2,
  param2 in varchar2,
  param3 out varchar2) as .....


La llamada sería

try:

    plsql="prueba(%s, %s, %s)"
    param3=call_proc_str1(plsql, [param1, param2])
    return jOk(param3)

except Exception, ex:
    return jErr(str(ex))

Notar que usamos el placeholder %s de python-db en vez de el de Oracle.

En resumen; No es la mejor solución del mundo pero es fácil de portar si cambiamos de gestor de base de datos.

miércoles, 19 de marzo de 2014

Ejecutar aplicación local desde el navegador (Chrome en windows)

Este pequeño workaround nos permitirá ejecutar una aplicación local desde "el navegador" sin que al usuario le parezca que "sale" de él. Es útil si tenemos que lanzar algo en batch.

El truco está en salvar un marcador en la barra de marcadores cuya url es un ejecutable o un bat que está en el sistema local.

Para evitar que el navegador nos muestre el contenido del fichero en vez de ejecutarlo, tenemos que crear un nuevo "protocolo" que en realidad no es más que la ejecución de una shell para nuestro programa.

Para crear el protocolo, creamos una entrada de registro como, por ejemplo, appurl.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\appurl]
@="URL:AutoHotKey AppURL Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\appurl\DefaultIcon]
@="appurl.exe,1"

[HKEY_CLASSES_ROOT\appurl\shell]

[HKEY_CLASSES_ROOT\appurl\shell\open]

[HKEY_CLASSES_ROOT\appurl\shell\open\command]
@="\"C:\\directorio\\programa.bat\" \"%1\""
y lo registramos (click derecho-> Combinar). Esto nos crea el "protocolo" appurl. Ahora creamos el fichero
c:\directorio\programa.bat
con nuestro código.

Finalmente, en el chrome vamos a Marcadores->Añadir página y en la url ponemos

appurl://lo-que-queramos-pasar-a-programaba.bat

Si queremos llamar al protocolo desde chrome, podemos usar

window.location.assign("appurl://algo");


Referencias:
http://www.autohotkey.com/board/topic/71831-application-url-launch-local-application-from-browser/
http://stackoverflow.com/questions/2330545/is-it-possible-to-open-custom-url-scheme-with-google-chrome

martes, 11 de marzo de 2014

Linux networking (ubuntu)

Ver tarjetas de red instaladas en el equipo:

/proc/net/dev

Ver los interfaces up

sudo ifconfig -s

Configuración de los interfaces

/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
  address 192.168.1.2
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.1
  dns-nameservers 8.8.8.8

Habilitar/deshabititar interface

sudo ifup eth1
sudo ifdown eth1

Hacer cambios temporales

sudo ifconfig eth1 10.0.0.100 netmask 255.255.255.0
sudo route add default gw 10.0.0.1 eth1

para añadir servidor dns, poner ip en /etc/resolv.conf

para purgar esta config temporal 

ip addr flush eth1

Cambiar la configuración de hardware de la tarjeta

sudo apt-get install ethtool
sudo ethtool eth1

Si queremos fijar algún parámetro, editamos /etc/networking/interfaces y añadimos un pre-up:

auto eth1
iface eth1 inet static
pre-up /usr/bin/ethtool -s eth1 speed 1000 duplex full





lunes, 17 de febrero de 2014

Propietats emergents de sistemes complexes

Bona entrada de Carlos Gershenson sobre les propietats emergents dels sistemes complexes al blog de l'Investigación y Ciencia. Són emergents perquè les observam al sistema però no a cap de les seves parts. La propietat està causada per les interaccions entre els components més que per els components per si mateixos.

Generalment, no observam la propietat emergent a escales inferiors perquè les interaccions només són observables a escales superiors. El problema és que la metodologia reduccionista que tan bon servei ens presta a l'hora de simplificar l'anàlisi d'un sistema pot fer-nos perdre alguna d'aquestes característiques. Tendim a pensar que els components són reals peró les seves interaccions no.

Exemples de propietats emergents serien la vida (observant una molècula d'una cèl.lula, no podem dir que és viva) o la nostra ment (observant una neurona no podem afirmar l'existència de la ment, la propietat sorgeix per les interaccions de milions d'elles).

sábado, 15 de febrero de 2014

Instalación de Oracle Database 12 en Oracle Linux 6

Instalación del entorno gráfico
Bajar el Oracle Linux 6 de oracle.com y arrancar. Como el instalador es gráfico, tenemos que instalar un escritorio obligatoriamente. Puede ser gnome o KDE.

Si estas instalando en entorno virtual, puedes usar dos CDs, uno con el disco de boot y otro con el sistema completo.

Cuando nos pida seleccionar elementos, escojemos Internet->Navegador web y  en Escritorio tenemos que seleccionar X Windows, Escritorio y todo lo relacionado con gnome.

Nombre de máquina y configuración de red
Una posibilidad es dbserver.nombre_empresa.com
En configuración de red sólo tenemos que activar la opción "Conectar la tarjeta al inicio del sistema".

Espacio en disco y creación de particiones
Dejar un mínimo de 40Gb de disco y 2Gb de RAM.

En el asistente debemos seleccionar "Crear las particiones manualmente". Creamos una partición primaria en ext4 y otra de swap. Seleccionar en cada caso las opciones. Primero creamos la partición primaria, le ponemos el tamaño y la damos como activa. Seguidamente creamos la partición de swap con el File System "Swap" y le damos "ocupar todo el espacio disponible".

Tener en cuenta que el espacio de swap debe ser 1,5 veces el de la memoria RAM. Por lo tanto, nos quedará

partición primaria: Tamaño_disco - (1,5 * RAM)
swap: todo lo que quede

Para crear la partición primaria: Crear->Partición estándar
Punto de montaje: /
Sistema de archivos ext4
Tamaño: (mínimo 40000MB)
Tamaño fijo
Forzar partición primaria


Para el área de swap:
Crear->Partición estándar
Sistema de archivos sqap
Completar hasta el máximo aceptable


Usuario
Cuando nos pida el nombre de usuario darle el nombre "oracle".

Terminar el asistente y hacer reboot.

Entrar en el entorno gráfico como usuario oracle.


Primero tenemos que configurar el entorno para que cumpla con las especificaciones de oracle, tenemos que buscar el fichero de preinstalación adecuado a nuestra versión, en este momento es

oracle-rdbms-server-12cR1-preinstall

Abrir terminal y hacer

su
cd /etc/yum.repos.d/
wget http://public-yum.oracle.com/public-yum-ol6.repo
yum install oracle-rdbms-server-12cR1-preinstall
yum update

[ --- Snapshot --- ]
Hacer reboot

Cuando volvamos a abrir sesión, editar el la configuración de selinux para bajar la protección

su
vi /etc/selinux/config
cambiar la linea SELINUX=enforcing por SELINUX=permissive


Con el firefox, entrar en la página web de Oracle y bajar los dos ficheros zip de Oracle Database 12c


Crear la estructura de directorios

su
cd /
mkdir -p /u01/app/oracle/product/12c/db_1

Donde "oracle" es el nombre de usuario y por tanto será el oracle path de este usuario.

Damos propiedad al grupo oinstall.

chown -R oracle:oinstall /u01
chmod -R 775 /u01

Salimos de su

exit

Editamos el profile del usuario oracle para que incluya el path

cd /home/oracle
vi .bash_profile

Y añadimos:

ORACLE_HOSTNAME=dbserver.empresa.com; export ORACLE_HOSTNAME
ORACLE_UNQNAME=orcl; export ORACLE_UNQNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/12c/db_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID

PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

Guardamos y recargamos

. .bash_profile

Vamos al directorio de descargas y unzipeamos

cd Descargas
unzip *.zip

Vamos al directorio database y arrancamos la instalación (sin ser root)

cd database
./runInstaller

Se arranca el instalador gráfico Oracle Universal Installer. Introducimos los datos.


Antes de instalar podemos guardar el archivo de respuesta, que nos puede servir en el futuro como referencia de la instalación.

Cuando el instalador termine nos pedirá que ejecutemos unos scripts como root.

Para comprobar la instalación abrimos una terminal y hacemos

sqlplus / as sysdba
startup;
select sysdate from dual;


probar el manager accediendo a 

https://localhost:1158/em

Logear como SYS y connect as SYSDBA, comprobar que la instancia esté levantada.

Si tenemos problemas con el listener.ora o el tnsnames.ora, estos apuntes pueden ayudar:

1) Comprobar el nombre de la base de datos

select name, value from v$parameter where name='db_name';

2) comprobar el nombre de la instancia

select instance_name, host_name from v$instance;

Con estos datos, en el tnsnames.ora, comprobamos el nombre del servicio:

=
(DESCRIPTION =
  (ADDRESS=
    (PROTOCOL = TCP)
    (HOST = )
   (PORT = 1521))
)
 (CONNECT_DATA =
   (SERVICE_NAME=)
 )
)

Y en el listener.ora:

SID_LIST_LISTENER = 
  (SID_LIST = 
    (SID_DESC =
      (SID_NAME = )
      (ORACLE_HOME = /u01/app/oracle/product/XXX/db_1)
   )
 )
)


Para hacer las comprobaciones, podemos usar los comandos:

lsnrctl stat
lsnrctl start
lsnrctl stop


Finalmente, para hacer el startup automático, editamos /etc/oratab y ponemos Y en el último caracter.  Seguir este tutorial, o este para terminar de configurar el auto start/stop.

Para crear el primer usuario y otorgarle permisos podemos usar algo parecido a esto.

En caso necesario, abrir el puerto 1521 en el cortafuegos.

[ --- Snapshot --- ]

Referencias:
Series de DBASoup http://www.youtube.com/watch?v=enzODUcYERI