The::Beastieux

Sangre de Bestia + Corazón de Pingüino | Un blog acerca de Linux, *BSD, Open Source, Software Libre, Programación …

Archivos en la Categoría: Tutoriales

Encriptación de Ficheros con GNU Privacy Guard – GPG


GNU Privacy Guard (GPG) es una herramienta de cifrado de datos y firmas digitales, usado como reemplazo de PGP (Pretty Good Privacy) pero con la diferencia que es software libre licenciado bajo la GPL. GPG utiliza el estándar del IETF denominado OpenPGP.

Utilizandolo correctamente, GPG puede proporcionar un gran nivel de seguridad y puede utilizarse para proteger datos almacenados en discos, copias de seguridad, etc.

Lo primero que necesitamos hacer es crear nuestra clave:

$ gpg --gen-key

gpg: AVISO: permisos inseguros del directorio contenedor del fichero de
configuración `~/.gnupg/gpg.conf’
gpg (GnuPG) 1.4.9; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Por favor seleccione tipo de clave deseado:

(1) DSA y ElGamal (por defecto)
(2) DSA (sólo firmar)
(5) RSA (sólo firmar)

Su elección: 1

El par de claves DSA tendrá 1024 bits.
las claves ELG-E pueden tener entre 1024 y 4096 bits de longitud.

¿De qué tamaño quiere la clave? (2048) 1024

El tamaño requerido es de 1024 bits
Por favor, especifique el período de validez de la clave.
0 = la clave nunca caduca
n> = la clave caduca en n días
n>w = la clave caduca en n semanas
n>m = la clave caduca en n meses
n>y = la clave caduca en n años

¿Validez de la clave (0)?

La clave nunca caduca

¿Es correcto? (s/n) s

Necesita un identificador de usuario para identificar su clave. El programa
construye el identificador a partir del Nombre Real, Comentario y Dirección
de Correo Electrónico de esta forma:
“Heinrich Heine (Der Dichter) “

Nombre y apellidos: Beastieux Zeroo
Dirección de correo electrónico: the.beastieux@gmail.com
Comentario: The::Beastieux
Ha seleccionado este ID de usuario: “Beastieux Zeroo (The::Beastieux)”
¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir? V
Necesita una frase contraseña para proteger su clave secreta.******

gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,
modelo de confianza PGP
gpg: nivel: 0 validez: 2 firmada: 0 confianza: 0-, 0q, 0n, 0m, 0f, 2u
pub 1024D/597280F0 2011-02-10
Huella de clave = FC3A 0A54 34AC C55F 6E5E E317 8869 8531 5972 80F0
uid Beastieux Zeroo (The::Beastieux) sub 1024g/438636E5 2011-02-10

Luego, podemos subirlo a algún servidor de claves para compartirlo:

$ gpg --keyserver pgp.mit.edu --send-keys mi_clave

Luego de subirlo pueden compartir su clave pública en la web:

Mi GPG

Algunos comandos que podemos hacer uso para realizar operaciones posterior a la creación de nuestra clave:

Listar Claves Públicas:

$ gpg --list-public-keys

Listar Claves Privadas:

$ gpg --list-secret-keys

Exportar Clave Pública:

$ gpg --export -a "Nombre de Usuario" > publica.key

Exportar Clave Privada:

$ gpg --export-secret-keys -a "Nombre Usuario" > privada.key

Importar Clave Pública:

$ gpg --import publica.key

Importar Clave Privada:

$ gpg --allow-secret-key-import --import privada.key

Borrar Clave Pública:

$ gpg --delete-key "Nombre Usuario"

Borrar Clave Privada:

$ gpg --delete-secret-key "Nombre Usuario"

Listar Huellas:

$ gpg --fingerprint

Cifrar Archivo:

$ gpg -e archivo

Descifrar Archivo:

$ gpg --decrypt archivo.gpg

Tutorial de Creación de Plugins para Pidgin en Linux


Como sabrán, quienes siguen a menudo mi blog, hace unos meses creé un plugin para Pidgin – MorseCodeTalk, ahora quiero compartirles un pequeño tutorial para poder crear vuestras propias extensiones.

1- Creamos un Directorio de Trabajo:

# mkdir ~/development

2- Descargar las fuentes de Pidgin y moverlo al directorio creado:
En mi caso he descargado la versión 2.7.9.
http://www.pidgin.im/download/source/
3- Descomprimir las fuentes:

# tar -jxvf pidgin-2.7.9.tar.bz2

4- Configurar las fuentes:

# cd pidgin-2.7.9
# ./configure

4.1- Errores:
Si hay errores de dependencias, instala los plugins que falta:

Ejem: aptitude install intltool

4.2- Opciones:
– Usa –disable-vv si no necesitarás alguna funcionalidad.

Ejem: ./configure --disable-vv --disable-idn --disable-nm --prefix=/opt/pidgin

- prefix es para que se instale en /opt/pidgin

4.3- Advertencia:
Si ya tenías instalado pidgin anteriormente, te saldrá una advertencia, pero no te preocupes, podrás iniciar la nueva versión de Pidgin por consola.

Warning: You have an old copy of Pidgin at /usr/bin/pidgin.

5- Compilar las fuentes:

# make

Esto podría demorar un poco.

6- Crear el Plugin:
Para empezar crear el plugin deberemos dirigirnos al directorio siguiente:

$ cd libpurple/plugins/

Crearemos un plugin de ejemplo llamado holamundo que sólo nos mostrará una ventana de diálogo al activarlo, para ello debemos crear un fichero de acuerdo al lenguaje de programación que usaremos y el editor que prefieran, yo alterno entre gedit(editor gráfico) y nano(editor desde consola).

Pidgin ofrece API’s para crear extensiones en diferentes lenguajes, como C, Perl, Tcl, d-bus, para este ejemplo usaré el lenguaje de entre ellos que más conozco, que es C (no C++).

6.1- Crear el Código del Plugin:

$ nano holamundo.c
#define PURPLE_PLUGINS
#include 
#include "notify.h"
#include "plugin.h"
#include "version.h"

static gboolean
plugin_load(PurplePlugin *plugin) {
    purple_notify_message(plugin, PURPLE_NOTIFY_MSG_INFO, "Hola Mundo!",
                        "Este es mi primer Plugin para Pidgin", NULL, NULL, NULL);

    return TRUE;
}

static PurplePluginInfo info = {
    PURPLE_PLUGIN_MAGIC,
    PURPLE_MAJOR_VERSION,
    PURPLE_MINOR_VERSION,
    PURPLE_PLUGIN_STANDARD,
    NULL,
    0,
    NULL,
    PURPLE_PRIORITY_DEFAULT,

    "core-holamundo",
    "Hola Mundo",
    "1.0",

    "Plugin Hola Mundo",
    "Plugin Hola Mundo",
    "Beastieux Zeroo ",
    "http://saforas.wordpress.com",

    plugin_load,
    NULL,
    NULL,

    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL
};

static void
init_plugin(PurplePlugin *plugin)
{
}

PURPLE_INIT_PLUGIN(holamundo, init_plugin, info)

La siguiente parte del código nos permite dotar de información suficiente para el plugin, acontinuación describo cada uno de los parámetros:

static PurplePluginInfo info = {
    PURPLE_PLUGIN_MAGIC,    /* Este deberá ser siempre
                               PURPLE_PLUGIN_MAGIC.*/

    PURPLE_MAJOR_VERSION,   /* Este parámetro ayuda a determinar
			       la versión de Pidgin en el que es
			       compilado, del mismo modo permitirá
			       usar el plugin sólo en la versión
			       donde fue compilada */

    PURPLE_MINOR_VERSION,   /* Versión a partir del cual
			       podrá funcionar el Pidgin */

    PURPLE_PLUGIN_STANDARD, /* PurplePluginType: Hay 4 diferentes valores
			       el primero es PURPLE_PLUGIN_UNKNOWN;
                               no debería ser usado, PURPLE_PLUGIN_STANDARD;
			       este es el valor más usado.
			       PURPLE_PLUGIN_LOADER; usamos este cuando
			       queremos cargar plugins no nativos
			       por ejemplo los hechos en Perl o Tcl,
			       por último PURPLE_PLUGIN_PROTOCOL;
			       si tu plugin permitirá conectar
 			       con otras redes.*/

    NULL,		       /* Si estás escribiendo un Core Plugin
			       debería ser NULL, Si estás escribiendo un
			       Pidgin Plugin debes usar PIDGIN_PLUGIN_TYPE.
			       Si estás escribiendo un Finch Plugin
                               debería usar FINCH_PLUGIN_TYPE.*/

    0,			       /* Este parámetro es para determinar los flags.
			       como el disponible para poner a invisible
                               (PURPLE_PLUGIN_FLAG_INVISIBLE).
			       Con ello haremos que el plugin no aparezca
			       en la lista de plugins. */

    NULL,		       /* Este es un GList de dependencias de plugins.*/

    PURPLE_PRIORITY_DEFAULT,   /* Determina la prioridad que libpurple dará
			          a tu plugin. Existen 3 posibilidades,
			          PURPLE_PRIORITY_DEFAULT,
			          PURPLE_PRIORITY_HIGHEST,
			          PURPLE_PRIORITY_LOWEST. */

    "core-holamundo",	        /* Es el ID de tu plugin.*/

    "Hola Mundo",		/* Es el Nombre de tu plugin.*/

    "1.1",			/* Es la Versión de tu plugin.*/

    "Resúmen Hola Mundo",	/* Es el Resúmen de tu plugin.*/

    "Descripción Hola Mundo",	/* Es la descripción de tu plugin.*/

    "Tu Nombre ",	/* Datos del desarrollador del Plugin. */

    "http://...",	/* La Web del Plugin, de donde pueden
				   descargarlo, reportar bugs, etc.*/

    plugin_load,	/* La función que se carga cuando
			   se inicia el plugin.
			   Debería ser de tipo gboolean*/

    NULL,		/* Es llamado cuando libpurple
			   se descarga, también
			   deberá ser de tipo gboolean.*/

    NULL,		/* Es llamado cuando libpurple
			   se destruye, también
			   deberá ser de tipo gboolean.*/

    NULL,		/* Deberá apuntar a un PidginPluginUiInfo.*/

    NULL,		/* Determina si es un PurplePluginLoaderInfo
			   o PurplePluginProtocolInfo*/

    NULL,		/* Puntero que apunta a una estructura
			   PurplePluginUiInfo.
			   Puedes encontrar un ejemplo de ese
			   tipo de código en:
			   libpurple/plugins/pluginpref_example.c */

    NULL,		/* Es una función puntero donde se definen
			   acciones. Debe ser de tipo GList
			   *function_name(PurplePlugin
			   *plugin, gpointer context)*/

    NULL,		/* Es un puntero reservado para el futuro,
			   lo setearemos a NULL
			   porque no lo necesitamos.*/

    NULL,       	/* Es un puntero reservado para el futuro,
			   lo setearemos a NULL
			   porque no lo necesitamos.*/

    NULL,		/* Es un puntero reservado para el futuro,
			   lo setearemos a NULL
			   porque no lo necesitamos.*/

    NULL		/* Es un puntero reservado para el futuro,
			   lo setearemos a NULL
			   porque no lo necesitamos.*/
};

6.2- Compilar el fichero holamundo.c:

$ make holamundo.so

6.3- Copiar el plugin creado en el directorio de pidgin:

$ cp holamundo.so ~/.purple/plugins/

6.4- Ejecutar Pidgin y probar el plugin:

$ /opt/pidgin/bin/pidgin

Para crear un plugin con interfaces más elaboradas podemos usar las librerías GTK, y para la interacción con pidgin usamos las librerías libpurple; una buena combinación de C/GTK/Libpurple, y de los conocimientos necesarios del la estructura funcional de pidgin nos permitirán realizar los complementos que queramos, pueden buscar toda la información necesaria en la wiki de desarrolladores de pidgin. Una recomendación de mi parte es que revisen los códigos fuente de los plugins existentes en Pidgin Plugins, y tomarlos como referencia para construir los suyos, es lo que hice antes de empezar a crear mis propios complementes . Ahora, si quieren hacer la versión para windows, generar el dll tiene un proceso algo mas tedioso, se necesitará la ayuda de cygwin en windows y descargar e instalar todos los paquetes del cual pidgin depende para poder compilar las fuentes.

Instalación y Configuración de un Servidor de Streaming Multimedia con IceCast


Hace mucho tiempo que ya es normal encontrar en la red servicios de transmisión de radio que llegan a todo el planeta, pues en este post voy a explicar cómo realizar la instalación de un Servidor IceCast que es un servicio libre en contraparte al conocido servicio de ShoutCast.

Antes que nada quiero aclarar que esta instalación la realizaré sobre un Debian/Linux, pero la configuración es análoga para cualquier distribución Basada en GNU/Linux.

#aptitude install icecast2 ices2

Icecast2: Servidor de Streaming.
Ices2: Cliente para emitir Stream.

Inicialmente configuraremos el Servicio de Icecast localmente, para ello IP Server = 127.0.0.1 o localhost, el puerto por el que atiende icecast será 8000.

Para las ediciones de los ficheros de texto yo prefiero usar “nano”, ustedes pueden hacer uso del que gusten.  Así mismo, es recomendable que cambien las contraseñas que la instalación trae por defecto, como en <source-password>, <relay-password> y <admin-password>; éste último se refiere a la contraseña de acceso via web: http://127.0.0.1:8000/admin/

Iniciamos con la configuración:

Configuración de Icecast2:

#nano /etc/icecast2/icecast.xml
 <icecast>
    <limits>
        <clients>100</clients>
        <sources>2</sources>
        <threadpool>5</threadpool>
        <queue-size>524288</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
        <burst-on-connect>1</burst-on-connect>
        <burst-size>65535</burst-size>
    </limits>

    <authentication>
        <source-password>source</source-password>
        <relay-password>source</relay-password>
        <admin-user>admin</admin-user>
        <admin-password>admin</admin-password>
    </authentication>

    <hostname>localhost</hostname>

    <listen-socket>
        <port>8000</port>
    </listen-socket>

    <fileserve>1</fileserve>

    <paths>
        <basedir>/usr/share/icecast2</basedir>
        <logdir>/var/log/icecast2</logdir>
        <webroot>/usr/share/icecast2/web</webroot>
        <adminroot>/usr/share/icecast2/admin</adminroot>
        <alias source="/" dest="/status.xsl"/>
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
      	<loglevel>3</loglevel>
      	<logsize>10000</logsize>
    </logging>

    <security>
        <chroot>0</chroot>
        <!--
        <changeowner>
            <user>nobody</user>
            <group>nogroup</group>
        </changeowner>
        -->
    </security>
</icecast>
#nano /etc/default/icecast2
CONFIGFILE="/etc/icecast2/icecast.xml"
USERID=icecast2
GROUPID=icecast
ENABLE=true
#/etc/init.d/icecast2 start

Si hasta este punto todo se ha hecho bien, la siguiente dirección debería cargar correctamente en el navegador: http://127.0.0.1:8000

Configuración de Ices2:

Modo Live: Para Emitir streaming en linea, por ejemplo con la salida desde micro:
Los ficheros de configuración de ices2 lo pueden crear en su directorio personal, según el ejemplo mi directorio personal es /home/beastieux/

$mkdir /home/beastieux/iceconf
$cd /home/beastieux/iceconf
$nano iceconf/ices2-live.xml
<?xml version='1.0'?>
<ices>
<background>0</background>
<logpath>/var/log/icecast2</logpath>
<logfile>ices.log</logfile>
<loglevel>4</loglevel>
<consolelog>1</consolelog>

<stream>

<metadata>
<name>Radio Beastieux</name>
<genre>rock-metal-bossa-chilli</genre>
<description>Radio con la mejor musica de mi computadora</description>
<url>http://saforas.wordpress.com</url>
</metadata>

<input>
<module>alsa</module>
<param name="rate">44100</param>
<param name="channels">2</param>
<param name="device">hw:0,0</param>
<param name="metadata">1</param>
<!--Localización de un fichero metadata.-->
<param name="metadatafilename">./metadata</param>
</input>

<!--Datos del Servidor Icecast2-->
<instance>
<hostname>127.0.0.1</hostname>
<port>8000</port>
<username>source</username>
<password>source</password>
<mount>/radio-beastieux.ogg</mount>
<yp>1</yp>

<encode>
<!--Datos de la velocidad de transmisión, calidad-->
<minimum-bitrate>48000</minimum-bitrate>
<maximum-bitrate>64000</maximum-bitrate>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<!--Calidad de codificación del bitrate. Va de 0 a
10. Interesa tener un valor bajo para conexiones
modestas-->
<quality>1</quality>
<!--Número de canales de la entrada -->
<channels>2</channels>
</encode>

<downmix>1</downmix>
<resample>
<in-rate>44100</in-rate>
<out-rate>44100</out-rate>
</resample>

</instance>
</stream>
</ices>

Para emitir el stream sólo lanzar este comando:

$ices2 ices2-live.xml

Luego pueden hablar por el micro o ayudarse con reproductores y sintetizadores para la transmisión, que todo lo que salga por el audio desde su ordenador se estará transmitiendo en vivo.

Modo Playlist: Para Emitir Streaming desde una lista con las direcciones del audio:

$nano /home/beastieux/iceconf/ices2-playlist.xml
<?xml version='1.0'?>
<ices>
<background>0</background>
<logpath>/var/log/icecast2</logpath>
<logfile>ices.log</logfile>
<loglevel>4</loglevel>
<consolelog>1</consolelog>

<stream>
<metadata>
<name>Radio Beastieux</name>
<genre>rock-metal-bossa-chilli</genre>
<description>Radio con la mejor musica de mi computadora</description>
<url>http://saforas.wordpress.com</url>
</metadata>
<!-- El <input> es lo único diferente al fichero ices2-live.xml -->
             <input>
                       <module>playlist</module>
                       <!--Indicar el sitio donde tenemos la lista de reproducción-->
                       <param name="file">/home/beastieux/iceconf/playlist.m3u</param>
                       <param name="type">basic</param>
                       <!--reproduce en modo random-->
                       <param name="random">1</param>
                       <!--A valor 0 reproduce la lista
                              continuamente."-->
                       <param name="once">0</param>
                       <param name="rate">44100</param>
                       <param name="channels">2</param>
                       <param name="device">/dev/dsp</param>

               </input>

<instance>
<hostname>127.0.0.1</hostname>
<port>8000</port>
<username>source</username>
<password>source</password>
<mount>/radio-beastieux.ogg</mount>
<yp>1</yp>

<encode>
<!--Datos de la velocidad de transmisión-->
<minimum-bitrate>48000</minimum-bitrate>
<maximum-bitrate>64000</maximum-bitrate>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<!--Calidad de codificación-->
<quality>1</quality>
<!--Número de canales de la entrada -->
<channels>2</channels>
</encode>

<downmix>1</downmix>
<resample>
<in-rate>44100</in-rate>
<out-rate>44100</out-rate>
</resample>

</instance>
</stream>
</ices>

Crear la lista de reproducción:
La lista de reproducción solo es una lista con las direcciones de los archivos de audio, en este caso deben de ser OGG, el fichero debe constar de una dirección por linea. Si tienen un directorio con músicas podrían generar el fichero.m3u automáticamente con algo como:

$find /media/sda2/musicas/ -name "*ogg" > ~/iceconf/playlist.m3u

Para ejecutar el modo automático de emisión desde un playlist con los audios (ogg) añadidos:

$ices2 ices2-playlist.xml

Si quieren escuchar la transmisión vía web pueden ingresar al punto de montaje configurado, para este ejemplo el punto de montaje fue radio-beastieux.ogg, por lo cual accederemos a: http://127.0.0.1:8000/radio-beastieux.ogg

Por último, tanto la ejecución en modo live como en modo playlist con ices2 no debe de niguna manera devolvernos al promt del terminal, si eso ocurre es porque los ficheros están mal configurados o el servidor no está iniciado correctamente. Si todo ha salido bien entonces tendrían su servidor de Icecast básicamente configurado y listo para empezar a emitir normalmente, podrian empezar a transmitir para el mundo entero.

Código Bash – Obtener Un Listado Completo y Todos Logos de las Distribuciones Linux y BSD


El siguiente script está escrito en Bash y su objetivo es obtener una lista completa en formato HTML de todas las distribuciones Linux/BSD registrados en Distrowatch con enlace directo al Sitio Oficial de la Distribución, así como también permite obtener todos los logos en formato PNG de todas las distribuciones encontradas.

#!/bin/bash

# distrolist.sh - Copyright (C) 2011 Beastieux Zeroo <the.beastieux@gmail.com>
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA.

DISTRO1='/tmp/LinuxTemp1'
DISTRO2='/tmp/LinuxTemp2'
DISTRO3='DistrowatchList'
DISTRO4='/tmp/LinuxTemp4'
DISTRO5='DistrowatchFile'
ICO_DIR='ICONS'
BAN=0

if [ -d $ICO_DIR ] ; then
	rm -rf $ICO_DIR
	mkdir $ICO_DIR
else
	mkdir $ICO_DIR
fi

rm $DISTRO1 2> /dev/null
rm $DISTRO2 2> /dev/null
rm $DISTRO3 2> /dev/null
rm $DISTRO4 2> /dev/null
rm $DISTRO5 2> /dev/null

function setRequirements {

	if [ -x /usr/bin/lynx ] ; then
		BAN=$[$BAN + 1]
	else
		echo "*Necesitas instalar lynx"
	fi

	if [ -x /usr/bin/wget ] ; then
		BAN=$[$BAN + 1]
	else
		echo "*Necesitas instalar wget"
	fi

}

function getWebFile {
	#OBTENER LA LISTA DE DISTROS DESDE DISTROWATCH
	lynx -dump "http://distrowatch.com/stats.php?section=popularity" > $DISTRO1

	cat $DISTRO1 | grep '[=><]' > $DISTRO2
	cat $DISTRO2 | tr '[=><]' ']' | awk -F"]" '{print $3}' | rev | awk '{print $2,$3}' | rev | sort -n | uniq | sed 's/^ //g' > $DISTRO3
}

function setURLFile {
	#GENERAR FILE CON LAS URLS DE LA WEB DE CADA DISTRO

	lynx -dump "http://distrowatch.com/stats.php?section=popularity" | sed 's/Last 6 months/Last 12 months/g' > /tmp/LIST
	csplit /tmp/LIST '/Last 12 months/' '/Last 12 months/' > /dev/null

	cat xx01 | grep '[=><]' | awk '{print $2}' | grep -v '[:=]' > $DISTRO4

	#EL VALOR DE $DESDE - $HASTA SUELE VARIAR CON EL TIEMPO

	DESDE=`cat $DISTRO4|head -1 | sed 's/\[/]/g' | awk -F']' '{print $2}'`
	HASTA=`cat $DISTRO4|tail -1 | sed 's/\[/]/g' | awk -F']' '{print $2}'`

	i=$DESDE

	while [ $i -le $HASTA ] ; do
	  URL=`cat $DISTRO1|awk '{print $1,$2}' | grep "^$i\."|awk '{print $2}'|awk -F'\t' '{print $1}'`
	  HOMELINUX=`lynx -dump "$URL" | grep " Home Page"|awk -F']' '{print $2}'`
	  #DOWNLOAD=`lynx -dump "$URL" | grep "\[33\]"|awk -F':' '{print $2}'`
	  NOMBRE=`cat $DISTRO1|grep "\[$i\]"| awk -F"]" '{print $2}'|awk -F'  ' '{print $1}'`
	  ICONO=`echo http://distrowatch.com/images/xnwchcfnxz/$(echo $URL | awk -F'/' '{print $4}').png`
	  echo "$NOMBRE;$HOMELINUX;$ICONO" >> $DISTRO5
	  i=$[$i+1]
	  echo $[$i-$DESDE]:$NOMBRE
	done

	rm xx0* 2> /dev/null
	rm /tmp/LIST 2> /dev/null
}

function getIcons {
	#OBTENIENDO ICONOS DE CADA DISTRO

	cd $ICO_DIR

	for ico in $(cat ../$DISTRO5|awk -F';' '{print $3}') ; do
		wget $ico 2> /dev/null
		echo -e .'\c'
	done

	echo -e .'\n'

	cd -
}

function setHTMLFile {
	#CREA UN FICHERO HTML CON LOS ENLACES A CADA DISTRO
	WEB=distros.html
	i=1
	echo '<body bcolor="#ffffff">' > $WEB
	echo '<ol>' >> $WEB
	echo '<TABLE BORDER="0">' >> $WEB

	echo '<TR>' >> $WEB
	for f in $(cat $DISTRO5|sed 's/ /__/g'|sort) ; do

	    URL=`echo $f|awk -F';' '{print $2}'`
	    NOM=`echo $f|awk -F';' '{print $1}'|sed 's/__/ /g'`

	    echo "<TD WIDTH=\"150\"><li><a href=\"$URL\" title=\"$NOM\" target=\"_blank\">$NOM</a></li></TD>" >> $WEB

	    if [ $[$i % 4] -eq 0 ] ; then
		echo '</TR>' >> $WEB
		echo '<TR>' >> $WEB
	    fi
	    i=$[$i+1]
	done

	echo '</TABLE>' >> $WEB
	echo '</ol>' >> $WEB
	echo '</body>'>> $WEB
}

setRequirements;

if [ $BAN -eq 2 ] ; then
	getWebFile
	setURLFile
	getIcons
	setHTMLFile
fi
$chmod +x distrolist.sh
$./distrolist.sh

Al ejecutar el script obtendremos un fichero HTML con el listado completo y todos los logos en un directorio nuevo. Eres libre de realizar las modificaciones que creas conveniente sobre el código.

  1. 2X
  2. Absolute
  3. AbulÉdu
  4. AgiliaLinux
  5. Alinex
  6. aLinux
  7. Alpine
  8. ALT
  9. AnNyung
  10. antiX
  11. APODIO
  12. aptosid
  13. ArchBang
  14. ArcheOS
  15. Arch
  16. AriOS
  17. Ark
  18. ArtistX
  19. Asianux
  20. ASPLinux
  21. Astaro
  22. AsteriskNOW
  23. Asturix
  24. Aurora
  25. AUSTRUMI
  26. B2D
  27. BackTrack
  28. Baltix
  29. Bayanihan
  30. Bee
  31. Berry
  32. Big Linux
  33. blackPanther
  34. BLAG
  35. BlankOn
  36. Bodhi
  37. BOSS
  38. BRLix
  39. BU Linux
  40. Burapha
  41. CAELinux
  42. CAINE
  43. Caixa Mágica
  44. Calculate
  45. Canaima
  46. Caos
  47. CCux
  48. CDlinux
  49. CensorNet
  50. CentOS
  51. Chakra
  52. ClearOS
  53. Clonezilla
  54. Comfusion
  55. Connochaet
  56. Coyote
  57. CrunchBang
  58. CRUX
  59. Càtix
  60. CTKArchLive
  61. Debian
  62. Debris
  63. Deepin
  64. DEFT
  65. DesktopBSD
  66. Devil
  67. DigAnTel
  68. Draco
  69. DragonFly
  70. Dragora
  71. Dreamlinux
  72. DVL
  73. EasyPeasy
  74. Edubuntu
  75. Ekaaty
  76. Elastix
  77. Element
  78. Elive
  79. Endian
  80. EnGarde
  81. Epidemic
  82. Estrella Roja
  83. ESUN
  84. Evinux
  85. ExTIX
  86. Fedora
  87. Fermi
  88. Finnix
  89. Foresight
  90. FreeBSD
  91. FreeNAS
  92. Frenzy
  93. Frugalware
  94. FuguIta
  95. Fusion
  96. GeeXboX
  97. Gentoo
  98. Gentoox
  99. GhostBSD
  100. Gibraltar
  101. GnackTrack
  102. gNewSense
  103. GNOBSD
  104. GNUstep
  105. GoboLinux
  106. GParted
  107. Greenie
  108. Grml
  109. Guadalinex
  110. Hacao
  111. Helix
  112. Honeywall
  113. Hymera
  114. IDMS
  115. iMagic
  116. Imagineos
  117. Incognito
  118. Inquisitor
  119. Insigne
  120. IPCop
  121. IPFire
  122. Jibbed
  123. JoLinux
  124. Joli OS
  125. K12Linux
  126. kademar
  127. KahelOS
  128. KANOTIX
  129. Karoshi
  130. Kiwi
  131. Knoppel
  132. KNOPPIX
  133. KnoSciences
  134. Kongoni
  135. Kororaa
  136. Kubuntu
  137. Kwort
  138. Legacy
  139. LFS
  140. LinEx
  141. LinHES
  142. Linpus
  143. LinuxConsole
  144. Linux-EduCD
  145. linuX-gamers
  146. LinuxTLE
  147. Linux XP
  148. Litrix
  149. LiveCD Router
  150. LliureX
  151. Lubuntu
  152. Lunar
  153. m0n0wall
  154. Macpup
  155. Madbox
  156. Mageia
  157. Magic
  158. Mandriva
  159. Mangaka
  160. MAX
  161. MCNLive
  162. MeeGo
  163. MEPIS
  164. MidnightBSD
  165. MilaX
  166. MiniNo
  167. MINIX
  168. Mint
  169. Miracle
  170. MirOS
  171. Moblin
  172. MoLinux
  173. Momonga
  174. Monomaxos
  175. moonOS
  176. Musix
  177. Myrinix
  178. Mythbuntu
  179. MythDora
  180. Nature’s
  181. NeoShine
  182. NepaLinux
  183. NetBSD
  184. Netrunner
  185. NetSecL
  186. Nexenta
  187. NexentaStor
  188. Niigata
  189. NimbleX
  190. Nova
  191. Novell SLE
  192. NST
  193. NuTyX
  194. Ojuba
  195. OLPC
  196. Omoikane
  197. O-Net
  198. OpenBSD
  199. Openfiler
  200. OpenIndiana
  201. openmamba
  202. openSUSE
  203. Openwall
  204. Ophcrack
  205. Oracle
  206. PAIPIX
  207. paldo
  208. PapugLinux
  209. Pardus
  210. Parsix
  211. Parted Magic
  212. PC-BSD
  213. PCLinuxOS
  214. PC/OS
  215. PelicanHPC
  216. Pentoo
  217. Peppermint
  218. pfSense
  219. Phayoune
  220. Pinguy
  221. Plamo
  222. PLD
  223. Plop
  224. Porteus
  225. Poseidon
  226. pQui
  227. Privatix
  228. Puppy
  229. Puredyne
  230. PureOS
  231. Qimo
  232. Qomo
  233. Quirky
  234. Red Flag
  235. Red Hat
  236. redWall
  237. Resulinux
  238. RIPLinuX
  239. Rocks Cluster
  240. rPath
  241. Runtu
  242. Sabayon
  243. Sabily
  244. Saline
  245. Salix
  246. SAMity
  247. Satux
  248. SchilliX
  249. Scientific
  250. Securepoint
  251. Skolelinux
  252. Slackintosh
  253. Slackware
  254. SLAMPP
  255. SliTaz
  256. SME Server
  257. SmoothWall
  258. SMS
  259. Solaris
  260. SoL
  261. Sorcerer
  262. Source Mage
  263. StartCom
  264. STD
  265. StressLinux
  266. STUX
  267. SuliX
  268. SuperGamer
  269. Super OS
  270. Syllable
  271. SystemRescue
  272. T2
  273. TFM
  274. Thinstation
  275. Tiny Core
  276. TinyMe
  277. Toorox
  278. Topologilinux
  279. Toutou
  280. Trinity
  281. Trisquel
  282. trixbox
  283. Truva
  284. Tuquito
  285. Turbolinux
  286. TurnKey
  287. UberStudent
  288. Ubuntu Christian
  289. Ubuntu
  290. Ubuntu Rescue
  291. Ubuntu Studio
  292. UHU-Linux
  293. Ulteo
  294. Ultimate
  295. Unity
  296. Untangle
  297. UPR
  298. Userful
  299. UTUTO
  300. Vector
  301. VENENUX
  302. Vine
  303. Vinux
  304. VLOS
  305. VMKnoppix
  306. VNLinux
  307. VortexBox
  308. Vyatta
  309. wattOS
  310. Webconverger
  311. Wifislax
  312. Wolvix
  313. Xange
  314. xPUD
  315. Xubuntu
  316. Yellow Dog
  317. Ylmf
  318. Yoper
  319. Zencafe
  320. Zentyal
  321. Zenwalk
  322. Zeroshell
  323. ZevenOS
  324. Zorin

Logos de Distribuciones Linux / BSD

Códigos Sencillos hechos en Python


Aquí les dejo algunos códigos sencillos en Python que me puse a escribir cuando aún no sabía mucho de éste; útil para quienes quieren empezar a conocer este lenguaje de programación y comprender un poco el concepto de las listas sin hacer mucho uso de funciones especiales. Con un poco más de conocimiento sobre la sintaxis de python es muy probable que logren reducir el número de lineas de código por la sencillez  que representa este Lenguaje de Programación.

Código Python – Encontrar Posición de un Elemento en un Lista
Código Python – Concatenar Elementos de Dos Listas
Código Python – Eliminar Un Elemento de una Lista
Código Python – Eliminar Un Elemento de una Lista mediante su Indice
Código Python – Insertar Un Elemento en una Lista
Código Python – Determinar Si dos Listas son Iguales.
Código Python – Inclusión de Listas como Conjunto
Código Python – Intersección de Listas como Conjunto
Código Python – Unión de dos Listas como Conjunto
Código Python – Promedio de los Elementos de una Lista
Código Python – Moda de los Elementos de una Lista
Código Python – Suma de los Elementos de una Lista
Código Python – Suma de Elementos Pares de una Lista
Código Python – Suma de Elementos Impares de una Lista
Código Python – Potencia de los Elementos de una Lista elevados a su Indice
Código Python – Potencia de los Elementos de una Lista

Código Python – Potencia de los Elementos de una Lista


Ejemplo de Listas en Python: retornar la lista con cada una de sus elementos elevados a una potencia.

# Dada una lista de enteros y un numero p,
# retornar la lista con cada una de sus elementos elevados a la potencia p.

import random

def potenciaLista(lista, p):
    return [n ** p for n in lista]

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre + "[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]
    i=0
    while i < 5:
        lista.append(int(random.randint(0, 10)))
        i=i+1
    return lista

A=leerLista()
imprimirLista(A,"A")
cn=int(raw_input("Ingresa Exponente: "))
B=potenciaLista(A,cn)
imprimirLista(B,"B")

Código Python – Potencia de los Elementos de una Lista elevados a su Indice


Ejemplo de Listas en Python: retornar la lista con cada una de los elementos de una lista elevados a su indice.

# Dada una lista de enteros,
# retornar la lista con cada una de sus elementos elevados a su indice.

import random

def potenciaLista(lista):
    lista_nueva=[]
    for i in range(0,len(lista)):
        lista_nueva.append(lista[i]**i)
    return lista_nueva

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre + "[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]
    i=0
    while i < 5:
        lista.append(int(random.randint(0, 10)))
        i=i+1
    return lista

A=leerLista()
imprimirLista(A,"A")
print "Potencia:"
B=potenciaLista(A)
imprimirLista(B,"B")

Código Python – Suma de Elementos Impares de una Lista


Ejemplo de Listas en Python: Retornar la suma de los elementos impares de una lista.

# Retornar la suma de los elementos impares de una lista.

import random

def sumarLista(lista):
    sum=0
    for i in range(0,len(lista)):
        if lista[i] % 2 != 0:
            sum=sum+lista[i]

    return sum

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre + "[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 5:
        lista.append(int(random.randint(0, 5)))
        i=i+1
    return lista

A=leerLista()
imprimirLista(A,"A")
print "Suma = " + str(sumarLista(A))

Código Python – Suma de Elementos Pares de una Lista


Ejemplo de Listas en Python: Retornar la suma de los elementos pares de una lista.

# Retornar la suma de los elementos pares de una lista.

import random

def sumarLista(lista):
    sum=0
    for i in range(0,len(lista)):
        if lista[i] % 2 == 0:
            sum=sum+lista[i]

    return sum

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre + "[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 5:
        lista.append(int(random.randint(0, 5)))
        i=i+1
    return lista

A=leerLista()
imprimirLista(A,"A")
print "Suma = " + str(sumarLista(A))

Código Python – Suma de los Elementos de una Lista


Ejemplo de Listas en Python: Retornar la suma de los elementos de una lista.

# Retornar la suma de los elementos de una lista.

import random

def sumarLista(lista):
    sum=0
    for i in range(0,len(lista)):
        sum=sum+lista[i]

    return sum

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre + "[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 5:
        lista.append(int(random.randint(0, 5)))
        i=i+1
    return lista

A=leerLista()
imprimirLista(A,"A")
print "Suma = " + str(sumarLista(A))

Código Python – Moda de los Elementos de una Lista


Ejemplo de Listas en Python: Retornar la moda de los elementos de una lista.

# Retornar la moda de los elementos de una lista.
import random

def modaLista(lista):
    aux = 0
    cont = 0
    moda = -1
    lista.sort(cmp=None, key=None, reverse=False)
    for i in range(0,len(lista)-1):
        if (lista[i] == lista[i+1]):
            cont = cont + 1
            if cont >= aux:
                aux = cont
                moda = lista[i]
        else:
            cont=0

    return moda

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre + "[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 10:
        lista.append(int(random.randint(0, 5)))
        i=i+1
    return lista

A=leerLista()
imprimirLista(A,"A")
print "Moda: " + str(modaLista(A))

Código Python – Promedio de los Elementos de una Lista


Ejemplo de Listas en Python: Retornar el promedio de los elementos de una lista.

# Retornar el promedio de los elementos de una lista.

import random

def promediarLista(lista):
    sum=0.0
    for i in range(0,len(lista)):
        sum=sum+lista[i]

    return sum/len(lista)

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre + "[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 5:
        lista.append(int(random.randint(0, 5)))
        i=i+1
    return lista

A=leerLista()
imprimirLista(A,"A")
print "Promedio = " + str(promediarLista(A))

Código Python – Unión de dos Listas como Conjunto


Ejemplo de Listas en Python: Retorna la Unión de dos Listas.

# Retornar la union de a y b.

import random

def unirLista(lista_a, lista_b):

    lista_a.sort(cmp=None, key=None, reverse=False)
    lista_b.sort(cmp=None, key=None, reverse=False)
    lista_nueva=[]
    for i in lista_a:
        if i not in lista_nueva:
            lista_nueva.append(i)

    for i in lista_b:
        if i not in lista_nueva:
            lista_nueva.append(i)

    return lista_nueva

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre+"[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 5:
        lista.append(int(random.randint(0, 10)))
        i=i+1
    return lista

A=leerLista()
B=leerLista()
C=unirLista(A, B)
imprimirLista(A,"A")
imprimirLista(B,"B")
imprimirLista(C,"C")

Código Python – Intersección de Listas como Conjunto


Ejemplo de Listas en Python: Retornar la interseccion de dos listas.

# Retornar la interseccion: a y b.

import random

def intersectarLista(lista_a, lista_b):

    lista_a.sort(cmp=None, key=None, reverse=False)
    lista_b.sort(cmp=None, key=None, reverse=False)
    lista_nueva=[]
    for i in lista_a:
        for j in lista_b:
            if i == j:
                if i not in lista_nueva:
                    lista_nueva.append(i)


    return lista_nueva

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre+"[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 5:
        lista.append(int(random.randint(0, 10)))
        i=i+1
    return lista

A=leerLista()
B=leerLista()
C=intersectarLista(A, B)
imprimirLista(A,"A")
imprimirLista(B,"B")
imprimirLista(C,"C")

Código Python – Inclusión de Listas como Conjunto


Ejemplo de Listas en Python: Determinar si la primera lista está incluida en la segunda.

# Determinar si la primera lista está incluida en la segunda

import random

def estaIncluida(lista_a, lista_b):

    lista_a.sort(cmp=None, key=None, reverse=False)
    lista_b.sort(cmp=None, key=None, reverse=False)

    for i in range(0,len(lista_a)):
        if(lista_a[i] != lista_b[i]):
            return False

    return True

def imprimirLista(lista,nombre):
    for i in range(0,len(lista)):
        print nombre+"[" + str(i) + "]=" + str(lista[i])

def leerLista():
    lista=[]

    i=0
    while i < 5:
        lista.append(int(random.randint(0, 1)))
        i=i+1
    return lista

A=leerLista()
B=leerLista()
imprimirLista(A,"A")
imprimirLista(B,"B")
print estaIncluida(A, B)
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 545 seguidores

A %d blogueros les gusta esto: