martes, diciembre 27, 2011

Visual Basic .NET Leer un fichero de texto

Tenemos que leer un fichero.

.CONFIG
En el fichero .config de la aplicación tenemos una indicación de dónde está el fichero. Lo indicamos así:
add key="pathFicheroPumadata" value="c:\programa-gestion\pumapc\pumadata.dat"



Primero leemos la entrada, luego comprobamos si el fichero está en su sitio. Si no está, se captura la excepción y se muestra el mensaje correspondiente al usuario.

Se lee el fichero procesando cada línea.

Private Sub mnuLeerFichero_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuLeerFichero.Click
Dim configurationAppSettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader
Dim ficheroPumadata As String
Dim contador As Integer = 0
ficheroPumadata = configurationAppSettings.GetValue("pathFicheroPumadata", GetType(System.String))
If ficheroPumadata = "" Then
ficheroPumadata = Application.StartupPath
End If
Try
If System.IO.File.Exists(ficheroPumadata) = False Then
MessageBox.Show("El fichero pumadata.dat no está en su sitio.")
Exit Sub
End If
strPATH_BASEDATOS = ficheroPumadata
'Abrir el fichero de texto:
Dim sr As New System.IO.StreamReader( _
ficheroPumadata, _
System.Text.Encoding.Default, _
True)
' Leer el contenido mientras no se llegue al final
While sr.Peek() <> -1
' Leer una línea del fichero
Dim s As String = sr.ReadLine()
If String.IsNullOrEmpty(s) Then
Continue While
End If
contador = contador + 1
escribirLinea(s)
End While
' Cerrar el fichero
sr.Close()
MessageBox.Show(contador & " repostajes leídos")
Catch ex As Exception
MessageBox.Show("ERROR: " & ex.Message & vbCrLf & "El fichero pumadata.data no está en su sitio")
Exit Sub
End Try
End Sub




Saludos.

Consola Web de Administración Oracle

Con el usuario oracle:

Creación de la consola (sólo para la primera vez):
emca -config dbcontrol db -repos create

Levantar:
emctl start dbconsole

Parar:
emctl stop dbconsole

Reiniciar
emctl restart dbconsole

Cuando restauramos la base de datos entera puede ser necesario recrear la consola web. También te puede hacer falta cuando levantas la base de datos en un servidor alternativo:

emca -config dbcontrol db -repos recreate

Hará unas preguntas como el SID, el $ORACLE_HOME, la password de SYS, del usuario DBSNMP, etc.


jueves, diciembre 22, 2011

Consejo informático


Estaba escuchando la radio... que si el nuevo gobierno... que si tal...que si cual, y uno va y dice: "El único que dice si un barco es bueno es el mar".

Lo anoto porque no quiero que se me olvide.
Cuando un sistema es suficientemente complejo para no saber cómo va a comportarse al modificar algo de su entorno, puedes decirle a tu jefe:

-¡El único que dice si un barco es bueno es el mar!

Nota: No abuses del dicho. Sólo cuando algo no se pueda simular en laboratorio.

Saludos.

lunes, diciembre 19, 2011

Editor VI, recordatorio de comandos

Unir dos ficheros de texto (merge files):
Abrimos el primero cuando llamamos al VI.
Colocamos el cursor donde corresponda (el comando añade el segundo fichero justo debajo del cursor).
:r fichero

Unir dos líneas de texto contiguas:
Nos colocamos en la primera línea.
J

Ir al final de la línea:
$

Borrar hasta el final de línea:
D

Moverse al principio de la palabra anterior:
b

Ir a la línea 25:
25G

Ir a la última línea:
G

Copiar una línea y pegarla justo debajo (duplicar la línea):
Y (copia la línea actual).
p (pega lo copiado debajo de la línea actual).

Cambiar la palabra actual:
wc (word change)


Repetir el comando:
.

Avanzar de palabra en palabra:
w

Mostrar los números de línea:
:set nu

Deshabilitar los números de línea:
:set nu!

Borrar las siguientes 1000 líneas
d1000

Eliminar las líneas que cumplan un patrón determinado:
:g/patrón/d

Eliminar las líneas que NO cumplan un patrón:
:g!/patrón/d

Deshacer el último cambio en la línea:
U

Deshacer el último cambio:
u

Deshacer los 3 últimos cambios:
3u


Cambiar a mayúsculas o minúsculas:
Para este tema hay que recordar que la letra "g" es para cambir de un tipo al otro y algunas cosas más:
gu significa cambiar a minúsculas
gU significa cambiar a mayúsulas
w significa palabras (word).
G es para ir al final del fichero.
$ es para ir al final de línea.

Por lo tanto comandos válidos son:

gUw -> Cambiar la palabra a letras mayúsculas.
guw -> Cmabiar la palabra a letras minúsculas.
gU100w -> Cambiar las siguientes 100 palabras a mayúsculas.
gu100w -> Cambiar las siguientes 100 palabras a minúsculas.
gU$ -> Cambiar la línea actual a mayúsculas.
gu$ -> Cambiar la línea actual a minúsculas.
gUG -> Todo en mayúsculas hasta el final.
guG -> Todo en minúsculas hasta el final.

Comando de sustitución en el modo EX:
:s sustituye en la línea actual.
:%s sustituye en todo el fichero.

Cambiar en la línea actual la primera palabra "hola" que encuentre por "HOLA".
:s/hola/HOLA/

Cambiar en la línea actual todas las palabras "hola" por "HOLA".
:s/hola/HOLA/g

Cambiar todos los "hola" del fichero por "HOLA":
:%s/hola/HOLA/g

%s es lo mismo que 1,$, por lo que también podemos hacer:
:1,$s/hola/HOLA/g

Cambiar "hola" por "HOLA" de la línea 100 a la 200:
:100,200s/hola/HOLA/g

Para que pida confirmación en cada cambio añadimos la letra c al final:
:100,200s/hola/HOLA/gc

Para que ignore las mayúsculas/minúsculas
:100,200s/hola/adios/gci

Para que no ignore las mayúsculas/minúsculas:
:100,200s/hola/adios/gcI

Reemplazar la palabra "hola" por "HOLA" en las líneas que cumplan un patrón:
:g/patron/s/hola/HOLA/g

Caracteres especiales o "metacaracteres" para formar el patrón:

^ es el inicio de la expresión regular (inicio de línea).
$ es el final de línea.
. es cualquier carácter menos el salto de línea.
* es cero o más caracteres.
[] es cualquier carácter de los que se encuentra entre corchetes.
\ es el carácter de escape. Así \$ se refiere al carácter $ y no al final de línea.
\s es el espacio en blanco
\d es un dígito

Más metacaracteres aquí.


Un sencillo manual PDF con más comandos de VI aquí.

domingo, diciembre 18, 2011

Dinamic y army moves 1986 (hace 25 años)



Hoy se ha publicado el el diario Público un interesante reportaje sobre un juego mítico de los de los 8 bits: Army moves de la Dinamic.


Curiosamente hay entrada en la wikipedia inglesa y no así en la castellana.

El artículo que podéis leer aquí, se titula "CUANDO DINAMIC CONQUISTÓ EUROPA", y se centra en la descripción del proyecto de Víctor Ruiz que junto con otros dos hermanos desarrollaron "un arcade de scroll lateral con temática militar".




"Salió simultáneamente para Spectrum, Amstrad, MSX y Commodore en la Pascua de allí, que es muy fuerte. Número uno de ventas en todos los países en los que salió, en todas las plataformas", apunta Pablo, que cierra el relato enfatizando una sola palabra: "Arrasó".

jueves, diciembre 15, 2011

Oracle, consulta de privilegios de un usuario

Script SQL muy útil que nos pregunta por un usuario de la base de datos y nos proporciona la lista de privilegios de ese usuario.

Muy útil antes de eliminar el usuario (drop user cascade) para una importación.

Código descargado de: http://www.adp-gmbh.ch/ora/misc/recursively_list_privilege.html
Ahí hay otros dos scripts para consultas generales de privilegios en la base de datos.

Ejecutado correctamente en Oracle 10.2.0.4


select
    lpad(' ', 2*level)  granted_role "User, his roles and privileges"
  from
    (
    /* THE USERS */
      select
        null     grantee,
        username granted_role
      from
        dba_users
      where
        username like upper('%&enter_username%')
    /* THE ROLES TO ROLES RELATIONS */
    union
      select
        grantee,
        granted_role
      from
        dba_role_privs
    /* THE ROLES TO PRIVILEGE RELATIONS */
    union
      select
        grantee,
        privilege
      from
        dba_sys_privs
    )
  start with grantee is null
  connect by grantee = prior granted_role;


Al ejecutarse el script nos pide que introduzcamos un usuario:


Enter value for enter_username: E623E
old  12:       username like upper('%&enter_username%')
new  12:       username like upper('%E623E%')


Y esta es la lista que obtenemos:


User, his roles and privileges
------------------------------
  E623E
    ALTER SESSION
    CONNECT
      CREATE SESSION
    CREATE SEQUENCE
    CREATE SYNONYM
    CREATE VIEW
    RESOURCE
      CREATE CLUSTER
      CREATE INDEXTYPE
      CREATE OPERATOR
      CREATE PROCEDURE
      CREATE SEQUENCE
      CREATE TABLE
      CREATE TRIGGER
      CREATE TYPE
    UNLIMITED TABLESPACE

17 rows selected.

Adjunto imagen del código fuente original, ya que en blogger han eliminado algunos caracteres importantes (como la doble barra):



Saludos.

miércoles, diciembre 14, 2011

Solucionar problema con DBLINK oracle

Descripción del problema: En una instancia Oracle consigues compilar vistas que utilizan un Database Link de la siguiente forma:




CREATE OR REPLACE VIEW usuario.vista1 (campo1,
campo2)
AS
SELECT campo3
FROM usuarioDB2@nombreDblink



Teniendo un Database Link llamado: nombreDblink.nombreCompañía.es

Sin embargo, en una segunda instancia la sentencia anterior no se compila bien.
Resulta que poniendo el nombre completo del DBLink sí compila bien:




CREATE OR REPLACE VIEW usuario.vista1 (campo1,
campo2)
AS
SELECT campo3
FROM usuarioDB2@nombreDblink.nombreCompañia.es


Solucion del problema:

Iniciar sesión como sysdba y consultar la tabla GLOBAL_NAME de las dos bases de datos.
Probablemente en la primera el
GLOBAL_NAME = nombreInstancia.nombreCompañía.es

En la segunda será sólo el nombreInstancia.

Saludos.

Deshabilitar el firewall en Red Hat, CentOS, Oracle Linux

De esta forma se deshabilitaría definitivamente:

# service iptables save
# service iptables stop
# chkconfig iptables off

Si usamos IPv6:

# service ip6tables save
# service ip6tables stop
# chkconfig ip6tables off

Si en lugar de deshabilitar queremos modificar la configuración:
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables
Saludos.

martes, diciembre 13, 2011

Instalación de paquetes RPM en Linux

La instalación sería:
rpm -i paquete
i de "install"

Con yum instala también las dependencias (disponible en RedHat, CentOS y Oracle Linux):
yum install paquete

Buscar:
yum search paquete

Obtener información:
yum info paquete

Para desinstalar un paquete:
rpm -e paquete
e de "erase"

PROBLEMA DE LAS INTERDEPENDENCIAS:

A veces para instalar un paquete A tienes que instalar el paquete B.
Entonces va a instalar el paquete B y te pide el paquete A.

Solución: prueba a instalarlos juntos.

rpm -i paqueteA paqueteB


PROBLEMA 2: Hay interdependencias entre un montón de paquetes y no nos entran en una línea.

Solución:
En UNIX y Linux podemos usar la contrabarra para ejecutar un comando largo utilizando varias líneas:

rpm -i paqueteA \
paqueteB \
paqueteC \
...
paqueteZ \

Nota: antes de la contrabarra dejar un espacio.

viernes, diciembre 09, 2011

Montar CD-ROM o DVDROM en Linux

dmesg | grep DVD 
nos dará algo de información (ojo, hay un pipe entre los dos comandos).
Si no es así probamos:

dmesg | grep CD

Podemos redirigir dmesg a dmesg.txt para buscar más información sobre el DVD-ROM.

Se trata de saber cual es el fichero de dispositivo asignado.

En mi caso, en dmesg he encontrado que el dispositivo es el /dev/sr0

En mi Oracle Linux también podemos referenciarlo como /dev/cdrom
Si no existe ya, creamos el directorio /mnt/cdrom o cualquier otro similar.

Y montamos el dispositivo en ese directorio:
mount /dev/sr0 /mnt/cdrom
o
mount /dev/cdrom /mnt/cdrom

Ya podemos ir a /mnt/cdrom y ver el contenido.

Saludos.

Linux, como saber si es de 32 o 64 bits?

# getconf LONG_BIT
32

miércoles, diciembre 07, 2011

Explorer, la pestaña de seguridad






Por políticas Windows de una organización, o cualquier otro motivo, puede ocurrir que no vemaos la pestaña "Seguridad" cuando entramos en el menú "Herramientas", "Opciones de Internet" del navegador Internet Explorer.

Siempre que tengamos los permisos necesarios para modificar el registro podemos editarlo y habilitar la pestaña.










Hacemos REGEDIT.

Vamos a HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel

Editamos la entrada "Seguridad" y cambiamos el valor 1 por 0.

El siguiente problema puede ser que no tengamos el botón "SITIOS" activo. En ese caso vamos a HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\Internet Settings\Zones\3

Tenemos que editar la entrada "FLAGS" y pondremos alguno de estos valores dependiendo de lo que queramos:

1->Intranet local
2->Sitios de confianza
3.-> Internet
4.-> Sitios restringidos

Si el problema es que no se nos están aplicando las políticas de la organización podemos intentar cargarlas desde la línea de comandos: gpupdate /force

Saludos.

lunes, diciembre 05, 2011

Linux, configuación de red. Problemática de VMware




Estoy configurando un Oracle Linux Server 6.1. que se basa en Red Hat Enterprise Linux.

Comandos útiles para la configuración de red:

Comprobar la conectividad:

dmesg grep eth
Si no vemos link up malo.

ping localhost
ping dir-ip

Para ver la configuración actual:




ifconfig
ifconfig eth0
ifconfig eth0 down
ifconfig eth0 up


ifdown eth0

ifup eth0


Estadísticas de bytes enviados, errores:
cat /proc/net/dev

Parar el servicio e intentar levantarlo:
# service network stop
# service network start

O también:
# service network restart

Configuración de la dirección IP, red, etc.

Fichero /etc/sysconfig/network

Por lo menos tendrá:

NETWORKING=yes
HOSTNAME=nombre

También podemos meter el GATEWAY si es que es común a todos los interfaces.

Configuración de un interfaz (el eth0 por ejemplo):

Fichero /etc/sysconfig/network-scripts/ifcfg-eth0:

DEVICE="eth0"
HWADDR="00:50:56:01:00:20"
ONBOOT="yes"
BOOTPROTO="static"
BROADCAST="192.168.50.255"
NETWORK="192.168.50.0"
IPADDR="192.168.50.13"
NETMASK="255.255.255.0"
TYPE="Ethernet"
GATEWAY="192.168.50.253"



Problemática cuando se crea un servidor a partir de una plantilla en VMware.

O también cuando se crea un CLON VMware.

Puede que nos encontremos con estos errores:

# service network start
Activando interfaz eth0: El dispositivo eth0 no parece estar presetne, retrasando la inicialización.

# ifconfig eth0 up
eth0: unknown interface: No existe el dispositivo.

1.-Parar la máquina virtual.
2.-Ir a EDIT Setting-s (VMware).
3.-Ver la MAC address de la tarjeta de red virtual. Comprobar si es la misma que tenemos en el fichero /etc/sysconfig/network-scripts/ifcfg-eth0



#ls /sys/class/net


Si nos indica los dispositivo que esperábamos entonces la cosa está bien.


Si en lugar de eth0 y lo (loopback), nos encontramos con eth2 y lo, significa que el CLON VMware nos ha jugado una mala pasada, ya que es como si hubieramos cambiado los dispositivos.



Solución:



Ir a /etc/udev/rules.d/70-persistent-net.rules y sustituir eth2 que no esperábamos (por ejemplo) por el eth0 que esperábamos encontrar (también por ejemplo), y viceversa.




¿Qué es UDEV?



Udev se incorporó en Fedora Core 3 y Red Hat Enterprise Linux 4. Se trata de facilitar el trabajo con los dispositivos. Permite a Linux utilizar nombre de dispositivos consistentes, aunque haya dispositivos removibles (impresoras, etc.). En lugar de ver decenas o cientos de dispositivos en /dev, gracias a UDEV sólo se verían los presentes y disponibles. UDEV monitoriza /sys para saber cuales son los disponibles.



El fichero de configuración de UDEV está en /etc/udev/udev.conf

En ese fichero se indica dónde está la base de datos, dónde las reglas y dónde los permisos sobre los dispositivos. Para las reglas hay varios ficheros .rules que van numerados.El sistema va leyendo los ficheros siguiendo el orden.Por eso algunos recomiendas si creamos reglas propias llamar al fichero:

10-my.rules



Saludos.

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'

domingo, octubre 30, 2011

OfficeXP en Windows Vista o Windows7

Nota: OfficeXP es Office2002.

Ayer tuve un problemilla al instalar OfficeXP en un Windows7. El problema concretamente ocurre con el Outlook.

Buscando en Internet encontré a mucha gente a la que le ocurría lo mismo, pero imposible encontrar la explicación y la solución.

Este post trata de eso, y espero que le sirva a alguien.

SÍNTOMAS:

1.-Configuras correctamente la cuenta POP3 de Outlook. Recibes bien los correos, pero no puedes enviar. No te lo explicas porque tienes puesto que utilizas la misma cuenta para enviar que para recibir.

2.-Si buscas el error veras que sale el número 554 y la descripción: "Recipient address rejected: Access denied".

¿Cual es el problema?


Lo primero que ocurre, es que el error no hace maś que liar la cosa. Puedes pensar que te estan rechazando por estar en una lista negra anti-spam, o porque tu dominio no coincide con el del servidor SMTP que has configurado. NADA DE ESO.

Lo que ocurre es que la password de tu cuenta no se está almacenando. Por eso cada vez que entras en Outlook y le das a enciar y recibir, te vuelve a pedir la password.

Es un comportamientoque ocurre con WindowsXP o 2002 sobre Vista o Windows7. Me imagino que hay problemas con la escritura de esa password en el perfil del usuario.

La solución sencilla es la actualización a Office2003. Mano de Santo.

Saludos.

25/10/2011. 51 minutos.
26/10/2011. Fútbol-5.
28/10/2011. Fúbol-7.
30/10/2011. 58 minutos.
90kg.

lunes, octubre 17, 2011

El descuento de efectos

Cuando tienes un cheque cuya fecha no ha vencido todavía no lo puedes cobrar. Si tienes necesidad de liquidez puedes ir a varios bancos e intentar negociar el cobro anticipado (descuento).

El banco se quedará con una comisión a cambio de adelantar el pago.

Cuando hablamos de días de anticipo podemos emplear esta fórmula:

comision = (capital x dias x interes) / 36000

Este programita C te ayudará cuando tengas prisa y no te acuerdes de la fórmula:

#include <stdio.h>
int main()
{
float capital, comision, tasaInteres;
int dias, rta;
printf("\n\n\n");
printf("Descuento de efectos (o anticipos de letras o pagares) \n");
printf("-------------------------------------------------------\n");
printf("1.-Necesitas saber la tasa de interes que te cobran\n");
printf("2.-Quieres saber la comision que te va a cobrar el banco\n");
printf("Elige: ");
scanf("%d",&rta);
getchar();
printf("\n\nIntroduce estos datos:\n");
printf("Capital: ");
scanf("%f",&capital);
printf("\n\nDias de prestamo: ");
scanf("%d",&dias);
if (rta==1){
printf("\n\nY ahora pon aqui la comision por el adelanto: ");
scanf("%f",&comision);
tasaInteres = comision*36000/capital/dias;
printf("\n\nLa tasa de interes es de %f",tasaInteres);
}
if (rta==2){
printf("\n\nY ahora pon aqui la tasa de interes: ");
scanf("%f",&tasaInteres);
comision = capital*dias*tasaInteres/36000;
printf("\n\nLa comision que te van a cobrar es de %f",comision);
}
printf("\n\nPulsa cualquier letra para salir...");
getchar();
getchar();
}