lunes, enero 30, 2006

La utilidad de md5

El md5 es un algoritmo que calcula el hash de una “cadena”. El hash es representado por una cadena alfanumérica de 32 caractéres (de WebExperto).
Un hash es un método “… para generar claves o llaves que representen de manera unívoca a un documento, registro, archivo, etc…” (de la wikipedia).

El uso de md5 es para generar un identificador de cualquier archivo, así al descargarlo, calcular el md5 y compararlo con el que se encuentra en el lugar de descarga; si el calculado es diferente del publicado, se considera que el archivo esta corrupto y se debe descargar nuevamente.

Es común encontrar los md5sum publicados para los isos de las distribuciones Linux, que se pueden descargar desde la Internet. Aunque como se ha publicado en muchos sitios, es posible que se presenten colisiones(1) en los md5’s, por lo que esta entrando en desuso y se recomienda utilizar otros algoritmos más seguros (como sha1).

A pesar de que md5 presenta colisiones y existen otras alternativas a su uso; es útil de manera personal, porque permite calcular el hash de nuestros archivos que nos interesa transportar o de nuestros respaldos; con el propósito de tener una referencia, entre la copia generada y el original.

Si al colocar la copia en otro medio, el hash calculado es diferente a la referencia, sabremos que el archivo no es útil y que es necesario generar otra copia.

En las distribuciones Linux se calcula con el comando md5sum:

>$ md5sum mi_archivo

generando una salida como la siguiente

d41d8cd98f00b204e9800998ecf8427e mi_archivo

Particularmente el md5 lo empleo en mis archivos de respaldo, que anexo al grabarlos; para tenerlo de referencia.

También me sirve para determinar si de un respaldo a otro la información ha cambiado; si el md5 es idéntico para dos respaldos hechos en diferente fechas, es porque no se ha modifcado información enter una fecha y otra.

Si el archivo se quiere distribuir, recomendo mejor el uso de otros algoritmos, como el sha1.

viernes, enero 27, 2006

La utilidad del código fuente en el software libre

Cuando se habla de software libre y las ventajas para el usuario, en ocaciones aparecen retractores, que manifiestan la nulidad de ventaja en el acceso al código fuente.

Esta conveniencia, realmente no ofrece una ventaja para todo usuario, porque ningún está obligado a saber programar (aunque saberlo no está de más). Por lo que el código fuente termina siendo un misterio para aquellos que no les interesa la programación de software.

Sin embargo, la razón por la que se considera tan importante el código fuente en el software libre (además de ser una de las razones del nombre), es en principio histórica. Richard Stallman, que inició el movimiento del software libre (GNU), consideró como vital el poder contar con el código fuente, para poder adaptarlo a sus necesidades, y ha luchado porque todo aquel que quiera, disponga del software libre.

El disponer del código fuente aunque no útil a todos, si lo es para un número considerable de personas, que cooperan modificandolo, corrigiendolo, extendiendolo y creando nuevos proyectos. Lo que permite que el software libre siga existiendo.

El poder acceder al código fuente, permite aprender de otros, saber como funciona el software que se usa. No partir desde cero cuando se quiere realizar un software particular.

Se puede hacer la analogía del código fuente con una biblioteca pública, cualquiera puede ir, aunque no a todos les resulta comprensible todos los temas de todos los libros, pero para el que le interesa solucionar un problema o aprender, están a su disposición para su consulta. La diferencia reside en que la experiencia acumulada, no se puede agregar a los libros.

No para todos los usuarios finales el código fuente del software libre es útil, pero es importante para que siga existiendo.

martes, enero 17, 2006

Las computadoras personales, un “electrodoméstico” más.

La participación de las empresas influyen en la vida de un producto, modificando el ciclo de vida del producto; favoreciéndolo o perjudicándolo.

Las computadoras han sufrido ambas influencias.

Por un lado, al involucrase las empresas en la fabricación y ventas de equipo e incrementar la oferta, los costos de las computadoras disminuyen y se hacen accesibles para el común de la gente.

Por otro lado, el propósito principal de las empresas es generar ganancias, y para ello necesitan generar ventas; así que crean necesidades en los consumidores, para que adquieran los productos, transformando la funcionalidad original. En este sentido, las compañías ofrecen más características y funciones en las computadoras, mostrándolas como centros de entretenimiento.

Esas nuevas funcionalidades agregadas a las computadoras, como ver dvd’s, escuchar cd’s, jugar, navegar por la Internet y un conjunto más de características lúdicas, dan la idea de que una computadora puede tenerse en casa, como un electrodoméstico común, equiparable a un televisor o un mini-componente.

Como consecuencia de apreciarlas desde esta perspectiva, surgen varios inconvenientes, entre ellos, el subestimar la complejidad de la pc; creando la idea de que no es necesario conocer mucho sobre ellas.

Considerar que una computadora es fácil de operar, repercute en la manera de como se utiliza, y en la importancia que se le da a varios elementos que la conforma, entre ellos el software, particularmente el S. O.

Por ejemplo, una vez que se compra un televisor, no hay que preocuparse por actualizarle algún parche de seguridad, alguna pieza, o elemento; mientras que en una pc, son detalles que los usuarios deben tener presentes, pero que pocas veces se ocupan de ello; consecuentemente muchos bichos (malware, spyware, etc), se aprovechan de ese desinterés para propagarse.

Otra consecuencia de no apreciar el potencial completo de la pc es que se subutilice, realizando actividades que pueden hacer otros electrodomésticos especializados (como ver dvd’s), y que no requieran el uso exhaustivo de toda la máquina.

Muchas computadoras se deshecha, porque una nueva característica, de algun periférico o software requiere algun elemento, que la pc no tiene, y que no se le puede agregar. Por ende, se cambia por una nueva, aunque se siga usando para realizar las mismas cosas que se hacian con la pc anterior; aún cuando la vieja pc, sigue haciendo bien el mismo trabajo para la que ha sido usada siempre.

jueves, enero 12, 2006

Representación de matrices dispersas de "gran" tamaño

Para representar matrices dispersas de gran tamaño, existen diferentes formatos, que tiene por finalidad el reducir al máximo el consumo de memoria.

Aquí hablaré sobre el formato estándar de almacenamiento por filas CSR (Compressed Row Storage), que utiliza un escalar y tres vectores para el almacenado de la matriz. Los nombres de los vectores (para la explicación), son: IA, JA, y AA. El escalar se denomina n y es el número de renglones de la matriz.

El vector AA contiene a todos los elementos [a]ij diferentes de cero guardados renglón a renglón, de 1 a n; y su longitud es Nz.

El vector JA contiene los índices de las columnas de los elementos [a]ij, almacenados en AA, y su longitud es Nz. Existe una correspondencia uno a uno entre los elementos de JA y AA. El elemento JA(i) > 0 y pertenece a los naturales.
El vector IA contiene los índices que indican el principio de cada renglón en los vectores JA y AA. El elemento IA(i) es la posición en JA y AA donde el i-esimo renglón comienza. Su longitud es n + 1. El elemento IA(n+1) es igual a Nz+1. Es importante notar que esté último elemento corresponde al comienzo de un renglón ficticio n + 1.

A partir de los elementos del vector IA, se pueden determinar cuantos elementos diferentes de cero contiene cada uno de los renglones. El primer elemento de IA es 1.

Nz no se requiere almacenar de manera explicita, porque se puede obtener a partir de restarle uno al elemento IA(n+1), que indica el número total de elementos en la matriz que son diferentes de cero.

Este tipo de representación de matrices tiene una gran importancia en el computo cientifico, porque los sistemas de ecuaciones pueden ser representados por matrices, y muchos de los sistemas que se utilizan contienen una gran cantidad de incognitas, que generan matrices con miles o incluso cientos de miles de elementos; y en muchas ocaciones las matrices son dispersas, así que no tiene sentido almacenar de manera identica una matriz.

Lo habitual cuando se utilizan matrices pequeñas es utilizar arreglos de dos dimensiones, pero se puede ver que la cantidad de memoria ocupada, crece mucho más rápido, a medida que se aumenta linealmente el tamaño de una de las dimensiones. Y no tiene sentido cuando muchos de esos valores contenidos en la matriz son ceros.

Si desean más información sobre sistemas lineales dispersos y representaciones, visiten el sitio de Yousef Saad

martes, enero 10, 2006

Desarrollo de software de manera cooperativa

El desarrollo de software libre es posible gracias a la cooperación de miles de voluntarios en todo el mundo, que dedican parte de su tiempo a la creacion, modificacion, compilacion o auditoria de codigo fuente (entre otras cosas).

Pero esto es posible gracias a herramientas que permiten la administración de código y la modificacion de manera cocurrente del mismo; ejemplo de ellas son cvs o subversion, que son libres, aunque también las hay privadas.

De manera muy general, existe un servidor (denominado repositorio), en donde se encuentra hospedado todo el proyecto (el código fuente), y los clientes se conectan al repositorio para obtener una copia parcial o total del proyecto. A partir de la copia local se pueden realizar cambios y pruebas al codigo fuente. Y una vez que se ha completado el proceso de edición del código, las modificaciones se reportan al servidor, que determina si proceden ó hay colisiones ó si hay necesidad de mezclar código, con alguno otro modificado al mismo tiempo.

Ahora bien, estas herrmientas no exclusivas para grandes proyectos, o de trabajos de grupo, pues se puede instalar un servidor de subversion o de cvs de manera local, y usarlo para adminstrar codigo fuente particular.

Para saber más sobre el uso de cvs puedes ver el documento de Ismael Olea que me parece es bastante bueno para empezar:

http://olea.org/manuales/como-empezar-cvs/

miércoles, enero 04, 2006

Creando respaldos en GNU/Linux

Existen aplicaciones privadas, que fungen como herramientas para la realización de respaldos, pero que tienen un costo monetario por licencia de uso.

Sin embargo, esas sofisticadas herramientas de respaldo no son necesarias para un usuario promedio de un *nix, porque cuenta con varios programas que en conjunto, pueden realizar las mismas actividades.

Algo importante a considerar, al comenzar a utilizar un sistema recien instalado, es la creación de directorios, que su uso sea exclusivo para almacenar nuestros archivos que deseemos respaldar. Esto con el propósito de facilitar el proceso de creación del respaldo

Después, es bueno crear políticas de respaldo, que contemple los elementos que se desean respaldar y con que frecuencia. Así como un calendario donde registrar los días para realizarlo.

Para un sistema con varios usuarios, requiere considerar más detalles.

Los comandos que requerimos son: tar y un programa para comprimir archivos, como gzip o bzip2.

El comando tar básicamente "empaqueta" todos los archivos y directorios en uno solo, su nombre es la contracción de "type archive", y se utilizaba para generar archivos de respaldo que eran colocados en cintas. Las banderas más utilizadas son c para crear, r para agregar archivos a un "paquete", x para extraer los archivos de un "paquete", v para que despliegue lo que hace, y f para utilizar un archivo, que es el resultado de la ejecución del comando tar, el "paquete". Su sintaxis:

tar <opciones> <archivo-resultado>.tar <directorio-a-empaquetar>

Existen varios comandos para comprimir archivos, de los más conocidos son gzip y bzip2, escoger uno u otro depende de las necesidades del responsable de hacer los respaldos; mientras que gzip es más rápido, bzip2 tiene un mejor algoritmo de compresión, con lo que la elección está entre velocidad o tamaño de archivo final.

Ambos comandos se pueden integrar fácilmente al comando tar mediante las banderas z y j, para gzip y bzip2 respectivamente. El uso de estas banderas implica agregar al nombre del archivo tar, la terminación .gz si se usa gzip o .bz2 en caso de usar bzip2.

He aquí un ejemplo sencillo:

>$ tar -cjvf mi_respaldo.tar.bz2 /home/mi_usuario

En este ejemplo se crea un archivo llamado mi_respaldo.tar.bz2 que contiene todos los archivos y directorios a partir de /home/mi_usuario, que es comprimido con bzip2

Si se han de agregar más archivos o directorios a un archivo *.tar, es recomendable no comprimir, hasta no terminar el proceso de "empaquetado"

>$ tar -cvf mi_respaldo.tar /home/mi_usuario/un_nivel/directorio_uno
>$ tar -rvf mi_tespaldo.tar /home/mi_usuario/otro_nivel/directorio_dos/directorio_tres

En este ejemplo se crea un archivo mi_respaldo.tar que contiene unicamente lo que haya en directorio_uno y en directorio_tres

Siguiendo el ejemplo, podemos al final comprimir.

>$ gzip mi_respaldo.tar

Obteniendo un archivo mi_respaldo.tar.gz