martes, noviembre 29, 2011

ORACLE: dar permisos de acceso a otro usuario


Hola,

Suele ser bastante típico que desde un usuario Oracle haya que acceder a tablas de otro.

Lo mejor es que iniciemos sesión con el usuario propietario de las tablas y demos los GRANT-s necesarios al que los requiere.



Podemos hacer un procedimiento PL-SQL como este:
FOR x IN (SELECT * FROM user_tables)
LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO <>';
END LOOP;


O bien, con SQL puro preparamos las sentencias SQL.

Esto genera una sentencia GRANT SELECT ON por cada tabla que encuentra en USER_TABLES:

SELECT 'GRANT SELECT ON '|| table_name ||' TO xxxxxxxx;' FROM user_tables;


Saludos.


6/11/2011. 1h 19'39''
8/11/2011. 1h 1'
13/11/2011. -San Sebastian. 20km. 1h 48' 19''
27/11/2011. Santurce-Bilbao. 16,3 km. 1h 15' 07''
28/11/2011. Spinning.

sábado, noviembre 26, 2011

El secreto del éxito


Recibido por correo electrónico el 24/11/2011.

martes, noviembre 22, 2011

Ver las estrellas


Tengo unos prismáticos. Alguna vez he estado de noche, en el campo, mirando las estrellas. Contrariamente a lo que se piensa, para una observación de este tipo no hacen falta muchos aumentos. Sin embargo sí es importante que el diámetro de los cristales sea lo mayor posible.

Creo que los míos son 10x50. 10 aumentos y 50mm de diámetro del objetivo. Más grandes requieren trípode para ver cómodamente.

Aunque no tengáis ni idea de las constelaciones, lo primero que os va a llamar la atención es la vía láctea. A simple vista también se puede ver, pero con los prismáticos no vas a tener ninguna duda. Sabrás enseguida por qué se llama así.

Bueno, tal vez lo que más llame la atención es la gran cantidad de estrellas que se ven. El ojo humano es pequeñito respecto a los 50mm que tenemos en los prismáticos. En los prismáticos entra mucha más cantidad de luz y veremos estrellas que no se ven a simple vista.

Claro que la mayor parte de las veces, cuando quieres ver algo (las perseidas, el famoso meteorito,...), lo que ocurre es que suele estar nublado.

Con Stellarium podemos ver las estrellas de una forma más cómoda y sobre todo más didáctica pues te muestra en todo momento la posición del puntero y el nombre de las constelaciones, estrellas, etc.

Otra ventaja es que puedes ver las estrellas del hemisferio contrario sin moverte de casa :-)

La vía láctea se ve, pero no es lo mismo.

Forma de instalarlo en Ubuntu, debian, etc.:

$sudo apt-get install stellarium

Para abrir el programa:

$stellarium

sábado, noviembre 12, 2011

Liberar espacio en /var




Aquí (en /var) suelen estar los logs que crecen y crecen sin control.

Voy a recopilar los pasos que he seguido para liberar espacio:

Reducir los ficheros syslog.log

El log más general del sistema en HP-UX está en /var/adm/syslog/syslog.log
Este fichero está activo desde el último arranque y no lo podemos tocar porque está siendo utilizado.

Para reducirlo tendríamos que parar el servicio antes:

/sbin/init.d/syslog stop

y arrancarlo después:

/sbin/init.d/syslog start

Cuando se reinicia el servidor el syslog.log se renombra como OLDsyslog.log

Podemos comprimirlo:
cat /var/adm/syslog/OLDsyslog.log |gzip -9 > v.log.gz

Limpieza de /var/tmp
Los ficheros de más de 10 días que se encuentran en /var/tmp se pueden eliminar de esta forma que indiqué alguna vez: http://aitoreus.blogspot.com/2010/04/busqueda-en-unix-linux-etc.html

Otra forma de eliminar esos ficheros de más de 10 días sería:

find /var/tmp -mtime +10 -exec rm -r {} \;

Podemos iniciar una búsqueda de los ficheros y directorios que más ocupan.
Empezaríamos por /var haciendo:

du -sk * | sort -rn | more

Otra forma de hacer lo mismo:
cd /var;find . -type f -exec ls -ls {} \; | sort -n

Más cosas que podemos hacer:

Para tener pistas de dónde estan los ficheros que crecen a diario, podemos buscar los que se hayan modificado hoy:

find /var -mtime 0 -exec ls -ld {} \;
Ficheros gigantes que he encontrado yo:

/var/mail/oracle /var/mail/root


Cuidado con este detalle:
Utilizando fuser o lsof podremos saber si un fichero está siendo utilizado por un proceso.
Esto es importante porque aunque reduzcamos un fichero, si está en uso no se liberará el espacio hasta que se pare el proceso.

Nota sobre el uso del editor VI:

Para reducir un fichero de texto gigante:

1.-Ver cuantas líneas tiene el fichero. Para ello pulsamos "G" que nos llevará a la última línea. Pulsando Control + G nos indicará el número de línea.
2.-Con 1G iremos a la línea 1.
3.-Con 1000dd borramos 1.000 líneas, con 5000dd borraríamos 5.000 líneas.

Saludos.

jueves, noviembre 10, 2011

HP-UX, conocer la hora de un corte de suministro eléctrico



En los servidores modernos, aunque se "vaya" la "luz" le da tiempo a registrarlo en un log de eventos del sistema.


En el caso de AIX, en este sitio tienes una referencia completa para investigar un reinicio del sistema: http://www.aixmind.com/?p=1197


Me voy a centrar en el caso de un HP rx600 (Itanium).


Siempre tenemos que tener en cuenta el desfase de la hora del servidor con la hora real.

Conocer el desfase horario:


Nos conectamos a la consola de gestión (Management Port), ejecutamos CM (Command Menu) y ejecutar el comando DATE.



Ver el evento de caída:



Vamos a SL (Show Event Logs) y pulsamos "E" que es para que nos muestre "SYSTEM EVENT".



Para ir a la última entrada pulsamos "L" (Last entry).



Con las teclas "+" y "-" vamos adelante o atrás.



Lo que tenemos que buscar es el evento POWER_AC_FAILED.



Aquí un ejemplo:


Saludos.

miércoles, noviembre 09, 2011

Mentirosos compulsivos

Ayer cometí el error de ver el debate entre Rajoy y Rubacaba. Mentiras y más mentiras.

Para empezar en seguida te das cuenta de que han pactado desde los zapatos, el traje, la corbata,... hasta los temas a tratar, y lo más importante, los "temas a no tratar". Siendo dos partidos inmersos en graves escándalos de corrupción, que salen día sí y día también, resulta que ayer tan amigos, no dijeron ni mu sobre eso.

Luego, uno que hace unos meses congeló las pensiones, subió el IVA, inyectó capital público en bancos, le achacaba al otro que era el aspirante, que iba a congelar las pensiones, subir el IVA y apoyar con dinero público a los bancos. En el 2008 quitaron el impuesto de patrimonio, pero ahora dicen que si ganan van a poner un impuesto del patrimonio mejorado y un impuesto a la banca, y además la banca no va a poder repercutir ese impuesto a sus clientes (JA!!!).

El otro diciendo que cuando sea presidente va a generar un montón de empleo, pero oculta el cómo, porque va a ser doloroso de verdad (para salir de esto tiene que serlo necesariamente). De meter dinero público a los bancos nada de nada (y eso que le va a tocar terminar la reestructuración del sistema bancario), los pensionistas no van a perder poder adquisitivo (arriesgado parece decir esto, sobre todo si piensan subir el IVA, establecer copago para rentas medias y altas, etc.), y no tocará ni el subsidio por desempleo ni similares. Bueno, ya veremos lo que hace y no hace en el futuro.

Al final, con todos esos nervios, se produjo el acto fallido que decía Freud. Ese momento en el que el cerebro no aguanta más censuras y aflora la verdad que está en el subconsciente. Le ocurrió a Rubalcaba que lo dijo bien clarito para que lo entendamos todos:

-LO QUE ESTÁ PASANDO SEÑOR RAJOY, Y AHORA ES USTED EL QUE MIENTE......

O sea, antes el que mentía era el que dice la frase (Rubalcaba), y ahora es Rajoy el que lo hace. Esto si que es una verdad como un templo.

En ese momento Rubalcaba se da cuenta de lo que ha ocurrido y no sabe que decir. Bueno, realmente se da cuenta mientras decía la palabra "MIENTE" que le sale totalmente temblorosa. Le hecha una miradita a Rajoy como diciendo... POR FAVOR DI ALGO QUE SALIMOS LOS DOS COMO UNOS MENTIROSOS...

-LO QUE ESTÁ PASANDO SEÑOR RAJOY... continúa Rubalcaba después del incómodo silencio.
-LE INTERRUMPO dice Rajoy.
-ERA PARA VER SI PARABA... (excusa del que no sabe qué decir).

Pero mejor verlo en directo:

viernes, noviembre 04, 2011

UNIX, HP-UX, tarjetas de fibra



Para localizar los devices de las HBA hacemos:

ioscan -fnCfc

o también: ioscan -kfnCfc

(la opción k consulta en el Kernel. Ioscan contestará rápido porque no analiza el hardware, pero si ha habido cambios desde el anterior ioscan completo, no los verás).




Class I H/W Path Driver S/W State H/W Type Description
===================================================
fc 0 40/0/2/0/0/0/0 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd0
fc 1 40/0/2/0/0/0/1 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd1
fc 2 40/0/2/2/0/0/0 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd2
fc 3 40/0/2/2/0/0/1 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd3
fc 4 41/0/2/0/0/0/0 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd4
fc 5 41/0/2/0/0/0/1 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd5
fc 6 41/0/2/2/0/0/0 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd6
fc 7 41/0/2/2/0/0/1 fcd CLAIMED INTERFACE HP AH401A 8Gb Dual )
/dev/fcd7




Luego podemos utilizar la utilidad “Fibre Channel Mass Storage Utility”.

Esto nos permite entre otras cosas saber el WWW de una HBA y su estado.



# fcmsutil /dev/fcd1
Vendor ID is = 0x1077
Device ID is = 0x2532
PCI Sub-system Vendor ID is = 0x103C
PCI Sub-system ID is = 0x3263
PCI Mode = PCI Express x4
ISP Code version = 5.3.2
ISP Chip version = 2
Topology = PTTOPT_FABRIC
Link Speed = 4Gb
Local N_Port_id is = 0x161200
Previous N_Port_id is = None
N_Port Node World Wide Name = 0x5001438009ad92eb
N_Port Port World Wide Name = 0x5001438009ad92ea
Switch Port World Wide Name = 0x201200051e9023e0
Switch Node World Wide Name = 0x100000051e9023e0
N_Port Symbolic Port Name = gorbeia_fcd1
N_Port Symbolic Node Name = gorbeia_HP-UX_B.11.31
Driver state = ONLINE
Hardware Path is = 40/0/2/0/0/0/1
Maximum Frame Size = 2048
Driver-Firmware Dump Available = NO
Driver-Firmware Dump Timestamp = N/A
TYPE = PFC
NPIV Supported = YES
Driver Version = @(#) fcd B.11.31.1009 May 9 2010


El WWN que ve un dispositivo remoto es el N_PORT PORT WORLD WIDE NAME.

A nivel de los switches de fibra los fabricantes nos suelen proporcionar el software para recopilar toda la información de zonning y WWW. Incluso nos mostrarán de forma gráfica todas las conexiones de fibra (en caso de Brocade en un gráfico Visio).

Otras opciones:
Para ver los wwn remotos:
#fcmsutil /dev/fcd1 get remote all


Target N_Port_id is = 0x160a00
Target state = DSM_READY
Symbolic Port Name = 3PAR
Symbolic Node Name = 3PAR Node
Port Type = N_PORT
FCP-2 Support = NO
Target Port World Wide Name = 0x20510002ac0012ea
Target Node World Wide Name = 0x2ff70002ac0012ea

Common Service parameters (all values shown in hex):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Common Features : 8800 RO_Bitmap: ffff
Total Conseq: ff

Class 3 Service parameters (all values shown in hex):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Open Sequences/Exchg: 1 Conseq: ff
Recipient Control Flags: 0 Rxsz: 800




Target N_Port_id is = 0x140f00
Target state = DSM_READY
Symbolic Port Name = DataCoreNo_Logical_Unit
Symbolic Node Name =
Port Type = N_PORT
FCP-2 Support = NO
Target Port World Wide Name = 0x50014380029acd32
Target Node World Wide Name = 0x50014380029acd32

Common Service parameters (all values shown in hex):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Common Features : 8000 RO_Bitmap: 1f
Total Conseq: ff

Class 3 Service parameters (all values shown in hex):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Open Sequences/Exchg: 1 Conseq: ff
Recipient Control Flags: 0 Rxsz: 800







Otros comandos
#fcdlist -hba


Port1 Port2
====================================================
40/0/2/0/0/0/0 /dev/fcd0 40/0/2/0/0/0/1 /dev/fcd1
40/0/2/2/0/0/0 /dev/fcd2 40/0/2/2/0/0/1 /dev/fcd3
41/0/2/0/0/0/0 /dev/fcd4 41/0/2/0/0/0/1 /dev/fcd5
41/0/2/2/0/0/0 /dev/fcd6 41/0/2/2/0/0/1 /dev/fcd7




Saludos.


Crear un fichero .doc por programación

A veces puede interesar automatizar por programación la creación de un fichero .doc (Word).

Esto te puede ayudar en dos casos:


  1. Si generas periódicamente, o frecuentemente, el mismo tipo de documento con ligeras variaciones (facturas, informes, etc.)



  2. Si tienes que crear un documento a partir de un montón de imágenes, ficheros, otros documentos...

Por ejemplo organismos que generan miles de de documentos diarios como los tribunales de Ginebra utilizan un módulo Perl: MsOffice-Word-HTML-Writer-1.01

Para usar ese módulo Perl no hace falta ni Windows, ni tener el Word instalado.

Código fuente copiado del enlace indicado:


use MsOffice::Word::HTML::Writer;
my $doc = MsOffice::Word::HTML::Writer->new(
title => "My new doc",
WordDocument => {View => 'Print'},
);

$doc->write("<p>hello, world</p>",
$doc->page_break,
"<p>hello from another page</p>");

$doc->create_section(
page => {size => "21.0cm 29.7cm",
margin => "1.2cm 2.4cm 2.3cm 2.4cm"},
header => sprintf("Section 2, page %s of %s",
$doc->field('PAGE'),
$doc->field('NUMPAGES')),
footer => sprintf("printed at %s",
$doc->field('PRINTDATE')),
new_page => 1, # or 'left', or 'right'
);
$doc->write("this is the second section, look at header/footer");

$doc->attach("my_image.gif", $path_to_my_image);
$doc->write("<img src='files/my_image.gif'>");

$doc->save_as("/path/to/some/file");


Si tenemos que hacerlo en un PC Windows va a ser más sencillo utilizar VB.NET como nos explican aquí: Cómo automatizar Word desde Visual Basic .NET para crear un nuevo documento


Código fuente copiado del enlace:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

Dim oWord As Word.Application
Dim oDoc As Word.Document
Dim oTable As Word.Table
Dim oPara1 As Word.Paragraph, oPara2 As Word.Paragraph
Dim oPara3 As Word.Paragraph, oPara4 As Word.Paragraph
Dim oRng As Word.Range
Dim oShape As Word.InlineShape
Dim oChart As Object
Dim Pos As Double

'Start Word and open the document template.
oWord = CreateObject("Word.Application")
oWord.Visible = True
oDoc = oWord.Documents.Add

'Insert a paragraph at the beginning of the document.
oPara1 = oDoc.Content.Paragraphs.Add
oPara1.Range.Text = "Heading 1"
oPara1.Range.Font.Bold = True
oPara1.Format.SpaceAfter = 24 '24 pt spacing after paragraph.
oPara1.Range.InsertParagraphAfter()

'Insert a paragraph at the end of the document.
'** \endofdoc is a predefined bookmark.
oPara2 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("\endofdoc").Range)
oPara2.Range.Text = "Heading 2"
oPara2.Format.SpaceAfter = 6
oPara2.Range.InsertParagraphAfter()

'Insert another paragraph.
oPara3 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("\endofdoc").Range)
oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:"
oPara3.Range.Font.Bold = False
oPara3.Format.SpaceAfter = 24
oPara3.Range.InsertParagraphAfter()

'Insert a 3 x 5 table, fill it with data, and make the first row
'bold and italic.
Dim r As Integer, c As Integer
oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 3, 5)
oTable.Range.ParagraphFormat.SpaceAfter = 6
For r = 1 To 3
For c = 1 To 5
oTable.Cell(r, c).Range.Text = "r" & r & "c" & c
Next
Next
oTable.Rows.Item(1).Range.Font.Bold = True
oTable.Rows.Item(1).Range.Font.Italic = True

'Add some text after the table.
'oTable.Range.InsertParagraphAfter()
oPara4 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("\endofdoc").Range)
oPara4.Range.InsertParagraphBefore()
oPara4.Range.Text = "And here's another table:"
oPara4.Format.SpaceAfter = 24
oPara4.Range.InsertParagraphAfter()

'Insert a 5 x 2 table, fill it with data, and change the column widths.
oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 5, 2)
oTable.Range.ParagraphFormat.SpaceAfter = 6
For r = 1 To 5
For c = 1 To 2
oTable.Cell(r, c).Range.Text = "r" & r & "c" & c
Next
Next
oTable.Columns.Item(1).Width = oWord.InchesToPoints(2) 'Change width of columns 1 & 2
oTable.Columns.Item(2).Width = oWord.InchesToPoints(3)

'Keep inserting text. When you get to 7 inches from top of the
'document, insert a hard page break.
Pos = oWord.InchesToPoints(7)
oDoc.Bookmarks.Item("\endofdoc").Range.InsertParagraphAfter()
Do
oRng = oDoc.Bookmarks.Item("\endofdoc").Range
oRng.ParagraphFormat.SpaceAfter = 6
oRng.InsertAfter("A line of text")
oRng.InsertParagraphAfter()
Loop While Pos >= oRng.Information(Word.WdInformation.wdVerticalPositionRelativeToPage)
oRng.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
oRng.InsertBreak(Word.WdBreakType.wdPageBreak)
oRng.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
oRng.InsertAfter("We're now on page 2. Here's my chart:")
oRng.InsertParagraphAfter()

'Insert a chart and change the chart.
oShape = oDoc.Bookmarks.Item("\endofdoc").Range.InlineShapes.AddOLEObject( _
ClassType:="MSGraph.Chart.8", FileName _
:="", LinkToFile:=False, DisplayAsIcon:=False)
oChart = oShape.OLEFormat.Object
oChart.charttype = 4 'xlLine = 4
oChart.Application.Update()
oChart.Application.Quit()
'If desired, you can proceed from here using the Microsoft Graph
'Object model on the oChart object to make additional changes to the
'chart.
oShape.Width = oWord.InchesToPoints(6.25)
oShape.Height = oWord.InchesToPoints(3.57)

'Add text after the chart.
oRng = oDoc.Bookmarks.Item("\endofdoc").Range
oRng.InsertParagraphAfter()
oRng.InsertAfter("THE END.")

'All done. Close this form.
Me.Close()

End Sub


Saludos.

martes, noviembre 01, 2011

SQLPLUS y el problema con el formato de fecha


Cuando abres una sesión Oracle con SQLPLUS ocurre una cosa curiosa, y a veces molesta:

Consultas un campo de tipo fecha (DATE), y aunque contenga también la hora como por ejemplo: 1/11/2011 19:05:00 el SQLPLUS sólo te muestra la fecha 1/11/2011.

Para solucionarlo tenemos dos opciones:

1.-Modificar la variable de entorno:

set nls_date_format=yyyymmdd hh24:mi:ss

2.-Modificar la sesión Oracle:

alter session set nls_date_format='yyyymmdd hh24:mi:ss'

Saludos.

1/11/2011. 35'