Hace poco, me decidí a probar Fedora, luego de que tanto la llame la distro de niñitas, jaja, bueno realmente a diferencia de ubuntu y otras emo-debian-derivadas, Fedora, me ha sorprendido, cuenta con una comunidad activa y cálida, así como una estabilidad sorprendente (y eso que estoy usando una versión beta).

Así que me dispuse a resolver mi primer problema, la falta de soporte MP3 (a raíz de que es un formato privativo),leí bastantes posts en google, que hablaban de como lograr ese soporte, y luego de casi dañar mi árbol de repositorios por seguir ciegamente pasos por Internet, creo que he dado con el clavo.

Lógicamente en los repositorios de Fedora no encontramos los paquetes RPMS para soporte mp3, asi que debemos añadir un repositorio adicional, en mi caso fue Rpmfusion.

Para ello me dirigí a la sección http://rpmfusion.org/Configuration y luego de seleccionar mi sistema (Fedora Alpha, Beta, Rawhide) se descargaron en mi PC dos RPM, con los archivos del repositorio de Rpmfusion. El cual procedí  a instalar por consola de la siguiente forma:

#rpm -ivh rpmfusion-free-release-rawhide.noarch.rpm

#rpm -ivh rpmfusion-nonfree-release-rawhide.noarch

Una vez realizado eso podemos instalar los paquetes para soporte MP3, en mi caso uso Kde e instale los paquetes gstreamer-plugins-* ..

yum install gstreamer-plugins-*

Ya con eso debería bastar.. :D (para Rhythmbox), sin embargo, amo amarok como reproductor para linux, así que me dispuse a averiguar como hacerlo con amarok, por mas que googlee no conseguí la manera de hacerlo, hasta que tatica (la amo por esto jaja) me dio la siguiente sugerencia.

yum groupinstall sound-and-video

Eso deberia instalarles un grupo de paquetes, entre los cuales esta el soporte para mp3 de amarok!! y vuala!! ya escucho mis mp3 en amarok!

Dsculpen si es muy obvio, pero es primera vez que uso Fedora, así que quise publicar mi primer pasito en esta nueva distribución y gracias a Tatica, siempre brindando su apoyo.!!

Quizás no haya un tema que más controversia traiga en el mundo de los programadores como la inteligencia artificial, ¿Porqué decimos esto? El ser humano siempre ha sentido la necesidad de crear cosas, desde un simple juguete, hasta maquinas complejas, pero a medida que crea y crea cosas, nos sentimos frustrados ante la incapacidad que tenemos de crear inteligencia, parece que el secreto se nos escapa de las manos, con esta breve introducción pasaremos a analizar uno de los algoritmos mas interesantes que pueden existir: Los algoritmos genéticos. En su libro Inteligencia Artificial, el Dr. Nicolas A. Landa nos introduce al concepto de algoritmos genéticos:

“Los algoritmos genéticos provienen de un área de la inteligencia artificial conocida como computación evolutiva y están inspirados en la forma en que trabaja la evolución en la naturaleza”

Aunque particularmente soy de los que defienden el creacionismo, es interesante el enfoque u origen de este algoritmo, así que dicho en otras palabras, a través de los algoritmos genéticos se logra representar en un modelo computacional lo que supuestamente sucede en la evolución. La teoría evolutiva sostiene que los organismos que tienen ventajas evolutivas están destinados a predominar, ya que les permite reproducirse mas que aquellos organismos que carecen de tales ventajas. Los organismos mejor adaptados pasaran sus genes a la siguiente generación y esta estará mas adaptada y así sucesivamente, la evolución sera un paso gradual, he aquí donde se introduce un concepto fundamental de esta teoría: la mutación. Aunque no quisiera dar un repaso de biología, es necesario para comprender las bases que sustentan este algoritmo, comencemos con un elemento importante e indispensable en todos lo seres vivos.

Veamos los distintos conceptos que hayamos en el libro Inteligencia Artificial:

ADN: “Es una molécula [...]Contiene las instrucciones y la información necesaria para el desarrollo y el funcionamiento de los seres vivos. [...] El ADN esta organizado en cromosomas. Los diferentes organismos tienen distintas cantidades de cromosomas.”

CROMOSOMAS: “ Éstos son moléculas de ADN muy largas, y podemos considerarlos como una unidad organizada dentro de la célula. Los cromosomas son diferentes entre los organismos, y sus longitudes también pueden variar. [...] El cromosoma esta compuesto por diversos genes”

GENES: “[...] Contienen información sobre la herencia genética del individuo y determinan o influencian la forma en la que se comportará y se desarrollará. Además, pueden interactuar entre ellos y se consideran como la unidad de herencia. El gen está construido por los nucleótidos, los cuales son compuestos químicos. Los nucleótidos son: adenina, guanina, citosina y tiamina. Según la forma como estos se químicos estén combinados y agrupados, la información de guarda en el gen. ”

Una vez repasado estos conceptos (pueden buscar más información sobre el ADN) podemos comenzar a codificar un cromosoma en el ordenador. Si pensamos en la función de un algoritmo, la cuál es resolver problemas, podemos entonces decir que el cromosoma representara una solución posible al problema que estemos resolviendo. ¿Como se puede codificar el cromosoma? A través de una arreglo. Veamos un ejemplo de un arreglo de ocho (8) posiciones que representaría a un cromosoma con cinco (5) características: 01010111 En este caso cuando un característica esta activada, la posición de arreglo correspondiente se coloca uno (1), sino se encuentra activada se coloca cero (0). Al igual como señala la teoría evolutiva, el organismo con mejores características sera el organismo mas adecuado para sobrevivir, en los algoritmos genéticos las características señalaran cierto desempeño, si estas son útiles para resolver el problema en cuestión, entonces consideraremos al individuo con esas características como una posible solución.

Ahora bien, en su libro Inteligencia Artificial el Prof. Landa indica que la codificación del cromosoma puede variar según el propósito de la aplicación que estemos realizando:

“A veces nos conviene tener más información del cromosoma para que no solamente nos indique si se tiene determinada característica, sino también cómo es tal característica. Por ejemplo, en el cromosoma, podemos colocar un valor bool si el organismo tiene visión o indicar con un valor double el rango de la visión. La forma como llevemos a cabo esta codificación dependerá del tipo de aplicación que se esté creando” (Cursivas nuestras).

Cuando el programa se inicia, de manera aleatoria se crea un conjunto de individuos cuyos cromosomas poseen características al azar. Siguiendo el modelo de la teoría evolutiva, el siguiente paso en el algoritmo, es un ciclo donde se revisa cada cromosoma y se verifica su grado de adaptación, posteriormente se dejan a aquellos individuos que posean los cromosomas con el mejor grado de adaptación. Después se procede a un cruce, lo que en la naturaleza es la reproducción, entre los organismos cuya adaptación sea mejor, para que la siguiente generación tenga mejores o iguales características adaptativas. El fin del ciclo evolutivo llegara cuando se encuentre un individuo cuyas características sean adecuadas para el problema que estamos planteando.

El Prof. Landa nos sigue sumergiendo en cada uno de estos pasos, veamos a que nos referimos con  nivel de adaptación:

“[...] Cada organismo puede tener una variable, y el valor de esta variable será el grado de adaptación o de éxito que tiene el individuo. La forma como se calcule ese valor dependerá de cada aplicación. Entonces, debemos preguntarnos cuáles son las cualidades que consideramos mejores dentro de nuestro algoritmo. Por ejemplo, si el sistema necesita mantener un dispositivo a una temperatura en particular, los cromosomas que den comportamientos que lleven a valores cercanos a esa temperatura serán los mas exitosos.” (Cursivas nuestra).

Ya analizado el primer paso, podemos pasar a la selección de los individuos que serán los padres de la siguiente generación. Para la selección mencionare varios métodos principales:

Elitismo: Este método de selección consiste en agarrar a los dos organismos con mayor grado de adaptación y combinarlos para dar resultado a una nueva generación, los demás individuos con un grado de adaptación inferior al de la pareja escogida es descartado. Este método sin embargo es muy poco usado, ya que aunque aumenta el desempeño del algoritmo, tiende a llegar siempre a un óptimo local, descartando posibles soluciones óptimas.

Ruleta: Este método de selección consiste en asignar una probabilidad a cada individuo en base a su grado de adaptación, como si de una ruleta rusa se tratara. Los individuos con mejor grado de adaptación tienen mayores probabilidades de ser escogidos, pero a diferencia del elitismo, no se descartan individuos , todos participan. Este método suele ser el más utilizado.

Torneo: Este método de selección consiste en tomar de la población total a un par de individuos (aunque pudieran ser más), al igual que un torneo, estos se enfrentan ante un función que determina quien es el ganador y el perdedor, el ganador se queda en la población y tiene oportunidad de volver a concursar en la próxima ronda, el perdedor se pasa a una pila, por ultimo se toma al individuo que haya sobrevivido a todas las rondas, o dicho de otra manera haya ganado el torneo.

Una vez seleccionado los individuos que se van a reproducir, debemos hacer el crossover o cruce, pero para ello es necesario como indica el Prof. Landa, la proporción de cruce o crossover-rate, veamos que nos dice al autor sobre este valor:

“La proporción de cruce nos dice la probabilidad que existe de que dos cromosomas crucen su información para crear un nuevo organismo.”

Una vez que conocemos el valor del crossover-rate, podemos continuar con el crossover, para ello existen distintos mecanismos. Analizaremos los 3 que aparecen en el libro Inteligencia artificial:

Punto sencillo: “ Se selecciona un posición al azar en el cromosoma. Se toman del primer padre los genes que van desde en inicio hasta la posición y se colocan en el hijo. Luego se toman los genes que van desde la posición al fin del cromosoma del segundo padre y se colocan en el hijo”

Dos puntos: “[...] en este caso se seleccionan dos puntos al azar dentro cromosoma. El padre uno pone sus genes desde el inicio del cromosoma hasta la primera posición, y desde la segunda posición hasta el fin del cromosoma. El segundo padre coloca sus cromosomas entre las dos posiciones”

Múltiples puntos: “[...] se selecciona al azar cuál es el padre que aporta su información genética para un gen en particular.”

Ahora bien hasta el momento hemos dejado un concepto parte de la teoría evolutiva por fuera, la mutación, y justo cuando se realiza el crossover que se puede producir una mutación, para ello se usa un valor denominado relación de mutación, este valor indica que posibilidad tiene un gen de mutar o no. Un dato interesante, ¿Como muta un gen en un cromosoma, en el algoritmo genético? Si el arreglo de cromosoma contiene información binaria pues de hace un negación del valor actual, 0 -> 1, 1->0. Si el arreglo de cromosomas fue construido con otra estructura sencillamente la mutación dará como resultado un valor en el rango de valores posibles.

Fin del articulo. La mayoría de las referencias fueron tomadas del libro Inteligencia Artificial del Dr. Nicolás Landa. Todos los derechos reservados.

Cualquier sugerencia es bien recibida. Gracias.

Hace poco leyendo el libro Sistemas operativos, Diseño e implementación me encontré con 2 conceptos de Sistemas Operativos (S.O de ahora en adelante) algo distintos, pero que como explicaba el Prof. Tanenbaum realmente se encuentran interrelacionados.. les mostraré por que digo esto.

Concepto Clásico del S.O

“Un sistema operativo es un software de sistema, es decir, un conjunto de programas de computadora destinado a muchas tareas entre las que destaca la administración eficaz de sus recursos” (Wikipedia).

Aunque el concepto anteriormente mencionado es el mas difundido en la actualidad, el Prof. Tanenbaum nos acerca a un concepto un tanto mas completo un S.O. A continuación citare de algunas partes de su libro:

“El programa de sistema más fundamental es el sistema operativo, que controla todos los recursos de la computadora y establece la base sobre la que pueden escribirse los programas de aplicación.”

Este concepto, que aunque en lineas es similar al anterior, nos acerca mas a la realidad de lo que hace un sistema operativo, el Prof. Tanenbaum señala dos funciones propias del sistema operativo: 1) Controlador o Administrador de los recursos de la computadora, y 2) Base para la escritura de programas de aplicación. Con esta base presente, podemos analizar los dos conceptos que les mencione al principio del articulo.

Sistema Operativo como Administrador o Controlador de los recursos del computador.

El sistema operativo, cumple la función de controlar, manejar o administrar, todos los dispositivos presentes en la computadora. Ante la gran cantidad de periféricos y dispositivos que puede poseer el computador, el sistema operativo posee una sola misión, el Prof Tanenbaum nos habla nuevamente de ello al decirnos en su libro Sistemas Operativos, Diseño e Implementación lo siguiente: “la misión del sistema operativo es asegurar un reparto ordenado y controlado de los procesadores, memorias y dispositivos de E/S entre los diferentes programas que compiten por ellos.”

Sistema Operativo como maquina extendida

Las computadoras trabajan con un lenguaje de ultra bajo nivel, conocido como lenguaje maquina o lenguaje binario, el aprendizaje, y realización de programas con este lenguaje es una tarea engorrosa. He aquí donde el sistema operativo juega un papel importante, ya que nos provee de una interfaz de programación fácil e intuitiva en la mayoría de los casos, para poder comprender esto pensemos por un momento en un ejemplo: Un disco duro físicamente tiene un juego de instrucciones, que permiten leer un sector, escribir un sector, mover cabezal, la programación para el uso de un disco duro no es una labor fácil de realizar y menos decir divertida!, sin embargo el sistema operativo se encarga del control a este nivel del disco duro, y nos permite una interfaz amigable tal como leer, escribir, sin la necesidad de preocuparnos como funciona el dispositivo en especifico.

Fin del articulo. Espero que les haya gustado… Como podemos ver, es importante tener estos conceptos muy presentes, cualquier otra cosa interesante que consiga en mis estudios la publicare. Por otra parte me gustaria recibir las sugerencias y adecuados consejos sobre el articulo por parte de la comunidad lectora.

Minix!! Algunos se preguntaran si es una distro, una aplicacion, pero nada mas alejado de la realidad, Minix pudiera considerarse el padre del kernel de linux, para comprender por que llego a esta conclusion analicemos la historia detras de este maravilloso clon de unix.

Minix fue creado en el año 1987 en la universidad Vrije Universiteit de Amsterdam por el profesor Andrew Tanembaum, este clon de unix perseguia 2 objetivos principales: Un clon de Unix para los alumnos (El Unix de AT&T se habia empezado a vender bajo una licencia, un poco costosa) y por otra parte como ejemplos para sus clases de Diseño de sistema operativos.

Tanembaum se esforzo por que su sistema operativo se mantuviera libre de adiciones, esto permitia la facilidad de aprendizaje, asi que para la modificacion del mismo , el profesor, vendia el codigo de minix por cerca de unos 175 $, y permitia al usuario la aplicacion de parches.Conservando asi la distribucion original intacta.

Existian grupos de usuarios, que constantemente reportaban los errores y patches correspondientes en las listas de correo de Usenet. Alli hizo su aparicion Linus Torvals, quien publico un mensaje en estas listas, mostrando su interes en crear un kernel e invitando a programadores a que se le unieran.

Linus Torvals tomo como guia el codigo de minix, pero no lo copio como tal. Creando un kernel Monolitico (De esto hablaremos mas adelante) en contraste con el kernel minix que era basado en el paradigma de los microkernels.

Esto dió pie a una de las discusiones mas acaloradas hasta nuestros dias, dos excelentes programadores, defendiendo cada uno su posicion sobre el diseno de sistemas operativos… en general Velocidad (Linux) vs Estabilidad (Minix)

Mas adelante en otra entrega hablaremos mas sobre este tema.

Decidido a realizar un script para backup como proyecto de aprendizaje logre realizar este pequeño script bastante simple, fue desarrollado en archlinux y es para bash, debería funcionar igual en otras distros.

#! /bin/bash
# REALIZADO POR KELLERMAN RIVERO
# krsloco@gmail.com
# Bajo Archlinux
# PUEDE SER DISTRIBUIDO BAJO LA LICENCIA GPL
if [ $# -lt 2 ]; then
echo “Son necesarios 2 parametros, Ejemplo: “
echo “$0 <Directorio_Origen> <Archivo_Destino>”
exit 1
fi
if [ -z $1 ]; then
echo “Uso: $0 <directorio_respaldar>”
exit 1
fi
if [ -f $2 ]; then
echo “El fichero de destino ya existe”
select ACCION in Sobreescribir Cancelar; do
case $ACCION in

“Cancelar”)
echo -e “33[1;41mError: Fichero de destino existente33[0m"
echo -e "33[1;31mNo se puede continuar33[0m"
exit 1
;;
"Sobreescribir")
echo "Se eliminara el fichero $FILE para crear uno nuevo"
rm -v "$FILE"
break
;;
esac
done
fi

clear
DIR=$1
FILE=$2
echo "Directorio a respaldar:$DIR"
echo "Fichero: $FILE"
echo "Desea mostrar informacion adicional?"
select INFORMACION in Si No; do
case $INFORMACION in

"Si")
echo -e "33[0;35mComando:  tar cjfv ${FILE} ${DIR} 33[0m"

j=$(find  "${DIR}" -iname "*" | wc -l)
let max=100
if [ $j -lt $max ]; then
let unidad=$max/$j
else
let unidad=$j/$max
fi
echo $(tar cjfv “${FILE}” “${DIR}” > /var/tmp/.hist_tmp)&
actual=0
let contador=0
ant=0
while [ $contador -lt $j ]; do
let ant=$actual
let actual=$contador/$unidad
let contador=$(wc -l < /var/tmp/.hist_tmp)
if [ $ant -lt $actual ] ; then
echo $actual | dialog –gauge “Comprimiendo…” 0 0
fi
done
if [ $actual -lt $max ]; then
echo 100 | dialog –gauge “Comprimiendo…” 0 0
fi
sleep 2
clear

echo “BORRANDO ARCHIVOS”
rm /var/tmp/.hist_tmp
break
;;
“No”)
echo -e “33[0;35mComando: tar cjf ${FILE} ${DIR} 33[0m”
tar cjf “$FILE” “$DIR”
break
;;
esac
done
echo -e “33[0;34mProceso terminado 33[0m”
echo -e “33[1;34mArchivo creado $FILE 33[0m”
echo

Espero sea de utilidad su uso es <nombre_script> <directorio_origen> <archivo_backup>

sugerencias a mi email .. krsloco@gmail.com

Usando Archlinux tuvé problemas de montaje de dispositivos… cosa que resulta bastante fastidiosa.. el error era el siguiente:

Cannot mount volume.
Error org.freedesktop.DBus.Error.AccessDenied.

Details
A security policy in place prevents this sender from
sending this message to this recipient, see message bus
configuration file (rejected message had interface
“org.freedesktop.HAL.Device.Volume”
member “Mount” error name “(unset)”
destination “org.freedesktop.Hal”)

Googleando un poco, me conseguí con el blog de deltalinuxer (deltalinuxer.wordpress.com) donde
hay un articulo explicando que debía hacerse en caso de dar este error.

A mi me funciono solo con los pasos previos, para ello procedí a agregar mi usuario a los grupos:
optical, storage, dbus, hal.

[kellerman@DarkTux ~]$ gpasswd -a kellerman hal
[kellerman@DarkTux ~]$ gpasswd -a kellerman dbus
[kellerman@DarkTux ~]$ gpasswd -a kellerman storage
[kellerman@DarkTux ~]$ gpasswd -a kellerman optical

Y con eso, te re-logeas y debería funcionar. En caso de que el problema continué, seria apropiado que
pasaran por el blog de deltalinuxer para continuar con el resto de los pasos y así lograr la solución
problema.

Fuente:

(http://deltalinuxer.wordpress.com/2007/06/30/hal-y-gnome-automontaje-de-unidades-usb-2/)