domingo, 25 de marzo de 2012

Historial de historiales de líneas de comando en el Bash

En Unix (Linux,*BSD, etc), sobre todo si eres un administrador de sistemas, y estas constantemente ejecutando líneas de comando en una terminal, ya sea localmente o con una conexión ssh, recordar todas las líneas de comando que ejecutaste alguna vez en tu vida, puede ahorrarte mucho tiempo y muchas leídas del man.
El BASH es uno de los shell más comunes hoy en día, y tiene su funcionalidad propia para recordar una cantidad de líneas ejecutadas, o una cantidad de KB de tamaño, para el archivo de historial.
Este por lo general se encuentra en

$HOME/.bash_history

Lo primero que había hecho, un tiempo atrás, fue aumentar la capacidad del historial, pero esto a la larga hacía que mi sesión de shell tardara más en ejecutarse, ya que el bash carga el historial en memoria, con lo cual es rápidamente accesible mediante el shorcut para el buscador: CLTR-R.
Esto me permitía buscar entre los comando recientemente ejecutados, todos aquellos que estaban en el history actual.
El problema se presentaba cuando este archivo llegaba a su máxima capacidad y se empezaba a peder el historial de los comandos más antiguos.
Fue entonces cuando decidí crear esta pareja de scripts, que guardan un historial de historiales.
Te recomiendo colocarlos en una ruta bajo tu path de ejecución. Yo lo tengo en  /usr/local/bin

-- inicio de  /usr/local/bin/backup-historial.sh --

#!/bin/bash
#
# Copia el historial y luego crea un archivo sin duplicados
# desde donde luego se puede consultar con el comando Buscar.sh
#
# Se recomienda colocar la ejecucion de este script al final del\
# $HOME/.bashrc y al final  del $HOME/.bash_logout de esa forma,
# se persisten la mayor cantidad de comandos
#
# Este es un shell script gratuito distribuido bajo la licencia
# GNU GPL version 3.0
# Copyright (C) 2012 Ale Feltes
#
# alefeltes \en\ gmail \punto\ com
#

#la fecha en formato AAAA-mm-dd
STAMP="`date +%F`"

#el directorio bajo el $HOME donde se guardan los historicos
DIR="$HOME/sysadmin/historicos-bash"
if [ ! -d $DIR ]; then
    mkdir -pv $DIR
fi

#copiamos el historial actual, con la fecha actual
cp -vf $HOME/.bash_history $DIR/history-${STAMP}
cd $DIR

#concatenamos todos los historiales, ordenamos y eliminamos
#duplicados
cat history-* | sort | uniq   > /tmp/history-global-$UID

#finalmente movemos al archivo unico con el $UID
mv -vf /tmp/history-global-$UID .

-- fin de  /usr/local/bin/backup-historial.sh --

Para el script que consulta los historiales, utilizo la primera letra en mayúscula, para facilitarme el autocompletado con el TAB

-- inicio de  /usr/local/bin/Buscar.sh --

#!/bin/bash
#
# Busca en el history del bash una cadena
#
# Este es un shell script gratuito distribuido bajo la licencia
# GNU GPL version 3.0
# Copyright (C) 2012 Ale Feltes
#
# alefeltes \en\ gmail \punto\ com
#

#buscamos en el historial actual y en el historial general guardado
#con el script /usr/local/bin/backup-historial.sh
cat $HOME/.bash_history $HOME/sysadmin/historicos-bash/history-global-$UID \
    | grep $1 | sort | uniq
-- fin de  /usr/local/bin/Buscar.sh --

Como se puede leer en el primer script, es recomendado que lo coloques en los archivos  

$HOME/.bashrc : para que se ejecute cada vez que abras un shell, y en el $HOME/.bash_logout : para que se ejecute y haga la copia del historial, cada cierre de sesión de un shell.


sábado, 3 de marzo de 2012

Velocidad real de un Pen Drive USB 3.0

Hace poco perdí la paciencia con un pen drive que ya tiene sus años. Los tamaños de las cosas que copiamos, han crecido. Es normal copiar varios cientos de megas, a diario, o si tenés que mover un disco duro de una máquina virtual, estamos hablando incluso de gigas que copiar o mover.
La velocidad de la que hablan los fabricantes, en términos de ancho de banda, tiene algo que ver con la velocidad real, la que a la mayoría nos interesa. Como cualquier velocidad de transferencia, hay varios factores que considerar, algunos relacionados con la calidad de los materiales del dispositivo y de la calidad del equipo que lo va a leer.
Si los equipos son de mala calidad, pueden tener el sello de USB 3.0, pero si su tasa de error es alta o el tiempo de respuesta de las operaciones de E/S es muy lento, la velocidad que publicita el fabricante sirve sólo "para la foto". Me viene a la memoria, esos teléfonos inalámbricos de principios de los 90, que decían tener un alcance de 100m., pero en ningún lado decía que eso era sólo en caso de que estés usando el teléfono en una sabana.  
En el ancho de banda también hay algo "escondido", ningún fabricante aclara que dentro de ese ancho de banda, hay un porcentaje que se destina a la comprobación de lo que se transfiere. No te están mintiendo, pero tampoco te están diciendo toda la verdad.
¿Alguna vez calculaste en una planilla electrónica la velocidad teórica de tu conexión de internet, y te preguntaste por qué nunca obtienes lo que dice la teoría?
Uno de los motivos, es por la comprobación/correción de errores, una funcionalidad básica de cualquier protocolo de transferencia de datos.
Si sólo estás descargando algo, y tienes 1Mbit. la teoría dice que deberías obtener aprox. 122KBytes/s, pero la realidad dice otra cosa. Ese porcentaje "perdido", se utiliza en realidad para la comprobación/detección/corrección de errores. Por eso es que aunque sólo estés descargando algo, siempre hay un tráfico de subida, de todos los acknowledgement de recepción que tienen que enviarse, durante la transferencia  (aún en el siguiente escenario teórico, en el que no tengas errores de transferencia o estos sean insignificantes).
El USB 2.0 estándar, puede tardar hasta 5 minutos para llenar un pen drive de 1GB.
Eso es aprox. 30Mbit/s, si le sumamos un porcentaje aprox. de 5% utilizado para la comprobación de errores.
Eso es más que el USB Full Speed (12Mbit/s) y bastante menos que el USB 2.0 Hi-Speed (480 Mbit/s), cuyo ancho de banda se supone de 60MB/s. Más información en : http://en.wikipedia.org/wiki/List_of_device_bit_rates#Peripheral 
La última notebook que compré, ya viene equipada con un puerto USB 3.0, que lo puedo experimentar a diario porque tengo un disco duro externo USB 3.0. En la búsqueda por un pen drive USB 3.0, que me dé una relación interesante de costo/beneficio, investigué las opciones.
De las marcas que encontré, con buenos reviews las opciones eran: Patriot, LaCie, Corsair, Kingston y Transcend.
La característica principal, que me hizo decidir por uno u otro, fue el tamaño. Al ver las fotos en los reviews, los únicos que tenían las dimensiones para no obstaculizar los puertos aledaños que quedaron de la lista fueron dos: Patriot y Trascend. Los demás eran o muy anchos, o muy gordos para que pueda ser ocupado el puerto usb, en la posición que fuera este ubicado horizontales o verticales, lo cuál me hubiera obligado a tener que usar con un cable de extensión.
Finalmente me decidí por un Transcend TS16GJF760 JetFlash 760 16GB USB 3.0 Flash Drive.
La otra opción era un Patriot Supersonic 32 GB USB 3.0 High Performance Shock Resistant Flash Drive PEF32GSUSB , de aluminio, bastante más costoso, pero no tenían en stock para la venta en Amazon, y el tiempo de espera era de 1 a 4 semanas.
Aquí están los resultados de los benchmarks en el puerto USB 3.0:


Aprox. 54MBytes/s para lectura; y para escritura 22.7MBytes/s como máximo y  un promedio de 7.4 MBytes/s.
Este es el gráfico de rendimiento del mismo pen drive, en un puerto USB 2.0

Pero lo más interesante, fue una prueba de la vida real.
Lo que te muestra el programa que copia, es una cosa, pero el tiempo en que tarda realmente en hacer toda la copia al dispositivo, es otra.
Para eso, en linux se puede hacer la copia, y luego desmontar el dispositivo, y recién cuándo el comando de "umount" termina, es que la copia fue terminada.
Para eso hice este pequeño script:

--inicio script--

cp -v disk1.vdi /media/pen-16G
umount /media/pen-16G

--fin script--

Tamaño del archivo: 2185252864 bytes (2084 MB)

user@host ~/prueba $ sudo time sh -x test
+ cp -v disk1.vdi /media/pen-16G
`disk1.vdi' -> `/media/pen-16G/disk1.vdi'
+ umount /media/pen-16G
0.01user 6.85system 2:11.39elapsed 5%CPU (0avgtext+0avgdata 4272maxresident)k
1234608inputs+4272288outputs (0major+923minor)pagefaults 0swaps

Velocidad real. 2min. 11 seg. para copiar 1 Archivo de 2G:  15.86 MB/s

jueves, 1 de marzo de 2012

PostgreSQL vs. Oracle

PostgreSQL vs. Oracle(TM) - Bases de Datos Cerradas vs. Bases de Datos de Software Libre
Le titulé de esa forma, por una cuestión de prensa :), aunque puede parecer una comparación de potencias, intentaré presentar los argumentos necesarios como para que vos puedas tomar la decisión por tu cuenta. Mencionaré también algunas experiencias con Firebird, que es una excelente base de datos, de software libre. Cuándo me refiero a Software Libre, me refiero a un programa distribuído bajo una licencia aprobada por la Free Software Foundation. http://www.gnu.org/licenses/license-list.html#SoftwareLicenses
Tampoco voy a hablar de performance, porque existen múltiples formas de lidar con problemas de performance, y en mi experiencia la mayoría de las veces, el problema principal no es el motor o el server de la base de datos, sino el diseño y la programación del sistema que utiliza el servicio. Pero no voy a entrar en muchos detalles sobre eso.
Oracle es probablemente la mejor base de datos del mundo (por ahora), no estoy contando nada nuevo con eso. Pero la pregunta que debes hacerte es ¿Realmente necesito Oracle? o mejor aún ¿Para el uso que voy a darle a la base de datos, mi presupuesto justifica que yo gaste en las funcionalidades extraordinarias del Oracle (que por cierto tiene también un precio extraordinariamente alto)?
La respuesta corta y rápida, que me animo a decir es que en la gran mayoría de los casos, no existe una justificación para pagar decenas de miles de dólares de licencia, cuándo hay alternativas gratuitas de excelente calidad y muy confiables.  
Citando a Bruce Perens, un ícono del movimiento Open Source:
"Un orador que emplea el término "comercial" como antónimo de software libre es probablemente alguien que no entiende lo suficiente aún de cómo funciona el software libre. Y alguien que no entiende los fundamentos de cómo se rige el software, estará constantemente confundido acerca de lo que controla tantos dispositivos en el planeta. Tenga cuidado con esas personas que tienen una falta entendimiento básico; es muy poco probable que le den un buen consejo de cómo elegir un software o para tomar buenas decisiones a cuestiones relacionadas con software. " http://www.dwheeler.com/essays/commercial-floss.html
Existen múltiples ejemplos de software libre con éxito comercial.
Cuándo tu única herramienta es un martillo, todos los problemas parecen clavos. Si vas a tomar una decisión empresarial importante, debes estar bien informado, y no escuchar sólo al dueño del martillo.
El hecho de que PostgreSQL o Firebird sean software libre, no significa que sean exclusivamente gratis, o porque se puede conseguir gratis, sean un producto con poca seriedad. Hecha la aclaración, y para no desviar demasiado el tema hacia Software Libre vs. Software Cerrado/Privativo. Sigo con el discurso sobre las bases de datos.
Siguiendo parte del análisis que propone Perens en http://www.dwheeler.com/oss_fs_eval.html
Aquí hay una buenísima comparación de funcionalidades entre Oracle y PostgreSQL: http://www.scriptol.com/software/oracle.php
 
1) Identifica los candidatos
Oracle, DB2
PostgreSQL, Firebird


2) Lee reviews existentes de los productos, de sitios, proyectos o empresas que tengan un negocio parecido al tuyo o al de tu cliente.

3) Brevemente compara las características principales que necesitás de la Base de Datos.
3.1) Funcionalidades
Si eres una empresa que pagará por una solución, pide a tu consultor informático que te detalle específicamente que funcionalidades espera del motor de base de datos. Si lo utilizará sólo de repositorio, para almacenar y recuperar datos, y no precisa de lujosas o complicadas funcionalidades, es probable que puedas ahorrarte dinero en licencias del motor, y puedas invertirlo en otras cosas que mejoren la calidad de los servicios de los que depende tu negocio o el de tu cliente. Por ej. un Data center alternativo, o un backup remoto, o profesionales reconocidos y con experiencia, por citar algunas.
En el caso de los productos cerrados, como Oracle, asegurate bien del costo que tendrá la licencia que debes adquirir, y cuánto te costará ampliar cuándo tu negocio crezca y tengas que ampliar la capacidad. No te dejes engañar por las versiones "Express" o "Embedded" o cualquiera que te cueste poco o nada inicialmente, porque vienen con muchas restricciones de tamaño de la base de datos, cantidad de procesadores que puede utilizar y por lo general tiene un montón de funcionalidades recortadas, que nadie te cuenta al inicio.Y si te salen con el cuento de que "no vas a necesitar más que eso" te está queriendo vender un caballo de troya. Hoy en día es moneda corriente los procesadores de múltiples cores, tener un motor de base de datos que no los aproveche es como tener una aire acondicionado de múltiples compresores y sólo usarlo en modo ventilador.


3.2) Costo
Los productos cerrados comerciales (Oracle, DB2(TM), etc. ) utilizan una conocida técnica de las grandes empresas, de hacer tan complicado su esquema de licencias como para que uno no pueda fácilmente determinar el costo real que necesita para su solución.
Asegurate de conocer el precio para la solución completa, incluso antes de aceptar el "regalo" de una versión demo o lite o express, para que "ya puedas iniciar tu desarrollo". El precio de Oracle, es lineal a la cantidad de procesadores.  http://www.oracle.com/us/corporate/pricing/price-lists/index.html
En el caso de las bases de datos de Software Libre (PostgreSQL, Firebird, etc.), siempre tendrás una opción de descargarlas y utilizarlas sin costo. Y también tendrás las opciones de  contratar soporte comercial para algunos de los motores. 

3.3) Market share
Oracle tiene un mercado muy grande, pero como leí en una discusión https://developers.slashdot.org/story/06/04/06/1828206/Oracle-and-PostgreSQL-Debate
"90% de la gente que lo usa, no lo necesita. 100% de ese 90% están o le han convencido de que sí lo necesitaban"
PostgreSQL, es probablemente la base de datos más completa, de las que tienen licencia de Software Libre, y por ello, su mercado está creciendo cada día. Más aún luego de que Oracle se hizo dueño de MySQL, la otra que tenía también un mercado muy grande, pero que cada vez más apunta a convertir su modelo de licenciamiento, hoy en día ya hay versiones community, developer, enterprise, etc..
Firebird tiene también una comunidad muy importante de usarios en el país, conozco dos consultoras nacionales exitosas, que lo utilizan desde hace al menos 8 años, con múltiples clientes en el sector privado, y hablan maravillas sobre todo de su lenguaje para elaborar procedimientos almacenados. Además en el Brasil está una de las comunidades más grandes de usuarios, y el motor tiene un activo desarrollo y hay disponible mucha documentación y libros al respecto.
3.4) Soporte. Posiblemente el punto más delicado a evaluar.
  • Soporte puede referirse a personas en el ámbito local con conocimientos.
  • Cantidad de documentación en línea o en libros.
  • Cantidad de tutoriales de puesta en marcha rápida.
  • Cantidad de sistemas operativos en los que puedo ejecutar, etc.
  • Empresas que puedan vender soporte profesional. Ojo con este punto, he tenido muy malas experiencias con ciertas marcas de productos, porque a pesar de tener representación local, no tienen técnicos bien preparados disponibles, y te terminan derivando por teléfono a alguien fuera del país, o te dan acceso al sistema de tickets de la empresa. En el 90% de los casos, terminábamos resolviendo el problema antes de que el ticket fuera resuelto, gracias a investigaciones y consultas en foros o listas de correo en internet. Evalúa bien si lo que necesitas es alguien que te resuelva problemas o alguien a quién hechar la culpa si algo pasa. Si es lo segundo, lee detenidamente la licencia, porque casi ninguna empresa se hace responsable por pérdida de datos en casos excepcionales. El representante vendedor, rara vez es también quién te vende la solución, o sea el desarrollo. Si vas a dejarte convencer por el vendedor, de que si querés calidad, tenés que pagar por eso, y especialmente si  viste  a programadores de un sistema, con menos de 25 años haciendo todo el trabajo pesado y al personal de experiencia aparecer sólo cuándo las papas queman y hay problemas graves que arreglar, sabrás de lo que te estoy hablando. Si vas a pagar mucho dinero por una Base de Datos, asegurate de que tu proveedor también pague mucho dinero por su equipo de desarrollo, de lo contrario es como tirarle perlas a los chanchos. Pide gente con título universitario de ser posible de una universidad reconocida por su calidad, y EXIGE gente certificada en la herramienta, por algo te están haciendo comprar algo caro y de calidad muy superior (según el vendedor), y asegurate de que trabajen en el proyecto, es muy común poner nombres en la planilla y luego nunca verles la cara en los momentos de desarrollo. Si comprarás un auto de lujo, ¿dejarías que gente no autorizada por el fabricante, trabaje por tu vehículo? 
No estoy diciendo de que sea la única forma de trabajar, he visto muchos proyectos exitosos con Software Libre y jóvenes trabajando en ellos, pero si vas a entrar en la temática de que "sólo si es caro, es de buena calidad", al menos exige a tu consultora o proveedor que sea coherente, y tenga personal certificado en las herramientas y productos por el que te está haciendo pagar licencias.

PostgreSQL tiene sponsors de la talla de Red Hat, HP, Skype, Fujitsu, por citar algunas de las empresas más conocidas. Más información en http://www.postgresql.org/about/sponsors/

PostgreSQL es un proyecto que tuvo un progreso asombroso desde la versión 8.x en adelante. Basta mirar con las funcionalidades nuevas que fueron incorporando, para comprobarlo:
http://www.postgresql.org/about/featurematrix/

Algunos usuarios de PostgreSQL (http://en.wikipedia.org/wiki/PostGres#Prominent_users)

Aquí hay una presentación hecha en  el Free Software Asunción 2011: "El Elefante de las Grandes Ligas" , realizada por Pablo Santa Cruz, una de las personas que más sabe de PostgreSQL en el Paraguay, hay un apartado dónde habla de los casos de éxito en nuestro país. http://blog.roshka.com/2011/09/postgresql-el-elefante-de-las-grandes.html

Firebird puede manejar bases de datos de Terabytes de tamaño http://www.ib-aid.com/articles/item104

Firebird on large big iron servers : 512G-2TB of ram 100.000 concurrent users http://www.firebirdnews.org/?p=6797  

"Bases de datos de juguete", "escarabajo vs. mercedes", yo que vos consideraría seriamente cambiar de consultor informático, si te sale con argumentos tan poco profesionales como esos o por lo menos enviarle a su cucha a investigar un poco más de la realidad actual de las alternativas de Software Libre.

Oracle es una marca registrada de de Oracle Corporation.

DB2 es una marca registrada de International Business Machines Corp.