domingo, 18 de octubre de 2015

Enlaces simbólicos para tener una copia de ficheros sin duplicar espacio

Con el fin de tener un duplicado de ficheros en una ubicación diferente, pero que tan solo sea un enlace directo al fichero sin duplicar espacio en disco, utilizaremos enlaces simbólicos. Se pueden utilizar en sistemas operativos tipo unix, como Mac, Linux.

Este tipo de enlaces simplemente almacenan la dirección (path) del archivo original, ocupando así muy poco espacio. Permiten acceder al archivo e incluso modificarlo a través de este acceso directo. Sin embargo, podemos eliminar tranquilamente el enlace simbólico sin que el original sea eliminado.

En el caso de sincronizar archivos, por ejemplo con Dropbox, se realiza la sincronización del archivo original. Es decir, podemos crear una estructura de ficheros en Dropbox sin tener que duplicar ficheros.

El mandato a utilizar en terminal es: 
ln -s <dirección de origen> <dirección de destino>

 $ ln -s /Users/juanpablo/Dropbox/Cursos/OracleXE112_Win32.zip 
 $ ln -s /Users/juanpablo/Dropbox/Cursos/scripts ./"Carpeta de scripts"

Si no se especifica la dirección de destino se entiende que es la ubicación actual de trabajo y el nombre es el mismo. Caso contrario se debe especificar la dirección o nombre diferente que se quiera. Utilizar direcciones absolutas, en otras palabras, la dirección completa de origen.


En el caso de Mac, mediante la interfaz gráfica de Finder se visualiza los ficheros con una pequeña flecha indicando que es un enlace. Si se visualiza desde terminal mediante un «ls -l» se mostrará la dirección a la que apuntan los enlaces. No se debe confundir los enlaces simbólicos, con los alias, ni con los enlaces físicos.

Realizado en: OS X Yosmite 10.10.5 

miércoles, 30 de septiembre de 2015

Shell script para crear usuarios en linux (Debian)


A continuación se plantea un shell script que recibe como parámetro el nombre base para los usuarios a crear, el número de usuarios a generar y el grupo al que han de pertenecer. El número de usuarios es opcional siendo por defecto 5. El grupo al que han de pertenecer es opcional, siendo por defecto el nombre base que se da para generar los usuarios. No se realiza control de valides de argumentos, solamente el orden según se indica en el mensaje de uso.


#! /bin/bash

# Declaración de funciones
function mensaje_uso(){
    echo "ERROR: Número de parámetros incorrecto." >&2
    echo "USO: $0 <nombre_base> [-n <numero_de_usuarios>] [-g <nombre_de_grupo>]" >&2
    exit $salida  
}

function crea_grupo(){
    sentencia_crea_grupo="groupadd $nombre_grupo"
    $sentencia_crea_grupo 2> /dev/null #Supuesto de error es porque ya existe
}

function crea_usuario(){
    sentencia_crea_usuario="useradd -g $nombre_grupo $nombre_usuario"
    $sentencia_crea_usuario 2> /dev/null #Supuesto de error es porque ya existe
}

function asigna_grupo(){
    sentencia_cambio_grupo="adduser $nombre_usuario $nombre_grupo"
    $sentencia_cambio_grupo 1>&2> /dev/null #Nos aseguramos de que formen parte del grupo exigido
}

function asigna_passwd(){
    echo $nombre_usuario:$nombre_base | chpasswd    
}

# Inicialización de variables
ENE="-n"
GE="-g"
nombre_grupo=$1
nombre_base=$1
numero_usuarios=5
salida=1

# Control simple de argumentos
case "$#" in
    1)  case $1 in
            -h | --help | -help )
            salida=0 
            mensaje_uso 
            ;;
        esac
        #Se mantiene los valores por defecto
    ;;    
    3)
        if [ "$2" = "$ENE" ]; then
            numero_usuarios=$3
        else
            if [ "$2" = "$GE" ]; then
            nombre_grupo=$3
            else
                mensaje_uso
            fi
        fi
    ;;
    5)
        if [ "$2" = "$ENE" ]; then
            if [ "$4" = "$GE" ]; then
                numero_usuarios=$3
                nombre_grupo=$5
            else
                mensaje_uso
            fi
        else
            mensaje_uso
        fi
    ;;
    *) mensaje_uso
    ;;
esac

# Cuerpo
crea_grupo
 
for (( indice=1; indice <= $numero_usuarios; indice++ ))
    do
    nombre_usuario=$nombre_base$indice
    crea_usuario
    asigna_grupo
    asigna_passwd
done

exit 0


Se ha realizado en una máquina con Debian 7.0 (Wheezy) 

sábado, 19 de septiembre de 2015

Mostrar código con formato en una entrada del blog


Para escribir una entrada en el blog en la que se incluye código y se desea mostrar con un formato que lo diferencie, se puede utilizar la siguiente forma:

1) Escribir el código entre las etiquetas «pre» y «code». «code» indica que es código y «pre» nos facilita la interpretación de este, por ejemplo, evitando así la necesidad de incluir saltos de línea con formato html.
2) Aplicar estilos CSS.

Por ejemplo para mostrar el texto de la siguiente forma:

#!/bin/bash

echo ¡Hola mundo cruel!


El código utilizado es el siguiente:

<div id="codigo">
<pre><code>
#!/bin/bash

echo ¡Hola mundo cruel!

</code>
</pre>
</div>

<style>
#codigo{
color:#ffffff;
background:#000000;
}
</style>

Enlaces relacionados:
Mostrar HTML en una página web
Mostrar etiquetas html <>, sin que sean interpretadas por el navegador

jueves, 17 de septiembre de 2015

Permiso denegado al intentar instalar Guest Additions en Debian VirtualBox

Lo primero es ir al menú Devices de Virtual Box y dar clic a la opción de: Insert Guest Additions CD image... y asegurarse de que la imagen está montada, es decir, accesible el CD.
Desde una terminal nos ponemos en modo administrador:
sudo su
(e introducimos la contraseña del usuario con el que iniciamos sesión)
En este punto debemos ser root. Ejecutamos el archivo y es cuando da error diciendo: Permission denied.

Para solucionarlo se antepone la llamada al shell: sh

usuario@maquina:~$ sudo su
[sudo] password for usuario:
root@maquina:/home/usuario# whoami
root
root@maquina:/home/usuario# cd /media/cdrom0/
root@maquina:/home/usuario# sh VBoxLinuxAdditions.run

Otra forma de hacerlo es modificando el fichero /etc/fstab y cambiar la opción «auto» por «exec», es decir, «user,auto» por «user,exec» en la línea correspondiente al cdrom0, tal como se muestra a continuación:


root@maquina:/media/cdrom0# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options>  <dump> <pass>
# / was on /dev/sda1 during installation
UUID=d5df0c9a-ce86-41f0-85c3-35acb6b9d9a1 /  ext4  errors=remount 0 1
# swap was on /dev/sda5 during installarion
UUID=a57d5d74-f3c3-4938-955f-ef1e3a2336c3  none  swap  sw  0  0
/dev/sr0   /media/cdrom0  udf,iso9660  user,exec   0  0

Solución encontrada en: https://forums.virtualbox.org/viewtopic.php?f=3&t=58799


Probado en Debian 7.0 (Wheezy)
Oracle VirtualBox 4.3.30 for Mac


martes, 1 de septiembre de 2015

Condición LIKE en Oracle SQL


Para condicionar en vez de utilizar un igual «=» en el que se comprueba carácter a carácter si son iguales:
('Francisco' = 'Francisco') es verdadero
('Fran     ' = 'Francisco') es falso

Con LIKE se puede condicionar utilizando comodines para realizar búsquedas como:

--Nombre de los empleados que su segunda letra, del nombre, sea una «a» minúscula.
SELECT first_name
FROM employees
WHERE first_name LIKE '_a%';

Comodines (wildcard)
Guión bajo «_» indica un carácter.
Porcentaje «%» indica cero o n caracteres.

--Nombre de los empleados que su nombre empiece por «S» y termine en «n».
SELECT first_name
FROM employees
WHERE first_name LIKE 'S%n';

Cuando tenemos la necesidad de indicar que buscamos en la cadena de caracteres uno de los caracteres comodines («_», «%»), especificamos un carácter de escape.

--Email de los empleados que contengan un guión bajo.
SELECT email
FROM employees
WHERE email LIKE '%@_%' ESCAPE '@';

En el ejemplo se ha utilizado como carácter de escape la arroba «@», podría ser otro carácter. Si coincide el carácter que especificamos fijo en la búsqueda y el de escape, simplemente se lo repite.

SELECT email
FROM employees
WHERE email LIKE '%__%' ESCAPE '_';

Si la comparación es de igualdad lo mejor es utilizar simplemente un igual «=»; en caso de solo una parte de la cadena, como por ejemplo que empiece por «A» lo mejor es utilizar la función SUBSTR y no un LIKE.

Más información: web Oracle

sábado, 22 de agosto de 2015

Libros

Última actualización: miércoles 13 de septiembre de 2017.

En proceso de lectura


En pausa

  • MBA personal. (Josh Kaufman)
  • Así habló Zaratustra. (Friedrich Nietzsche)
  • El libro de Urantia.

Leídos

2017
  • Autobiografía. (Benjamin Franklin)
  • El hombre en busca de sentido. (Viktor Frankl)
  • Cómo ganar amigos e influir sobre las personas. (Dale Carnegie)
  • Hegel en 90 minutos (Paul Strathern)
  • Confucio en 90 minutos (Paul Strathern)
  • El secreto de la mente millonaria (T. Harv Eker)
  • Focus. (Daniel Goleman)
2016
  • Confianza en uno mismo. (Ralph Waldo Emerson)
  • El elemento. (Ken Robinson)
  • El hombre más rico de Babilonia. (George Samuel Clason)
  • Autodisciplina en diez días. (Theodore Bryant)
  • Padre rico padre pobre. (Robert Kyosaki)
  • Piense y hágase rico. (Napoleon Hill)
  • Seven. (Anthony Bruno —Penguin Readers—)
  • The Godfather. (Mario Puzo —Penguin Readers—)
2015
  • Código limpio: manual de estilo para el desarrollo ágil de software. (Robert C. Martin)
  • Yo me he quedado con tu queso. (Darrel Bristow-Bovey)
  • El Principito. (Antoine de Saint-Exupéry)
~2014
  • El arte de la guerra. (Sun Tzu)
  • El Alquimista. (Paulo Coelho)
~2013
  • Steve Jobs. (Walter Isaacson)
  • Y Google, ¿Cómo lo haría? (Jeff Jarvis)
~2012
  • Democracia participativa y modernización de los servicios públicos: Investigación sobre las experiencias de los presupuestos participativos en Europa. (Ives Sintomer y Ernesto Ganuza)
  • Clean coder: a code of conduct for professional programmers (Robert C. Martin)
~2011
  • Tengo ganas de ti. (Federico Moccia)
Antes 2005
  • ¿Quién se ha llevado mi queso? (Johnson Spencer)
  • Leyendas, Anécdotas y Tradiciones de Piñas. (Wilfrido Torres León)
  • Juventud en Éxtasis. (Carlos Cuauhtemoc)
  • Santa Biblia.
  • ...

Detenido
  • Amor líquido. (Zygmunt Bauman)

Tal vez
  • 1984. (George Orwell)
  • A lo largo del camino de la libertad. (Nelson Mandela)
  • Cien años de soledad. (Gabriel García Márquez)
  • Cómo crear mapas mentales. (Tony Buzan)
  • Cosmos. (Carl Sagan)
  • Crimen y castigo. (Fiador Dostoyevski)
  • Ecce homo. (Friedrich Nietzsche)
  • El Aleph. (Jorge Luis Borges)
  • El americano impasible. (Graham Greene)
  • El Anticristo. (Friedrich Nietzsche)
  • El castillo. (Kafka)
  • El corán
  • El crepúsculo de los ídolos. (Friedrich Nietzsche)
  • El don apacible. (Mijaíl Shólojov)
  • El Príncipe. (Nicolas Maquiavelo)
  • Ensayo sobre la lucidez. (José Saramago)
  • Ensayo sobre la ceguera. (José Saramago)
  • Escritos coleccionados de Lincoln
  • Filosofía de la desigualdad. (Nikolai Berdiáyev)
  • Guerra y paz. (León Tolstói)
  • Humano, demasiado humano. (Friedrich Nietzsche)
  • Influencia. (Robert Cialdini)
  • La alquimia de las finanzas. (George Soros)
  • La crítica de la razón pura. (Kant)
  • La divina comedia. (Dante Alighieri)
  • La interpretación de los sueños. (Sigmund Freud)
  • La justificación del bien. (Vladimir Soloviov)
  • La república. (Platón)
  • La peste. (Albert Camus)
  • Lecciones en el desastre. (Gordon Goldstein)
  • Lincoln. (David Herbert)
  • Masa y poder. (Elias Canetti)
  • Más allá del bien y del mal. (Friedrich Nietzsche)
  • Meditaciones. (Marco Aurelio)
  • Organízate con eficacia. (David Allen)
  • Padres e hijos. (Turguéniev)
  • Pensar la revolución francesa. (François Furet)
  • Poder sin límites. (Tony Robbins)
  • Política como vocación. (Max Weber)
  • Preferiblemente irracionales. (Dan Ariely)
  • Rayuela. (Julio Cortázar)
  • Relatos de lo inesperado. (Roland Dahi)
  • Sapiens: una breve historia de la humanidad, de Noah Yuval Harari
  • Stalingrado. (Antony Beevor)
  • Tao Te Ching. (Lao Tse)
  • Teoría general de la ocupación el interés y el dinero. (John Maynard Keynes)
  • Trabajo asalariado y capital. (Karl Marx)
  • Una guerra mejor. (Lewis Sorley)
  • Vender más en Internet - David Boronat y Ester Pallarés
  • Yo sé por qué canta el pájaro enjaulado. (Maya Angelou)
  • Yo y la energía. (Nikola Tesla)

lunes, 18 de mayo de 2015

Fomentar la lectura...


Al ver los extractos de libros puestos en el transporte público como parte de la campaña para fomentar la lectura, en Madrid, me pregunté sobre qué se estará haciendo en Ecuador para potenciar la lectura... Recuerdo que en mi paso por el sistema educativo en Ecuador, tanto primaria como secundaria, no llegué a leer un libro entero porque lo impulsaran o pidieran en la escuela o colegio (parcial, solo por alguna tarea). Alguna vez algunos profesores decían que deberíamos leer, pero se quedaba solo en eso, un vago llamado a la lectura. Tal vez, ni ellos lo hacían. Si leía algo era por propia curiosidad. Y ahora pienso en el tiempo que no aproveché leyendo en aquel entonces; porque a parte de la curiosidad, a veces, se necesita otros estímulos como el ejemplo, el reto, la recomendación, etc. En Ecuador, no creo tenemos una cultura de lectura.

Considero se debe planificar distintas estrategias para fomentar la lectura, desde las diferentes instituciones y jerarquías. Aprender de campañas ya realizadas en otros lugares; desde el Ministerio de Educación, Ministerio de Cultura puede organizarse un listado de libros a leer, y recomendar algunos otros, no solo como parte de asignaturas como Lenguaje, Literatura, sino que otras como pueden ser Economía, Filosofía, Matemáticas, etc. No solo se debe trabajar por separado, sino que una misma lectura puede contener aprendizaje en distintas ramas, por ello, se puede analizar con los profesores de distintas asignaturas con diferentes enfoques.

Sobre todo, los objetivos de incentivar la lectura deben quedar claros a nivel nacional, como pueden ser el mejorar gramática y ortografía, la capacidad de comprensión y reflexión crítica de la información, sin olvidar el razonamiento lógico, sacar conclusiones basados en la evidencia. Sumado a, fomentar valores y aptitudes, empatía, solidaridad, respeto, etc. Entonces, fomentar la lectura en entornos educativos, padres de familia, mientras se realiza viajes, en penitenciarías, salas de espera, etc. Todo ello es parte de mejorar como sociedad, del cambio cultural para el buen vivir.


Finalmente, para no extenderme demasiado, las ideas pueden venir de diferentes partes por lo que tener plataformas para que fluyan esas ideas e iniciativas, puede ser en sí como un banco de ideas a aprovechar, porque juntos podemos hacer más. Con plataformas y una buena gestión de las ideas no solo se tiene cantidad, también calidad.

sábado, 4 de abril de 2015

Los borregos


Se utiliza el término «borrego» para referirse a una persona ignorante que se somete a la voluntad ajena. Esta forma, borregos, se viene utilizando para referirse a los seguidores del Gobierno. Como filosofía de vida no creo que todos sean, o no lo sean, borregos; es posible que algunas personas encajen en el término. 

Sin embargo, llama la atención cómo quienes utilizan el término, de una forma despectiva hacia otras personas, siguen como borregos cualquier cosa que sea en contra del Gobierno. Es decir, por ejemplo, comparten cualquier noticia que diga algo en contra del Gobierno o afines, sin detenerse por un momento a reflexionar; muchas de las veces son noticias satíricas, falsas, publicadas en medios como El Mercioco, El Republicano. Si con estos medios claramente divulgadores de noticias falsas, varias personas se dejan engañar, no es de extrañar que medios supuestamente serios, y que cometen muchos errores, les engañen. No me extrañaría que sean estas mismas personas las que comparten bulos, pensando que Facebook donará dinero por darle «Me gusta» a una foto de una niña con cáncer, etc.

Por un lado, quiero resaltar que es un indicador de desarrollo de la sociedad el cuan fácil se deja engañar respecto a noticias falsas. Por otro lado, la hipocresía de algunas personas que llaman a otras: borregos; siendo ellas mismas borregos de sus prejuicios, de la falta de reflexión. Si no fuesen borregos de la mediocridad, aunque no se esté de acuerdo con el Gobierno, no cometerían tales errores.

lunes, 30 de marzo de 2015

Crear imagen ISO en Mac OS X


Para crear una imagen ISO a partir de una carpeta:

  1. Abrimos Utilidad de Discos.
    Archivo-Nueva > Imagen de Disco a partir de carpeta.
    Elegimos la carpeta a convertir y en «Formato de la imagen»: DVD/CD maestro, «Encriptación»: ninguna. Le damos un nombre y guardamos. Se guardará con extensión .cdr
  2. Abrimos el Terminal.
    Escribimos el siguiente mandato:
    hdiutil makehybrid -iso -joliet -o nombreFicheroISO.iso nombreFicheroCDR.cdr
nombreFicheroISO.iso: es el nombre de la imagen ISO que queremos generar.
nombreFicheroCDR.cdr: es el nombre del archivo generado con la aplicación Utilidad de Discos.
Al momento de hacer referencia a los nombres hay que tener en cuenta la ubicación. Ejemplo:

hdiutil makehybrid -iso -joliet -o /Users/juanpablo/Downloads/Visio\ 2007\ \(x86\)\ ESP.iso /Users/juanpablo/Downloads/Visio\ 2007\ \(x86\)\ ESP.cdr

domingo, 15 de febrero de 2015

¿Correa VS Redes sociales? ¿Tal vez una lucha por una mejora cultural?


En las últimas semanas Correa dijo basta a mensajes que recibe vía redes sociales, pues no solo recibe insultos, además acusaciones, amenazas, injurias. Es por ello que, se da un nuevo enfrentamiento entre diferentes formas de entender lo que es libertad de expresión.

¿No hay problema si le insultan porque son redes sociales? ¿O por ser un personaje público? No me extrañaría esas ideas, las he escuchado, con decepción, de educadores. Es decir, la idea parece que fuera: estás para servirnos, no nos gusta que ganes mucho y debes soportar que te insultemos. ¡Pongamos esclavos de servidores públicos! No debería sorprendernos que intenten robarnos y jodernos. Recuerdo un reportaje en el cual preguntaban a niños sobre lo que querían ser de adultos y, al preguntarles por qué no decían querer ser políticos, respondían: no quiero que me insulten, la gente los odia a ellos, mis padres dicen que son ladrones, yo no quiero ser político.

Hay que diferenciar insultar, ridiculizar, afirmar, suponer, etc. pues son diferentes y hace que pueda ser penado legalmente. Así como no es lo mismo acusar a determinada persona en un bar entre amigos que hacerlo en medios de comunicación de alcance masivo, en los cuales por muy adulto que seas lo que escuchas y ves influye en tu subconsciente —fácilmente en algunos inconscientes—.

Algo que suelo ver en comunicadores extranjeros es que subestiman a comunicadores, en este caso, de Ecuador, porque su calidad, deja que desear. Jonh Oliver, comediante que comentó sobre este tema —primera vez que sé de su existencia—, hace gracia con que un payaso estuviera en un informe de un presidente, una imagen de Correa con Patch Adams metidos juntos en un calzoncillo enorme, etc., no con acusarle de actos, enmascarados en humor, cosa que sí suelen hacer comunicadores —no solo en Ecuador—; pero, no concuerdo en su forma de pensar de que es normal el que te insulten y, su llamado a insultar a Correa, el cual es un llamado diferente al que realizó Correa, pues pidió defender y contestar a cada mentira, no ha pedido insultar. Creo entiendo lo que intenta decir Correa, pero se debe explicar muy mal o estamos tan mal acostumbrados a que las cosas sean de tal modo que verlas de otra forma suena de locos. Me imagino decir en la época de los gladiadores que no se debería hacer las luchas a muerte; en la época actual es como decirles a los taurinos cosa similar.

Cierto es que muchos de quienes apoyan a Correa caen en las mismas cosas que se pide evitar, como el insulto, amenazas, etc. Además, creo es posible que el mismo Correa cae en violaciones a la ley, como lo de publicar datos de las personas en el Enlace ciudadano. Y es cuando la institucionalidad del país deja notar que falta por desarrollar, salvo el Ministro de Interior que dijo investigar a personas que amenazan a detractores de Correa, pero otro cosa es si realmente se trabaja en ello y actúan de igual forma que con los que insultan a Correa.

Muchas personas oran o reclaman por diferentes cosas diciendo: Dios, ¿por qué permites esto? Y quienes lo permiten son las personas.

Fábula de Félix, la rana voladora

Cómo mejorar el desempeño… o la parábola de Félix, la rana voladora.


Había una vez un hombre llamado José que tenía como mascota una rana llamada Félix. José tenía un pasar modesto pero confortable, sostenido por lo que ganaba como empleado de una importante cadena de supermercados. De todos modos siempre había soñado con ser rico…

¡Félix! Dijo un día, lleno de una repentina inspiración, «vamos a ser ricos. ¡Te voy a enseñar a volar!». Félix, por supuesto, se sintió aterrado por las perspectivas. «¡Yo no puedo volar! Soy una rana, no un canario». José, decepcionado por la respuesta inicial, le dijo: «Esa actitud negativa puede evidenciar cierta resistencia y será un problema. Voy a mandar a capacitarte». Así fue que Félix tomó un curso de tres días donde aprendió técnicas para la resolución de problemas, gestión del tiempo y comunicación efectiva, pero nada, absolutamente nada sobre volar.

El día siguiente a las lecciones, José a duras penas podía controlar su excitación (y Félix a duras penas podía controlar su pánico). José explicó que el edificio en el que vivían tenía 15 pisos. Cada día Félix saltaría desde la ventana, empezando en el primero y llegando eventualmente al último. Así que, después de cada salto, Félix debía: a) analizar cuán bien había volado, b) identificar las técnicas de vuelo más efectivas y c) implementar el proceso mejorado para el próximo vuelo. Llegado el momento de alcanzar el piso más alto, Félix sería seguramente capaz de volar.

Félix imploró por su vida, pero sus pedidos cayeron en saco roto. «Sucede que él no entiende la importancia de esto», pensó José, «es incapaz de tener una visión macro». Con esto en mente, José abrió la ventana y tiró a Félix afuera. La rana aterrizó con un ruido seco.

Al día siguiente, amargado ante su segunda lección de vuelo, Félix pidió nuevamente no ser lanzado por la ventana. José abrió su «Guía para liderar de manera más efectiva» y le mostró a Félix la parte donde explicaba que uno debe esperar siempre resistencia cuando se introducen programas o propuestas innovadoras. Después, tiró a Félix por la ventana. ¡¡Plaf!!

En el tercer día (y en el tercer piso), Félix intentó una estrategia distinta: dilatar. Pidió una postergación del proyecto hasta que la mejora en el clima permita condiciones de vuelo más favorables. Pero José estaba preparado para eso: dibujó una línea de tiempo, marcó los tres hitos y preguntó: «¿No estarás intentado boicotear el plan, no?» Debido a su entrenamiento en gestión del tiempo, Félix comprendió que no saltar hoy solo significaría tener que saltar dos veces mañana. Entonces accedió. Y allá fue, fuera de la ventana.

Todo esto no quiere decir que Félix no intentaba dar lo mejor de sí. En el quinto día, estiró sus patas de manera desesperada en un intento vano de volar. Y en el sexto, se ató un pequeña capa roja alrededor del cuello y trató de pensarse Superman (Visualización Positiva, pensó José). Pero eso no ayudó.

Para el séptimo día, Félix, aceptando su destino, no pidió más piedad. Simplemente miró a José y le dijo: «Tú sabes que me estas matando, ¿no?». José señaló que el desempeño de Félix no había sido para nada ejemplar y que había fallado en cumplir cada uno de los hitos que se habían fijado para él. «Cállate y abre la ventana», dijo Félix, y allí fue, volando, hacia un lugar desconocido… en el cielo.

José estaba terriblemente decepcionado dado que no había logrado cumplir ni siquiera uno de los objetivos de su proyecto: Félix no solo no había logrado volar, ni siquiera pudo mejorar su caída para no parecer una bolsa de cemento a pesar de que su principal consejo había sido «más vale maña que fuerza». Lo único que le quedaba a José era analizar el proceso para determinar dónde se había equivocado. Después de mucho pensar, José sonrió y dijo: «¡La próxima vez conseguiré una rana más inteligente!»


La rana Félix y las expectativas de desempeño

La historia anterior nos sirve a todos para hacernos interesantes preguntas: ¿Tienen una base realista las expectativas sobre el desempeño de las personas? ¿Cuál es el verdadero potencial de desarrollo de cada uno? ¿Los objetivos que fijamos tomaron en cuenta las elecciones personales y comprometieron a los colaboradores en su logro o, nosotros hicimos el plan simplemente para que otro lo cumpla? ¿Estamos capacitando en lo que verdaderamente importa? ¿Estamos interpretando de manera casi automática las conductas como resistencias, cuando nos están indicando otra cosa? En definitiva: ¿Estamos pidiendo a las ranas que vuelen? O mejor aún ¿Es solo responsabilidad de Félix no haber cumplido con las expectativas de José? 

A esta altura del relato, vale la pena una aclaración: si bien muchas veces nos encontramos con personas que no están dispuestas a la mejora y el crecimiento, la mayoría de las veces, el problema está en otro lado: comunicación muy pobre sobre las expectativas del rol, preconceptos y modelos mentales que nos hacen ser escépticos respecto del potencial de los colaboradores, recursos inadecuados (o inexistentes) para alcanzar los resultados esperados, procesos mal diseñados que son un verdadero obstáculo para la mejora, objetivos que, no solo no son desafiantes, sino que muchas veces son imposibles

En época de revisión del desempeño y de fijación de objetivos para el próximo período, los invitamos a pensar y repensar, en conjunto con los involucrados, todo el proceso de evaluación. De esa forma, no habrá situaciones desagradables, metas inalcanzables, prejuicios en juego y finalmente, decepciones generalizadas.

Nota: No recuerdo en dónde encontré el texto.

jueves, 29 de enero de 2015

JOINS con Oracle SQL


Voy a resumir rápidamente las diferentes formas de realizar una unión —JOIN, OUTER JOIN— de tablas en una sentencia SELECT. Aunque lo especificado en esta entrada se realiza utilizando Oracle, el lenguaje SQL es un estándar y por ello puede ser utilizado (suele haber pequeñas diferencias, por lo que hay que probar) en diferentes sistemas de gestión de bases de datos. Añado que, a lo largo de la entrada me refiero a «tabla» pero según el contexto puede ser en su lugar: vistas, subconsultas; y cuando me refiero a «campo» es el nombre de la columna; «fila» es una tupla; esto por familiarizar con diferentes formas de expresar para quienes se inician.

Utilizaré dos tipos de tablas para poner los ejemplos, es decir, unas inventadas por mí para ilustrar rápidamente y, las del esquema de ejemplo HR de Oracle que viene instalado o se puede crear desde Oracle, o buscando en internet los scripts.

Las tablas inventadas son las siguientes:


CROSS JOIN
Es el producto cartesiano, es decir, la relación de todas las filas de la tabla Emp con todas las filas de la tabla Dep y a su vez con todas las filas de la tabla Loc. Esto hay que conocerlo porque nos puede dar una pista de cuando nos salen más filas de las esperadas ya que no hemos especificado la condición de unión de las tablas según su relación.

En este pequeño ejemplo en el que en Emp hay 4 filas, Dep 3 filas y Loc 2 filas, obtenemos como resultado 24 filas = 4x3x2.

La sentencia escrita en dos formas:
SELECT emp.nombre, emp.depid, dep.depid, dep.nombre, loc.nombre
FROM emp, dep, loc; 
SELECT emp.nombre, emp.depid, dep.depid, dep.nombre, loc.nombre
FROM emp CROSS JOIN dep CROSS JOIN loc;
Si realizamos similar prueba con las tablas del esquema HR la sentencia sería:
SELECT first_name, department_name, city
FROM employees, departments, locations;
Dando como resultado 66447 filas = 107(Employees) x 27(Departments) x 23(Locations)

NATURAL JOIN
Lo que realiza es una unión por los campos de igual nombre, así que, hay que tener cuidado con esto pues hay quien lo utiliza para escribir menos y confía en que se realiza la unión por los campos clave. Pero, además puede estar realizando la unión por otros campos en los que coincide el nombre de las columnas. 

Empecemos con un ejemplo de las tablas de HR en el que deseamos el nombre de los empleados y el de su departamento.
SELECT first_name, department_name
FROM employees NATURAL JOIN departments;
Puede que pensemos que lo que se está haciendo es la unión por el campo con el que se relacionan las tablas, que es el número de departamento, la sentencia siguiente:
SELECT first_name, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;
Pero, en realidad no lo es y nos da como resultado 32 filas, ya que en realidad la sentencia que está realizando sería:
SELECT first_name, department_name, department_id
FROM employees, departments
WHERE employees.department_id = departments.department_id
AND employees.manager_id = departments.manager_id;
En realidad ésta sentencia nos da los empleados que tienen el mismo jefe, tanto como jefe de empleado como jefe de departamento. Debido a que en las tablas Employees y Departments existen dos campos (nombre de columna) en los que coincide el nombre: manager_id y department_id. Si intentamos especificar en la Select uno de estos campos dará error si le anteponemos un nombre de tabla pues esta sentencia es específicamente para tratarlos como igual, así que no hay por qué diferenciar.

En el caso de las tablas que he inventado no obtendremos ninguna fila pues en las tres hay un campo que se llama: nombre. Y claro está que ningún valor coincide.

JOIN o simple join o inner join
Es la unión típica en la que se especifica el campo o campos que relacionan las tablas involucradas. Esto es, un campo primary key con uno foreign key. Los cuales surgen de una correcta modelización y paso al modelo relacional.

En el ejemplo se puede ver que salen únicamente las tuplas (filas) relacionadas. Es decir, Ana como no tiene un departamento no se muestra en el listado. Supongamos que aunque María sí esté en el departamento 20, el departamento 20 no tenga asignada una localidad, entonces tendremos como resultado solo dos filas en donde María no se listará.

Otra forma de escribir la misma sentencia es con la palabra JOIN y la cláusula USING:
SELECT emp.nombre, depid, dep.nombre, loc.nombre
FROM emp JOIN dep USING(depid)
                    JOIN loc USING(locid);
Es una forma en la que debemos tener en cuenta que: los nombres de los campos utilizados en la cláusula USING deben ser iguales en ambas tablas, y no puede anteponerse el nombre de ninguna tabla como podemos ver al utilizarlo en la parte de SELECT con el campo: depid, de igual modo si lo utilizamos en otra parte de la sentencia. Como podemos ver la especificación se hace escribiendo todo en el FROM; en el WHERE irán todas las condiciones restantes que no tienen que ver con la relación de las tablas. 

Lo que estamos diciendo es que Emp se une con Dep usando el campo depid y, a esa unión la unimos con la tabla Loc usando el campo locid. Repito: los nombres tienen que ser iguales pues de caso contrario no se puede realizar esta sintaxis. También, hay que tener en cuenta que si realizamos la unión por más de un campo se especifican separados por comas dentro del USING. Por ejemplo en el caso visto antes de los empleados que su jefe es el mismo que el jefe del departamento en el que trabajan se podría escribir de la siguiente forma.
SELECT first_name, department_name
FROM employees JOIN departments USING(department_id, manager_id);

Y obtendríamos las 32 filas mencionadas. Pero, debemos tomar en cuenta que aunque obtenemos los mismos resultados, por buenas prácticas debemos separar las condiciones de relación de las tablas (campos clave con campos ajenos) del resto de condiciones, en sentencias más grandes facilita el mantenimiento y la comprensión. Es decir, la sentencia sería:
SELECT first_name, department_name
FROM employees JOIN departments USING(department_id)
WHERE employees.manager_id = departments.manager_id;
Continuando con las tablas de HR la sentencia en la que se listan los empleados con su nombre, el nombre del departamento y la ciudad, tenemos:
SELECT first_name, department_name, city
FROM employees JOIN departments USING(department_id)
            JOIN locations USING(location_id);
El total de empleados es 107, pero se listan 106 pues hay uno que no tiene departamento. Y  hay que recordad que solo se listan las filas relacionadas.

Además, del JOIN y la cláusula USING, tenemos a JOIN con la cláusula ON en la que escribimos la condición de unión similar a como se haría en el WHERE. Ésta forma nos permite trabajar con campos en los que no coincidan el nombre en ambas tablas, porque igual se debe especificar y en caso de hacer referencia a uno de ellos sí hay que anteponer el nombre de la tabla; además, tiene la misma ventaja de separar las condiciones de unión del resto de condiciones del WHERE haciendo más legible la sentencia, por lo que es la opción que yo recomendaría. A continuación las sentencias que listan a los empleados de ambos ejemplos que utilizo.
SELECT emp.nombre, emp.depid, dep.nombre, loc.nombre
FROM emp JOIN dep ON(emp.depid = dep.depid)
                    JOIN loc ON(dep.locid = loc.locid);
SELECT first_name, department_name, city
FROM employees JOIN departments ON(employees.department_id = departments.department_id)
            JOIN locations ON(departments.location_id = locations.location_id);
OUTER JOIN
Son útiles para mostrar filas que no están relacionadas, además de las relacionadas. En el ejemplo sencillo en el que Ana no se muestra, supongamos que queremos listar todos los empleados independientemente de si están o no relacionados. 
Con LEFT JOIN (LEFT OUTER JOIN) lo que indicamos es que la tabla a la izquierda es de la que quiero todas las filas independientemente de que sus filas se relacionen. El segundo LEFT JOIN es necesario pues a la primera unión vamos a relacionarla con la tercera tabla (Loc) y si es a la izquierda donde se encuentra la información que queremos listar se relacione o no. Así que, el que sea LEFT JOIN es porque tal y como se ha escrito está a la izquierda, pues si lo ponemos en otro orden y queremos los mismos resultados hay que tener en cuenta hacia qué lado está lo que queremos listar aunque no esté relacionado. Supongamos que queremos lo mismo pero escribimos las tablas en el orden inverso. Entonces en éste caso la tabla de empleados estará a la derecha por lo que la sentencia sería con RIGHT JOIN (RIGHT OUTER JOIN):
Ahora queremos todos los departamentos, que tal como podemos comprobar con los datos existe el 30 que no se relaciona. Y vamos a escribir la sentencia dejando a la tabla dep en el centro simplemente para ilustrar que hay que escribir los JOIN en función del orden en el que escribimos.
Como se puede ver se lista el departamento 30 que no tiene localidad y Ana no se muestra. Antes de que exista el estándar de 1999, que es el que utiliza la palabra JOIN, utilizando la forma antigua con WHERE se escribiría de la siguiente forma:
En éste caso se coloca un signo más entre paréntesis al campo de la tabla que queremos rellene o no tome en cuenta. Como queríamos todas las filas de Dep colocamos el símbolo a Emp y Loc. Para el caso de las tablas de HR, manteniendo el supuesto de que queremos todos los departamentos además de los datos relacionados, que son 106 filas, la sentencia en la que obtendríamos 122 filas sería:
SELECT first_name, department_name, cityFROM employees RIGHT JOIN departments ON(employees.department_id = departments.department_id)LEFT JOIN locations ON(departments.location_id = locations.location_id); 
SELECT first_name, department_nameFROM employees, departments, locationsWHERE employees.department_id(+) = departments.department_id       AND departments.location_id = locations.location_id(+);
Por último, ahora suponemos que queremos listar todos los empleados, departamentos y localidades estén o no relacionados. Entonces se nos puede ocurrir poner el símbolo (+) a ambos lados del igual. Pero, esto no se permite. Con esta sintaxis anterior al estándar del 99, se tenía que idear otra forma. Así que, sumamos otra ventaja al estándar del 99 que lo permite con FULL JOIN (FULL OUTER JOIN).
SELECT first_name, department_name, cityFROM employees FULL JOIN departments ON(employees.department_id = departments.department_id)FULL JOIN locations ON(departments.location_id = locations.location_id); 
En el caso de las tablas de HR obtenemos 139 filas. Y en nuestro pequeño ejemplo:
Como se ve en la imagen están las 3 filas que se relacionan, la empleada que no tiene departamento, el departamento que no tiene localidad y la localidad que no se relaciona, teniendo así las 6 filas que se listan. A partir de aquí, podemos mezclar por ejemplo al suponer que queremos todos los empleados y departamentos pero las ciudades nos basta con las que se relacionan, entonces tendríamos:
SELECT emp.nombre, emp.depid, dep.nombre, loc.nombre
FROM emp FULL JOIN dep ON(emp.depid = dep.depid)
                    LEFT JOIN loc ON(dep.locid = loc.locid);


Realizado con:—Oracle Database 10g
—Aplicación desde terminal SQLPLUS

Mac OS X: Renombrar varios archivos o carpetas

A partir de la actualización de OS X a Yosmite 10.10 se permite el renombrado de archivos desde el menú contextual. Es decir, basta seleccionar los archivos y dar clic derecho, para posteriormente seleccionar la opción: Renombrar N ítems...

Se despliega la sección Renombrar ítems del Finder:
En el que, por ejemplo, podemos Añadir texto, tanto antes como después del nombre del archivo.

Una segunda opción es Formato, en el que renombramos a los archivos con el texto que se desea y un número o fecha que se puede poner antes o después del nuevo nombre. Al tener la vista en lista de los archivos podemos ordenarlos por diferentes atributos como fecha de creación, etc. y luego aplicar el cambio de nombre.

Como tercera opción está el Reemplazar texto, así se permite buscar un texto y que sea reemplazado por otro que especifiquemos.

Realizado en Mac OS X 10.10.1