Instalación del Oracle Instant Client y configuración de Oci8 en php y apache en Suse

Vamos a instalar el instant client de la version 11 de oracle en una máquina son Suse Linux Enterprise Server (SLES11) versión de 64 bits. Configuraremos ademas el módulo oci8 para que se cargue en php y en apache.

En la versión Enterprise necesitaremos tener algunos paquetes de desarrollo entre otros instalaremos los siguientes:
zypper in php5-devel autoconf php5-pear
Si no están en los repositorios tendremos que instalar (sólo en la versión Enterprise, en opensuse estan por defecto) el SUSE Linux Enterprise SDK 11, más info aqui
Cómo instalar SUSE Linux Enterprise SDK 11

En este caso no tenemos oracle instalado por lo que usaremos las librerías del oracle instant client para poder conectarnos a un oracle en remoto.

1- Descargar el instant client y el devel
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

La Version 11.2.0.2.0 tienes estas url
http://download.oracle.com/otn/linux/instantclient/112020/oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
http://download.oracle.com/otn/linux/instantclient/112020/oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm

2- Instalar instant client de Oracle una vez descargados
rpm -Uvh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
rpm -Uvh oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm

(para ver los archivos y las rutas que nos harán falta para configurar oci8)
rpm -ql oracle-instantclient11.2-basic-11.2.0.2.0
/usr/lib/oracle/11.2/client64/bin/adrci
/usr/lib/oracle/11.2/client64/bin/genezi
/usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1
/usr/lib/oracle/11.2/client64/lib/libnnz11.so
/usr/lib/oracle/11.2/client64/lib/libocci.so.11.1
/usr/lib/oracle/11.2/client64/lib/libociei.so
/usr/lib/oracle/11.2/client64/lib/libocijdbc11.so
/usr/lib/oracle/11.2/client64/lib/ojdbc5.jar
/usr/lib/oracle/11.2/client64/lib/ojdbc6.jar
/usr/lib/oracle/11.2/client64/lib/xstreams.jar

3-Obtener oci8, y descomprimir
wget http://pecl.php.net/get/oci8-1.4.3.tgz
tar -zxvf oci8-1.4.3.tgz
cd oci8-1.4.3/

4- configurar el modulo con la ruta del instant client ( /usr/lib/oracle/11.2/client64/lib )
phpize
./configure -with-oci8=shared,instantclient,/usr/lib/oracle/11.2/client64/lib
5- Instalar el paquete
sudo make install

6- Verificar que se ha instalado correctamente
ls -la /usr/lib64/php5/extensions/oci8.so

7- Cambiar los permisos
sudo chmod 644 /usr/lib64/php5/extensions/oci8.so

8- Crear enlace simbólico
sudo ln -s /usr/lib/oracle/11.2/client64/lib/libnnz11.so /usr/lib64/libnnz11.so

9- Editar archivo php.ini ( /etc/php5/apache2/php.ini ) para añadir el modulo oci (que debe estar bien instalado en /usr/lib64/php5/extensions ) o bien creamos el archivo
/etc/php5/conf.d/oci8.ini para que se cargue el modulo tanto en php como en linea de comandos. En ambos casos tenemos que añadir la linea extension=oci8.so. Optamos por la segunda opción:
echo extension=oci8.so > /etc/php5/conf.d/oci8.ini
10- Reiniciar apache
rcapache2 restart

11- todo deberia estar cargado y funcionando. Podemos verificar que esta todo correcto:

11.1 ejecutando phpinfo desde linea de comandos
php -r "phpinfo();" | grep oci8

11.2 Con phpinfo en una web (con el contenido )

11.3 Comprobando si hay errores en apache
cat /var/log/apache2/error_log | grep 'oci8.so'

Fuentes:
http://en.opensuse.org/SDB:Howto_build_oci8_extension_module_for_php
http://dieguz2.blogspot.com/2007/11/opensuse-oracle-php-y-apache-oci8.html

Relacionado:
http://dieguz2.blogspot.com/2007/11/conexion-mediantes-tnsnamesora.html

Cómo instalar SUSE Linux Enterprise 11 SDK

En la distribución de SLES 11 no viene paquetes como php5-devel ( con el comando phpize ) . No están ni el dvd original ni tampoco en los repositorios. Para poder tener acceso a esos paquetes tenemos que instalar el SUSE Linux Enterprise SDK que contiene un conjunto de paquetes orientados a la programación en varios lenguajes (C, python, perl, java, php ..). Para una descripción más detallada ver descripcion SLES SDK.

Con los siguientes pasos vamos a instalar el SDK de novell en nuestro sistema de modo que podremos acceder a los paquetes usando zypper o yast.

1) Descargar el SDK. Desde la página de SUSE Linux Enterprise SDK podremos acceder a las diferentes isos del sdk. Concretamente yo bajare la 11.
Las versiones de la 11 para diferentes arquitecturas están aqui: isos sdk 11. Hay dos ISO (dvd1 y dvd2) por cada arquitectura, sólo nos hace falta el DVD1

IMPORTANTE: Debemos estar registrados en novell para poder descargarlo.Dicho usuario contraseña se nos solicitará para descargar

Si queremos usar wget debemos especificar el usuario y contraseña novell. Por ejemplo para descargar de la imagen x86 de 64 bits:
wget --http-user=USUARIOdeNOVELL --http-password=PASSWORDdeNovell http://cdn.novell.com/prot/fQKpDcAhPVY~/SLE-11-SDK-DVD-x86_64-GM-Media1.iso

2) Instalación como root:
2.1) Ejecutamos Yast: yast
2.2) Dentro de yast ejecutamos Software/Add-on Products
2.3) En la parte de abajo pulsamos Añadir (o Alt d)
2.4) Seleccionamos Imagen Iso Local (o Alt m)
2.5) aqui buscamos el archivo iso que hemos descargado en el punto 1 y aceptamos los siguientes mensaje

Tras estos pasos deberíamos tener acceso a los paquetes de desarrollo que nos hacen falta. Podemos listar los repositorios desde yast o bien desde linea de comandos
zypper lr

Deberiamos tener un repositorio nuevo con el nombre de "SUSE-Linux-Enterprise-Software-Development-Kit-11_11-0"

sftp sin ssh

La idea es configurar nuestro servidor ssh de modo que un usuario concreto tenga sftp pero no tenga shell remota (ssh). De este modo sólo permitiremos el uso de sftp y no de ssh.

Para conseguir que un usuario tenga sólo aceso a través de ftp una de las opciones es realizar lo siguiente:

1)
Crear el usuario y el home:
useradd -m sftpuser
2) Cambiar la contraseña:
passwd sftpuser
3) Para evitar que pueda acceder por ssh o a través del ordenador podemos cambiarle la shell de entrada con este comando:
chsh -s /usr/lib/ssh/sftp-server sftpuser
Si nuestra arquitectura es de 64 bits usaremos:
chsh -s /usr/lib64/ssh/sftp-server sftpuser
También podríamos utilizar otra shell como rssh: http://www.pizzashack.org/rssh/.
En este último caso tendremos que instalarlo en nuestro sistema y configurar el archivo /etc/rssh.conf

Linux : comando cut , sort , wc y uniq para contar registros unicos en un archivo de texto

Partimos de un archivo de texto en el que los registros aparecen separados por comas (csv) o por tabuladores. Este archivo puede provenir de una exportación de una tabla de la base de datos y queremos verificar si está correcto dicho archivo. Para ello usaremos algunos comandos unix para verificar el número de registros, o si el número de valores únicos de una columna es correcto.

Los comandos que usaremos serán:
- comando wc
- comando sort
- comando cut
-comando uniq

Contar el número de filas en un archivo csv

Usaremos únicamente el comnado:
wc -l archivo.csv

Que nos devolverá el número de filas

Contar el número de registros diferentes en un campo (similar a select count(distinct campo))

Suponemos que queremos ver cuantos registros diferentes del campo3 hay en archivo.csv (separador por tabuladores):
cut -f 3 archivo.csv | sort | uniq | wc -l

Si el archivo usase otro separador por ejemplo la coma ( , ) :
cut -t, -f 3 archivo.csv | sort | uniq | wc -l

Tambien podemos suprimir el comnado uniq:
cut -t, -f 3 archivo.csv | sort -u | wc -l

Comando cut : selección de columnas en archivos

El comando cut permite seleccionar columnas o campos completos en un archivo estructurado ( con campos separados por algún delimitador). El delimitador por defecto de cut es el tabulador

Algunas de las opciones son:
-f permite seleccionar el campo que queremos ver
-d para cambiar el delimitador
-c seleccionar columnas
-s no muestra las lineas que no tienen el delimitador

Supongamos que tenemos el archivo (separado por tabuladores)
1 a 123
5 b 64
2 A 32
3 a 16

- Seleccionamos el segundo campo
cut -f 2 prueba.txt
a
b
A
a

- Seleccionamos los caracteres entre la posición 5 y 6
cut -c5-6 prueba.txt
12
64
32
16

-Si el delimitador fuese una coma podríamos usar -d, o -d','
cut -d, -f 3 prueba2.txt
123
64
32
16

En el caso de usar conjuntamente ls y cut veremos que al tener un numero diferente de espacios en algunos campos (por ejemplo en el tamaño del archivo) no saldrán correctamente y algunas lineas saldrán en blanco.
ls -la | cut -d' ' -f 5

En este caso es mejor optar por otros comandos por ejemplo usando awk:
ls -la | awk '{print $5 }'

Comando sort : ordenar lineas de texto de un archivo

El comando sort ordena las lineas de un archivo de texto según varios criterios, algunos de las opciones más útiles son:
-n utilizar ordenamiento numérico en lugar de alfanumérico (letras)
-r invertir orden
-f ignora mayúsculas y minúsculas
-k número ordenar usando la columna número
-t nuevoseparador usar como separador el nuevo separador en lugar del separador por defecto. ej -t, o -t","
-u suprime las lineas repetidas ( similar al comando uniq )

Supongamos que tenemos el siguiente archivo ( cat > prueba.txt):
1 a 123
5 b 64
2 A 32
3 a 16

Los siguientes comandos dan las siguientes salidas:
- Ordenación por defecto
sort prueba.txt
1 a 123
2 A 32
3 a 16
5 b 64

- Ordenación usando la tercera columna
sort -k3 prueba.txt
1 a 123
3 a 16
2 A 32
5 b 64

- Orden usando la tercera columna y orden numérico
sort -k3 -n prueba.txt
3 a 16
2 A 32
5 b 64
1 a 123

- Orden usando la segunda columna y orden inverso
sort -k2 -r prueba.txt
5 b 64
2 A 32
3 a 16
1 a 123

-Si por ejemplo el archivo usase como separador la coma (,) la sintaxis sería:
sort -t, -k3 -n prueba2.txt
3,a,16
2,A,32
5,b,64
1,a,123

Comando WC : contar palabras, líneas y caracteres de archivos

El comando wc viene de "word count" y es un contador de lineas , palabras (letras separadas por espacios) y caracteres (bytes).
wc archivo.txt
584 14583 123787 archivo.txt

La salida muestra que el archivo tiene 584 lineas , 14583 palabras y 123787 caracteres.
Sus opciones en linea de comandos son:
-c cuenta los bytes
-m cuenta las palabras
-l cuenta las lineas

Por ejemplo, para ver si el numero de registros exportados ( select count(*) from tabla ) es identico al del archivo que hemos exportado contaremos las lineas de dicho archivo
wc - l archivo.txt
584 archivo.txt
Para contar el número de archivos en un directorio podemos usar:
ls -1 | wc -l

Gnome : Habilitar iconos en menus y botones

Podemos hace lo de dos formas, desde linea de comando ejecutando:
gconftool-2 --set /desktop/gnome/interface/buttons_have_icons --type bool true
gconftool-2 --set /desktop/gnome/interface/menus_have_icons --type bool true

O gráficamente, ejecutando el "Editor de Configuraciones de Gnome", dentro de Aplicaciones/Sistema.De forma equivalente podemos ejecutar el comando:
gconf-editor

Una vez en el editor buscamos en /desktop/gnome/interface/ y marcamos las opciones
menus_has_icons
buttons_have_icons

Una imagen del editor:



Java: rellenar cadena con espacios

A partir java 1.5 podemos usar la funcion String.format() que funciona de un modo similar al printf de C para rellenar con espacios una cadena.

Si queremos rellenar el String micadena de modo que tenga 10 espacios al final de la cadena usaremos la sentencia siguientes:
String micadena = "123";
String nuevacadena = String.format("%1$-10s",micadena);

de modo que genere la cadena "123 ".
Si usásemos la sentencia:
String nuevacadena = String.format("%1$#10s",micadena);

Los espacios se colocarán al principio, obtendremos " 123".

La función puede recibir varios argumentos o repetir el mismo varias veces:
String nuevacadena = String.format("%1$#10s ; %1$-10s, %2$ ",micadena, "hola");

obtenemos " 123 ; 123 , hola"

En cuanto a número podemos controlar la precisión decimal con el .numerodecimales. En el siguiente queremos 2 decimales, así que usamos .2 y la f para indicar que queremos un float:
double numero = 123.23212;
nuevacadena = String.format("número %1$.2f fin",numero);

Obtenemos 123.23

Si queremos 0 a la izquierda, tenemos que tener en cuenta que si especificamos 10 dígitos, hay que descontarle los dígitos decimales (en nuestro ejemplo 2) y la coma.
nuevacadena = String.format("número->%1$010.2f fin",numero);

En este caso le decimos que queremos 10 digitos, 2 decimales, la coma y 7 dígitos que iran a la parte entera. El número resultante es 0000123,23.

Si no especificamos el nº de decimales los 0 se pondrán a la derecha:
nuevacadena = String.format("número->%1$010f fin",numero);

RESULTADO: 123,232120.

Hay muchas más opciones, incluyendo el formato de fechas. Para más información es mejor ver la documentación oficial.

Para obtener más información sobre el formato:
http://download-llnw.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax

Tuneles SSH permanentes

En el siguiente post explicamos como crear túneles SSH fijos, sin tener que ejecutar una y otra vez el comando ssh -L. Para más información sobre túneles podemos ver el post ( SSH y VNC tunelizar conexiones).

La configuración se realizará en ~/.ssh/config para que sólo se aplique al usuario actual o bien en /etc/ssh/sshd_config si queremos que dicho túnel sea compartido por todos los usuarios de nuestra maquina.

Al igual que hicimo sen el post original queremos conectar nuestra maquina-cliente a un servidor VNC (servidorremoto), y para ello queremos hacerlo a través de SSH (ssh port forwarding). En lugar de crear el túnel usando la sentencia:
ssh -L 65535:localhost:5900 dieguz2@servidorremoto

Crearemos un tunel fijo editanto el archivo ~/.ssh/config (el túnel sólo estará disponible para nuestro usuario). Añadiendo la linea:
LocalForward 65535 dieguz@servidorremoto:5901

Reiniciamos el servidor ssh, para que los cambios sean efectivos:
sudo rcsshd restart

Y deberiamos ver como nuestra máquina escucha el puerto 65535
netstat -atupn | grep 65535

Para conectar con la maquina VNC:
vncviewer localhost::65535

Fuente:
http://en.opensuse.org/SDB:OpenSSH_tunnels