Cometer errores es humano…

Cometer errores es humano, pero para estropear realmente las cosas necesitas un ordenador.

Paul Ehrlich o Paul R. Ehrlich

Sacado de la frase del día de faq-mac.com.

Buscando referencias del autor me he dado cuenta que es poco probable que sea Paul Ehrilch a secas, ya que este flamante premio novel especialista en inmunología falleció en 1915 cuando el concepto de ordenador no estaba todavía muy maduro. Me temo que su verdadero autor es Paul R. Ehrlich, biólogo especialista en temas de población, y si la wikipedia no miente, actualmente vivito y coleando.

Buscando un poco más el origne de la cita he encontrado esta página que puede tener un origen común al aluvión de frases del día que ha tenido hoy faq-mac.

101 citas célebres del mundo de la informática.

Muy buena recopilación.

Manipulando fechas con Horas en PL/SQL y SQL

La manera correcta de jugar con fechas en Oracle es truncando, sumando y restando. La manipulacion de cadenas puede ser una hábito muy peligroso que ni me molestaré en comentar.

Supongamos que tengo dos fechas (15/2/2007, 28/2/2007 10:12) y quiero que una herede la hora de la otra (15/2/2007 10:12). Vayamos paso a paso:

Select To_date ('15/2/2007 00:00:00', 'DD/MM/YYYY HH24:MI:SS'),
To_date ('28/2/2007 10:12', 'DD/MM/YYYY HH24:MI:SS')
From DUAL;

Como primer paso me quedo con la parte “día entero” de la hora. Es decir las 00:00.00 de ese día con la función TRUNC. La función trunc tiene otros usos mucho más vistosos si empleamos un segundo parámetro de máscara.

Select TRUNC (To_date ('15/2/2007 00:00:00', 'DD/MM/YYYY HH24:MI:SS'))
From DUAL;

Internamente Oracle almacena las fechas como un número. Luego si resto dos fecha recibo un número. Este representa una fracción de día, siendo 1 un día completo.

Select To_date ('28/2/2007 10:12', 'DD/MM/YYYY HH24:MI:SS')
- TRUNC (To_date ('28/2/2007 10:12', 'DD/MM/YYYY HH24:MI:SS'))
From DUAL;

El resultado es la suma de los anteriores resultados.

Select TRUNC (To_date ('15/2/2007 00:00:00', 'DD/MM/YYYY HH24:MI:SS'))
+ ( To_date ('28/2/2007 10:12', 'DD/MM/YYYY HH24:MI:SS')
- TRUNC (To_date ('28/2/2007 10:12', 'DD/MM/YYYY HH24:MI:SS')))
From DUAL;

Quizá queda un poco confuso pero veamos como queda como llamada anónima PL/SQL.

Declare
fecha_sin_hora Date := To_date ('15/2/2007 00:00:00', 'DD/MM/YYYY HH24:MI:SS');
fecha_con_hora Date := To_date ('28/2/2007 10:12', 'DD/MM/YYYY HH24:MI:SS');
fecha_resultado Date;
resto_hora Number;
Begin
fecha_resultado := TRUNC (fecha_sin_hora);
-- convierte a solo dia por si hubiese algun resto de hora
resto_hora := fecha_con_hora - TRUNC (fecha_con_hora);
-- es un numero, concretamente una fraccion de hora
fecha_resultado := TRUNC (fecha_sin_hora) + resto_hora;
-- el resultado sera la suma de la parte entera mas el numero fraccion de dia.
DBMS_OUTPUT.put_line (TO_CHAR (fecha_resultado, 'DD/MM/YYYY HH24:MI:SS'));
End;
/

Tan sencillo como sumar y restar.

Doble dirección ip en una entrada tnsnames.ora

El tnsnames.ora es un fichero que con el tiempo se convierte en un basurero. Se añaden entradas redundantes, o usadas una vez y olvidadas, editadas a mano, mal formateadas… Un calvario si no eres especialmente ordenado.

Personalmente, prefiero nombres en las cadenas de conexión que se autodefinan, es decir que el nombre incluya una referencia a si la bbdd es de producción o desarrollo, en que máquina está y como se llama la instancia. Por ejemplo utilizo estas máscaras HOST_BBDD_PROD, CLIENTE_BBDD_PREPRO, ...

Un problema habitual suele ser intentar acceder desde tú maquina portátil a la misma bbdd desde dos puntos de red distintos, por ejemplo desde mi oficina (ip de internet) y desde la oficina del cliente (ip de su lan) cuando estoy de visita. La respuesta sencilla: dos entradas; la respuesta la inteligente: una única entrada ya que es la misma bbdd.

En el siguiente ejemplo se muestra como invocar la misma cadena de conexión desde dos puntos distintos, el sqlnet automáticamente salta a la dirección que funciona en cada caso.

HOST_BBDD_DESA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = 64.233.167.99)
(PORT = 1521)
)
(ADDRESS =
(PROTOCOL = TCP)
(HOST = 192.168.1.10)
(PORT = 1521)
)
)
(CONNECT_DATA =
(SID = BBDD)
(SERVER = DEDICATED)
)
)

Como se puede ver las combinaciones pueden ser múltiples. No sólo se pueden marcar distintas direcciones o nombres de host sino que para cada entrada puedes determinar su puerto.

Curiosidades sobre la felicidad

La felicidad, tu felicidad no es más que una emoción y, por tanto, un estado transitorio. La felicidad es básicamente la ausencia de miedo, como la belleza es la ausencia de dolor. Encontramos la felicidad en el camino que recorremos mientras la buscamos, en cada paso que nos aproxima hacia ella y no tanto al alcanzar el destino. En el aprovechamiento de cada instante de felicidad que los avatares de nuestra existencia nos permitan. Así pues, observa con perspectiva y cierta distancia los grandes acontecimientos y no olvides disfrutar de las pequeñas cosas

Leído y adaptado de varios libros de Eduardo Punset, “El alma está en el cerebro” y “Viaje a la felicidad“.