Skip to content
10/05/2017 / X3MBoy

The Final User

This is the first entry written in English in my blog. I will allocate some ideas about Linux, Community and, more than anything, about Fedora.

I want to thank the Fedora Community to let me be part of this great project.

Now, the article.

The issue

We, the old linux users are used to our environment, and we should understand what can be done and what can’t be done on Linux, limitations, advantages and everything related to our OS. With the pass of time we become power users and we forgot how is to be a new user.

When users come from Microsoft Windows, they have expectations, and they have things that normal users want to do in their OS, and more important: “THEY DON’T CARE ABOUT FREEDOM”.

The Ambassadors Project

Fedora project members had an idea to bring new contributors to the project. The Ambassadors are the representative of the project and they are the one who supose to attract new contributors to the cause, they are the face of Fedora. If we think a little on this, maybe we should supose that we (the ambassadors) should be the ones who understand the Final User, but this isn’t always true. In my opinion this is because of the issue I describe above: we forgot about the feeling of coming from another OS.


Desktop Environment

For me, the best example is the Desktop. When a user comes from Windows 10, and before it has Windows 7, they ask about the Graphics Effects. They normally come to Linux with low expectations, because “Linux is Ugly“. But they don’t know that we have “Peek” since at least 7 years, or the “Task View” since 5 or 6 years, the same is with “Action Center” or “Multiple Desktops”, and a lot of the New Features of Windows.

With this, the problem with Linux is the multiple choices. But how is this a problem? Well, we, as old linux users, tend to take defensive positions all the time, and this is not the exception. A normal discussion about the Desktop Environment can last 2 or 3 hours, just saying why a DE is better than other: XFCE is light, Gnome is more productive, KDE/Plasma is better looking, LXDE is light and modern, Unity is for Ubuntu users, Shell Desktops are the future, and a long list continue. Then the issue became present: We forgot the user.


Almost all multimedia files can’t be played without restrictions in Linux, at least no with only free software. This is because codecs are usually released with restrictions, just “free to use”. Almost all distributions have a workaround for this, in the form of a non-free repository, or a 3rd party repository, but I don’t remember a Linux distribution that have non-free codecs enabled out-the-box. This usually means that extra steps needs to be taked to make things work. Then the usual answer of old time linux users became present: “It’s not free”. Again the issue: We forgot the user.

Hardware Support

This is a hard point to bring to the table. Why? Because hardware support doesn’t depends on the community, it depends on the manufacturers. But this became a problem when a new user come to an install fest and receive the answer: Your hardware is not compatible and THIS IS YOUR FAULT. Sometimes I think: Really? I remember the first time I had a computer of my own and I want to install Linux, I didn’t ask about the BIOS, or the graphic card, or the most painful, the wireless card; I was just so happy to install Linux in MY computer. I’ve passed through a lot of forums receiving “google it”, RTFM and a lot of this kind of answers. That is where the issue become present: We forgot the user.


This is one of the big “missings” of Linux. Even when there is a lot of good games for Linux, like alien arena, 0 a.d. and so on; it’s not a lie that none of the most popular games came for linux. and won’t come soon. Steam and sites like GOG or have opened a door for Linux users, and now it’s a little better to be a gamer on Linux, but still we miss some of the titles that are released on Game Conferences. But looking again to the community, some of the more common answers are: “It’s not free” or “Gaming isn’t a need”, one of the answers that make sense is “dual-boot” but then the linux users look at you like a demon or an alien and you became an outcast. Again: We forgot the user.


This is my last example. It’s no a secret that MS Office is one of the most powerful tools that is created by Microsoft. With more than 20 years in the market and with a lot of users, it’s one of the biggest reasons for people to keep MS Windows in their machines. I know that OpenOffice (now owned by Apache Foundation) and LibreOffice (by The Document Foundation) are doing great efforts to bring a suite that can replace MS Office in the people machines and both have great features, but still the race is hard against MS Office. For me, having more than 10 years using Linux, it’s still hard to replace MS Office, even with Google Docs, because some things simply aren’t mature enough or the way to work with it it’s harder or take too much time.

It’s not FLOSS

All members of any linux community, or working for any FLOSS project need to remember how is to be a new user, and to understand what are the needs of the computer’s users. We shouldn’t let the pass of time to became us indolents, and forget how is to migrate from a privative OS.

Someone that want to listen the music that he convert in mp3 from his CD, or a teen gamer that want to play the latest Diablo, or just a mom or a dad that want to read some news, some emails, maybe check the facebook to have a connection with their family, a student that put all his effort to buy a new laptop and only can afford the economic serie of any brand. That final user need to be listened, and the answer for them is not freedom. You can educate them to freedom, but you shouldn’t close the door of something they want or need just because “It’s not FLOSS”.

P.D.: Final User or End-user is the same in Spanish, sorry that I missed that.

15/04/2014 / X3MBoy

[bash-tip] Trabajando con fechas

Trabajar con fechas en una versión actual de bash es algo muy simple, el comando date de la mayoría de las distribuciones es bastante robusto (proveniente del paquete coreutils de GNU Project). Por ejemplo obtener la fecha del día previo al actual (ayer):

date -d=yesterday

Existen también formas de formatearlo según las necesidades, los parámetros se pueden leer el manual del comando (man date) pero los que yo más utilizo son los siguientes:

Parámetro Descripción
%d Día en formato dd (rellena el espacio con cero [0])
%m Mes en formato mm (rellena el espacio con cero [0])
%Y Año en formato yyyy
%D Fecha en formato americano (lo mismo que %m/%d/%y
%F Fecha completa (lo mismo que %y-%m-%d)
%y Últimos dos dígitos del año
%H Hora en  formato hh
%M Minutos en  formato mm
%S Segundos en  formato ss
%T Hora en  formato hh:mm:ss (lo mismo que %H:%M:%S)
%x Fecha en formato local

Para utilizar los parámetros se introduce un signo de suma “+” seguido de los parámetros, vale decir que lo que no es leído como un parámetro se imprime de manera literal, y el resultado es un string o cadena, esto para las asignaciones en scripts. Como pueden notar en la tabla, pueden ver la hora; es muy importante notar esto porque aunque existe el comando time, el mismo no es para mostrar la hora sino para mostrar el tiempo de ejecución de un comando o programa.


x3mboy@Liss ~ $ date +%d-%m-%Y
x3mboy@Liss ~ $ date +%D
x3mboy@Liss ~ $ date +%F
x3mboy@Liss ~ $ date +%T
x3mboy@Liss ~ $ date +%x
x3mboy@Liss ~ $ date +%D" "%T
02/05/15 10:37:09
Como pueden ver en el último ejemplo, si los parámetros van a estar separados por espacios en blanco, se debe colocar ese espacio entre comillas.

Personalmente utilizo mucho estos comandos en asignaciones de scripts, sobretodo cuando estoy trabajando con archivos que se generan diariamente, pero la razón original por la cual realicé este post es porque en versiones antiguas de bash no existe algo como la opción -d o el parámetro %x, es por ello que he tenido que aprender a manejar el comando date, pues algo que suponemos tan simple como calcular la fecha del día de ayer se vuelve algo un poco complicado. Les dejo este script que hice hace algunos años para trabajar en un BSD con el comando date, sirve para calcular el día de ayer:

Espero les sea de utilidad.

Be Free, Be Linux

26/02/2014 / X3MBoy

Comunicado a favor de la libertad y neutralidad de la red

Nosotros, los abajo firmantes, en nuestra condición de ciudadanos venezolanos, miembros de las comunidades organizadas de usuarios de Software Libre y activistas de la libertad del conocimiento y la neutralidad de la red, defendemos un Internet libre y abierto, apegándonos a la Declaración por la Libertad de Internet la cual citamos en su totalidad:

“Apoyamos procesos transparentes y participativos para regular internet y el establecimiento de cinco principios básicos:

  • Expresión: No se debe censurar internet.
  • Acceso: Promover acceso universal a redes rápidas y asequibles.
  • Apertura: Internet debe seguir siendo una red abierta donde todas las personas son libres de conectarse, comunicar, escribir, leer, ver, decir, escuchar, aprender, crear e innovar.
  • Innovación: Proteger la libertad de innovar y crear sin permiso. No se deben bloquear las nuevas tecnologías, y no se debe castigar a los innovadores por las acciones de los usuarios.
  • Privacidad: Proteger la privacidad y defender la capacidad de la gente para controlar como se utilizan sus datos y dispositivos.”


La violación al derecho de libre acceso a la información evidenciada recientemente por:

1. Restricción del acceso a los siguientes sitios Web:

1.1., que hospeda imágenes de la red social Twitter
1.2., utilizado para compartir información como texto plano.
1.3., acortador de enlaces
1.4., aplicación walkie-talkie virtual para hablar con otras personas en canales públicos y privados.
1.5. Diversos portales de noticias a nivel nacional.

Esta lista es meramente enunciativa y no restrictiva, por cuanto el bloqueo de sitios se extiende a un número bastante mayor de éstos, de aproximadamente 500; pero debido a falta de transparencia desde el ente regulador respecto a cuales son estos sitios bloqueados no se cuenta con una lista completa. Los sitios bloqueados han sido reportado por usuarios alrededor del mundo en un proceso de monitoreo constante, y verificados de igual manera.


2. La violación a la privacidad de los ciudadanos evidenciada por la instalación de un Centro Estratégico de Seguridad y Protección de la Patria (CESPPA), entre cuyas actividades, delineadas en el decreto 458 de la Presidencia de la República Bolivariana de Venezuela, publicado en la Gaceta Oficial N°:40266 del 7 de octubre de 2013 y cuyo reglamento interno se define en la resolución número 011-14 del Ministerio para el Poder Popular del Despacho de la Presidencia y seguimiento a la gestión de Gobierno de la república Bolivariana de Venezuela, publicada en la Gaceta Oficial N°: 40355 del 13 de Febrero de 2014, está la vigilancia permanente de los flujos de información, aún cuando la Constitución de la República Bolivariana de Venezuela establece el derecho inalienable a la privacidad en su artículo 48.


3. El corte generalizado del acceso a internet a una región del país por parte de la compañía nacional de teléfonos de Venezuela (CANTV) desde el día miércoles 19 de febrero de 2014 hasta el viernes 21 de febrero de 2014 evidenciado por múltiples reportes ciudadanos en el estado Táchira, en atención a que las Relatorías de Libertad de Expresión de la OEA en su comunicado R50/11 consideran el acceso a Internet parte fundamental del acceso libre a la información y expresión y por tanto necesario en el ejercicio de estos derechos humanos. Agregando que existe un precedente, presentado el 14 de abril del 2013, cuando el acceso a Internet fue cortado por 4 minutos en expresas palabras del Ministro Arreaza, en respuesta a ataques a sitios y cuentas oficiales.


4. Las repetidas y consuetudinarias violaciones a la neutralidad de la red, principio plasmado en nuestra Ley Orgánica de Telecomunicaciones, el libre acceso a la información y la prohibición de la censura previa, presentes en la Constitución de la República Bolivariana de Venezuela (art. 58 ejusdem), e incluso normas supraconstitucionales a las que el Estado Venezolano debe apegarse por haber suscrito acuerdos, entre ellos la Declaración Universal de los Derechos Humanos en su artículo 19.


Fijar nuestra posición en los siguientes términos:

1. Apoyamos la declaración de la neutralidad de la red y el acceso libre a la información como principios fundamentales para el desarrollo de nuestra nación.

2. Expresamos nuestro desacuerdo con la creación del Centro Estratégico de Seguridad y Protección de la Patria (CESPPA), fundamentado en los siguientes puntos:

2.1. Viola nuestro ordenamiento constitucional, nuestros derechos humanos y por tanto constituye un abuso de poder.

2.2 Está en contra de los ideales y principios que defendemos como parte de los movimientos de Software y Conocimiento Libre, puesto que CESPPA se configura en un ente de censura previa a partir de criterios de seguridad y defensa de la nación, contraviniendo normas constitucionales establecidas en el art. 57 ejusdem.

2.3. Es un acto irresponsable de nuestra parte como ciudadanos, usuarios y especialistas en tecnologías; no hacer de conocimiento publico nuestra opinión al respecto.

3. Expresamos nuestro desacuerdo con las acciones por parte de cualquier empresa o institución nacional y/o extranjera que puedan representar restricciones al acceso a la información.

4. Consideramos evidente la necesidad de motivar la concientización de los ciudadanos sobre las ventajas y riesgos del uso de Internet, así como el desarrollo de habilidades que les permitan tener un desenvolvimiento activo en el mismo.

5. Reconocemos la existencia de un instrumento legal en la Ley Especial Contra los Delitos Informáticos, para la protección, prevención y sanción de delitos cometidos contra sistemas que utilicen tecnologías de información, la cual sanciona el espionaje electrónico como delito contra la privacidad de las personas en sus artículos 20, 21 y 22. Consideramos que cualquier acción ejecutada por cualquier entidad en aras de protegerse o prevenir ataques informáticos debe estar enmarcada en los preceptos establecidos en esta Ley.

6. Reconocemos las potencialidades del sistema educativo, así como el crecimiento de la Fundación Infocentro, que ha hecho posible el acceso de millones de venezolanos a recursos de computación e Internet de manera libre y gratuita. Consideramos que el uso eficiente de estas herramientas pueden garantizarle a los ciudadanos el desarrollo de habilidades necesarias para un uso libre, sano y positivo de Internet y de las herramientas informáticas.

7. Consideramos que la privacidad de los ciudadanos no se puede garantizar sin hacer uso de Software libre y estándares abiertos, por lo que hacemos énfasis en la necesidad de promover el cumplimiento de la Ley de Infogobierno promulgada en Gaceta Oficial N° 40.274, que establece que todo programa informático que se desarrolle, adquiera o implemente en el Poder Público deberá ser Software Libre, con estándares abiertos, transparente y comunitario, salvo las excepciones expresamente establecidas en la Ley y previa autorización del ente competente.


Manuel Lucena Pérez, UNPLUG

Maria Leandro, Fedora

Arturo Martinez, Mozilla Venezuela

Héctor A. Mantellini, VaSlibre

Jeferson Herrera, VaSLibre

Manuel Camacho, Mozilla Venezuela

Jesús Contreras, Comunidad de Software Libre de Venezuela

Kelvin Moya, VaSlibre

Sebastián Ramírez Magrí, Mozilla Venezuela

Loris Santamaria, Comunidad de Software Libre de Venezuela

María Gabriela Pérez, UNPLUG

Alfieri Morillo , Gimp-Ve, LibreOffice-Ve

Flamel Canto, Comunidad Software Libre de Venezuela

Diego Barrios.

Luis Salazar

Eduardo Melendez

Alexis A. Sánchez O, Comunidad PinguinoVE

Julio J. Montaño C, GRULICA

Alberto Chirinos, GUDISLIP

Kleiber J Perez, GUDISLIP

Xavier Pernalete, GUDISLIP

Juan Pablo Gómez A., Comunidad de Software Libre de Venezuela

William Cabrera, Comunidad de Software Libre de Venezuela

Johan Gonzalez, Mozilla Venezuela

Eduard Lucena, UNPLUG

Oliver Hernández,Comunidad de Software Libre de Venezuela

Jonatan Mejías, Mozilla Venezuela, LibreOffice-Ve

Nelson J. Delgado Ubuntu-ve

Miguel Useche, Mozilla Venezuela

Angel Cruz,VaSLibre

Williams Campos, Gimp-Ve

David Rivero #ubuntu-ve

Cesar Bermúdez,  LUGMA

Alejandra Ortiz,VasLibre

Gloria Alvarez, GUSL

Luis Alejandro Martínez Faneyth, Comunidad de Software Libre de Venezuela

Jesús Delgado

Alberto Medrano, Comunidad de Software Libre de Venezuela

Karla Hurtado, VaSLibre


Si quieres firmar tambien en apoyo a este comunicado, puedes hacerlo acá:úblico-en-general-comunicado-a-favor-de-la-libertad-y-neutralidad-de-la-red

25/12/2013 / X3MBoy

[bash-tip] Instalando Turpial

Conversando por twitter con Wil Alvarez (@satanas82) Carlos Guerrero (@guerrerocarlos), sugirieron hacer un script de instalación de turpial (de hecho se pusieron más creativos, pero luego iremos con otros cambios), basados en el script de actualización del post anterior.

Bueno, hay muchas cosas en este script que no voy a explicar en este momento, pero lo más importante es el uso de los “if”. Les recomiendo que chequeen esto bastante bien, pues hay muchas cosas que notar en estos condicionales.

Bueno sin más preámbulo, el script:

No coloco el script directamente pues son más de 100 líneas de código.

Be Free, Be Linux

19/12/2013 / X3MBoy

[bash-tip] Actualizando turpial

Desde que comenzaron las primeras versiones públicas de turpial (el cliente de microblogging) he estado participando en las discusones del grupo de desarrolladores de tan maravillosa herramienta. Para la última versión (v3.0) he estado haciendo testing y pues para estar al día con las actualizaciones es necesario actualizar 2 cosas: libturpial, el motor que mueve todas las conexiones; y turpial, el front-end de la herramienta.

El problema es que ambas cosas están por separado en github, y hay que actualizar cada cosa por separado. Por ello me he crado un script que haga el trabajo por mí. Lo dejo por acá:

USER_HOME=$(eval echo ~${SUDO_USER})
if [ `whoami` != root ]; then
echo Please run this script using sudo

cd $USER_HOME/libturpial
git pull origin master
sudo python develop
cd $USER_HOME/turpial
git pull origin development
sudo python develop

Lo único que tiene de especial este script es que chequea el directorio del usuario antes de convertirse en root para encontrar la ruta de los directorios, lo demás es algo de git e instalación de cosas con setupotools de python. Este script requiere tener instalado sudo en su sistema, cosa que si es un debian-derivated ya viene por defecto, pero en mi sistema (Fedora) no. En estos dos SO he porbado y funciona a la perfección, teniendo cómo único requerimiento que turpial haya sido instalado siguiendo las instrucciones de la wiki de desarrollo de turpial.

Be Free, Be Linux

26/11/2013 / X3MBoy

[bash-tip] Condicionales

Una estructura muy importante a la hora de programar son los condicionales, también conocidos como if (inglés de “si” en el contexto de pregunta lógica “si voy, entonces voy en avión”). Y de eso se trata básicamente, tomar una decisión de que acciones tomar dada una condición. Este punto ya lo expliqué en los post de python, no voy a profundizar mucho en la lógica de los condicioneales, voy a ir directo a la sintaxis en bash:

if condición; then

condición es una experesión lógica, que devuelve verdadero o falso, pero en el caso de bash, que no es un lenguaje de alto nivel, evalúa 0 ó 1. Esto significa que:

if 0; then echo "Hola"

Siempre imprimirá Hola en la pantalla. También es necesario saber que para evaluar expresiones es necesario colocarlas entre comillas, y cualquier evaluación que devuelva 0 ó 1 es válida.

Tenemos una larga lista de parámetros que se pueden evaluar, cómo pueden notar en la tabla siguiente:

IMHO las más importantes son -a con la que puedes verificar si un archivo existe, -d con lo que puedes saber si es un directorio y las evaluaciones aritméticas -eq, -ne, -lt, -le, -gt y -ge que significan igual, no igual (diferente), menor, menor o igual, mayor y mayor o igual respectivamente.

Espero les sea de utilidad este pequeño tip.

Be Free, Be Linux

15/05/2013 / X3MBoy

[bash-tip] Automatizar tareas

Lo primero que hace cualquier usuario linux cuando es novel (nuevo o newbie). es personalizar los comandos con alias. Pronto descubrirá que esta prática es muy mal vista además de ser insegura, y encontrará que lo más común es tener pequeños scripts que le faciliten la vida. Lo primero que tenemos que saber es que un script simplementes son instrucciones una después de otra, tal como las instrucciones o sentencias de un lenguaje de programación.

Veamos algo rápido de sintaxis:

Comenzamos el script con algo llamado “shabang“, simplemente consiste en decirle al interprete de comandos “ con qué se come” el script. Simplemente le decimos con que programa debe interpretar las sentencias dentro del script. En este punto resalto que un script es un conjunto de sentencias o comandos, uno debajo de otro, guardados en un archivo de texto. Los que han seguido mis entradas de Python me entenderán, y ya estarán familiarizados con el “shabang“.

Mi primer script fue el siguiente:

sudo aptitude -y update
sudo aptitude -y safe-upgrade
sudo aptitude -y clean
sudo aptitude -y autoclean

Muy simple, sin estilo, pero en ese momento hacía lo que yo quería. Luego de eso, simplemente darle permisos de ejecución, y ejecutar con ./:

chmod +x

Be Free, Be Linux

02/05/2013 / X3MBoy

Post sobre bash

Leyendo un post de @phenobarbital me encontré con la frase:

¿para qué planear aplicaciones en cónsola en otro lenguaje, si bash viene integrado por defecto y es muy poderoso?

Y he recordado que tengo varios días trabajando con bash en mi empleo, incluso en distintos sistemas (Linux, HP-UX y un customized-FreeBSD). Así que me he decidio ha llevar en paralelo a los post de python, algunos post, tipo nota, de Bash. Espero que les puedan ser útiles.



Be Free, Be Linux…

11/04/2013 / X3MBoy

Python – Post 02

Volvemos con Python luego de un muy largo rato. Lo siento, y no voy a darles excusas, solo decirles que retomaré esto con un mejor hilo, mayor frecuencia y mejor contenido.

Volviendo, en esta ocasión vamos a hablar de las estructuras de datos conocidas como “colecciones”.

¿Que es una colección?

Una colección es una agrupación de datos, simples o complejos, que guardan una relación entre sí (o deberían). La forma más común de una colección que se utiliza en los lenguajes de programación son los arreglos. Un arreglo es una colección de variables de un mismo tipo que se guardan en una secuencia consecutiva de memoria, y se acceden a través de un mismo nombre. ¿Cómo se come eso? Bueno simple, veamos un ejemplo en Java:

int [] arreglo;
arreglo = new int[10];

Así, estamos definiendo un arreglo de 10 enteros. Pero ¿Cómo se accede a un valor específico? pues simple:

arreglo[0] = 10;

Pero con Python hay un pequeño detalle, que al final es bueno para nosotros: “Los arreglos no existen en Python“, o por lo menos no en la forma tradicional de usarlos en otros lenguajes de programación(1).

En Python tenemos 3 tipos de colecciones: listas, diccionarios y tuplas. Empecemos con las listas.


Las listas son lo más parecido a un arreglo que conseguián en Python. Consiste de una colección ordenada de datos de cualquier tipo, incluso otras listas. El concepto puede ser algo abstracto, así que veamos un ejemplo gráfico:

Como pueden observar en la imagen, una lista puede enlazar distintos tipos de datos en una sola estructura, cosa que no se puede hacer en lenguajes como Java ó C++. Como comenté un poco más arriba, tambien puedes tener una lista en otra lista, pudiendo hacer los conocidos “arreglos bidimensionales” con una lista que sólo contiene listas.

El operador para trabajar con listas es “[ ]” (corchete), así para crear una lista se hace de la siguiente manera:

lista = [1, 2, 3]

Quedando inicializada la lista con 3 elementos. Para acceder a un elemento de la lista se hace referencia al nombre de la variable, seguida de la posición a la que se desa acceder entre corechetes:

numero = lista[0]

Ahora la variable numero tiene el valor 1 (la posición 0 de la lista).También hay que recordar que en la mayoría de los lenguajes de programación, el primer elemento de una estructura secuencial está en la posición “0” (cero), o dicho en lenguaje C/C++ o Java: “La primera posición de un arreglo es la posición cero”. Pero acceder a cada elemento de la lista usando el operador “corchete” no es muy funcional. Normalmente se va a querer acceder a todos los elementos de la lista, uno por uno. Para eso utilizaremos el iterador de listas, el “for“, de la siguiente forma:

for numero in lista:
     print numero

Con esto, la variable número obtendrá cada uno de los valores de la lista en cada iteración o “vuelta del ciclo” y serán impresos en pantalla uno por uno. Estas serían operaciones de lectura.

Para la escritura podemos hacer varias cosas. La primera es trabajarlo estilo Java o estilo C++, de la siguiente manera:

for i in range(10):
    lista[i] = i

Como observan, esto guardará los números del 0 al 9 en la lista. Pero puede suceder que no queremos guardar un número específico de valores, es decir, nuestro arreglo aún no tiene una “dimensión” ó “tamaño“. Para estos casos, vamos a recurrir a las funciones propias de la lista.

En este punto debo decir que las listas en Python son objetos, por lo que tienen métodos asociados a ellas. Los objetos serán tratados en otro post más adelante.

Así por ejemplo podemos hacer lo siguiente:

while True:
    i = raw_input("Indique un nombre o presione enter para finalizar:\n")
    if i!='':

Luego de esto tendríamos una lista con los nombres que fueron ingresados por el teclado. No es algo muy elegante, pero por ahora funciona.

La forma más normal de ver el contenido de una lista es como se indicó en los métodos de lectura, pero el método o función “print” puede mostrar tambien el contenido completo de una lista:

print lista
['Eduard', 'Alexander', 'José', 'Carmen']

Como ven, imprime la lista tal cual se almacena en memoria, incluyendo las comillas simples que indica que son cadenas de caracteres y los corchetes que indican el inicio y el fin de la lista.

Una curiosidad, aunque es más bien una funcionalidad, es la posibilidad de utilizar números negativos como índice de la lista, así:

nombre = lista[-2]

Nos guardaría en “nombre” el valor de la penúltima posición de la lista. Lo que significa que el índice negativo significa que se recorre el arreglo de atrás hacia adelante. Quiero acotar que al valor que se coloca entre corchetes, indicando una posición del arreglo, se le conoce como “índice“, así lo llamaré de ahora en adelante.

Otra funcionalidad importante en las listas son las particiones o sublistas (en inglés el contenido lo hallarán como “slicing” que es el proceso de obterner una partición, es decir proceso de particionado). Esto es una característica bien avanzada, que nos permite crear una lista derivada de otra lista a través del operador “:”. Mejor hacemos un ejemplo para que vean la utlización:

sublista = lista[0:2]

Con esto tenemos que “sublista” será una lista que contiene los dos primeros elementos de “lista“. ¿Por qué? Pues simple, por los índices. Con el operador “:” separamos dos índices: el primero nos indica desde que posición se tomaran elementos de la lista; el segundo indica cuantas posiciones tomar desde el índice de arranque. Es decir, ese código significa que “sublista es igual a dos posiciones de lista, comenzando en la posición cero“. Se podría decir que es un resumen del código:

for a in range(2):
     sublista[a] = lista[a]

Además con un segundo operador “:” puedes indicar cada cuantas posiciones tomar un elemento de la lista, por ejemplo: si queremos tener una posición sí y una no (posiciones intercaladas) de la lista podemos hacer lo siguiente:

sublista = lista[0:3:2]

Entonces en sublista tendríamos los valores 1 y 3, dado que hemos indicado un salto de 2 posiciones. Esto es especialmente útil para listas ordenadas en funciones matemáticas como por ejemplo números pares e impares.
Adicionalmente, para hacer slicing también son válidos los índices negativos, los cuales tendrán el mismo comportamiento que se describió al principio. También es importante indicar que no se tienen que dar valores a cada parte de un particionado, es decir no se tienen que indicar los índices:

sublista = lista[-2:]

Esto me tomará los dos últimos valores de la lista, ó:

sublista = lista[1:]

Esto tomará todos los valores de lista, excepto el primero. Esto siginifica básicamente que cada parámetro de un “slicing”, es decir cada índice utilizado tiene un valor “default”, que en el caso del primer índice es 0, en el caso del segundo es la longitud de la lista y el tercero es “1” (y que cuando se hace slicing, siempre el 3er parámetro, el salto, es tomado aunque no se indíque explícitamente, sólo que en principio es tomado por default).


Casi lo olvido. Tal como les comenté más arriba, una lista puede contener otra lista, y con ella hacer una especie de arreglo bidimensional (aunque no exactamente igual), y la forma de acceder a los elementos sería usando dos veces el “[]” (Corchete).

lista = [['a','b','c'],['d','e','f'],['g','h','i']]
sublista = lista[0]
elemento = lista[0][0]

Así sublista tendíra la lista [‘a’,’b’,’c’] y elemento tendría “a”

Para la próxima edición estaremos revisando lo que son las Tuplas y los Diccionarios.


Be Free, Be Linux…

02/05/2011 / X3MBoy

Python – Post 00

Este post, debió ser el primero de la serie de post sobre programación en Python. Voy a dar una breve introducción y a explicar algunas cosas básicas del lenguaje.

Python es un lenguaje de programación que está pensado para ser un lenguaje limpio y fácil de leer. Creado por Guido van Rossum, Python es un lenguaje interpretado, orientado a objetos, con tipado dinámico, fuertemente tipado y, cómo ventaja principal, es multiplataforma.

Según sus mantenedores:

Python es un lenguaje de programación que te permita trabajar más rápidamente e integrar tus sistemas más efectivamente. Puedes aprender Python e inmediatamente ver la ganancia en productividad y costos de mantenimiento más bajos.

Igual que lo hice algún tiempo, les voy a recomendar el libro “Python Para Todos” el cual está publicado por los amigos del blog mundogeek. Es un excelente libro para comenzar a aprender Python.

También les voy a recomendar el libro “Aprenda a pensar como un programador con Python”.

Por último les dejo el enlace de las “Clases de Python de Google”, están en inglés, pero son de lo mejor.

Ahora sí, entremos un poco en el tema de Python.

Obtener Python

Pues cómo sabrán (y para los que no lo saben) soy usuario de Ubuntu, por lo que obtener python se reduce a un simpe

sudo aptitude install python-all

Lo cual instalará todo lo necesario para trabajar en Python 2.6. Si quieren Python 2.7, pues

sudo aptitude install python2.7

Y pueden experimentar Python 3:

sudo aptitude install python3-all

¿Las diferencias? Pues entre Python 2.6 y 2.7 no hay muchas diferencias para el código, la diferencia real es con Python 3. Acá trabajaremos con Python 2.7 ¿por qué? Pues cómo dice en su web:

Hay mucho más software de terceros hecho para Python 2.7 que para Python 3, todavía.

IMHO Python 3, aunque ya está bien preparado y listo, sigue siendo aún muy nuevo, además que su adopción no ha sido tan masiva debido al cambio de paradigmas tan brusco que trajo consigo.

Para descargas de versiones para otras plataformas hay que dirigerse a la “Página de descargas de Python”.

Programando Python

Lo primero a saber, es que es un lenguaje interpretado, como lo comenté al principio, por lo cual no hay que compilar el código para generar un ejecutable ni nada por el estilo. Simplemente escribes el código, le das permiso de ejecución al archivo y lo ejecutas.

Bien hasta ahora, pero viene una pregunta fundamental: ¿Con qué (IDE) programo en Python? Pues esa no es una pregunta simple, ya que va a depender de los gustos de cada quien. Mis pruebas y recomendaciones son (en orden de prioridad):

  1. vim: Sí, vim. Vi iMproved es un clon mejorado del vi de Unix. Es un editor de texto para consola, aunque cuenta con una versión para GTK. Es personalizable, y existen ya muchas personalizaciones especializadas para Python. Para mí es la mejor elección a la hora de programar, sobretodo porque puedo portar mi configuración. Un par de referencias:
  2. Scribes: es un editor minimalista para Gnome. Es muy flexible, se puede manejar todo con el teclado. Resaltado de sintaxis, auto-indentado, autocomletado, personalizable a través de themes (los puedes hacer tu mismo, pero realmente son complejos). La desventaja y que no va a desarrollarse, o por lo menos no por el creador de este excelente editor es que no soporta múltiples archivos en una sola instancia, es decir, siempre se abren los archivos en una ventana nueva, nada de pestañas, ni de segundo plano.
  3. gedit: es el editor de texto por defecto para gnome. Tiene gran variedad de plugins y themes. No tengo casi nada que decir de este editor más que, si tienes gnome y quieres programar, no tienes excusa, gedit está allí.
  4. kate: aunque no debo compararlos, kate es el homólogo de gedit en KDE. Poderoso, con gran variedad de características, muy personalizable.
  5. Geany: es un gran editor basado en GTK, que va un poco más allá de la edición de texto, pero no llega a ser un IDE. Está en algún punto en el medio, pero es una excelente opción. Resaltado de código, opción de compilación y ejecución, configuración de terminales y compiladores a utilizar, autocompletado, soporta gran variedad de archivos.
  6. eclipse: para muchos el mejor IDE, no estoy de acuerdo, pero bueno, no puedo negar que es un gran IDE, con una comunidad grande que lo soporta. En su forma normal viene preparado para programar en Java, pero con PyDev se puede preparar para programar en Python. Hay una forma un poco más simple, y es utilizando EasyEclipse, en su distribución para Python. EasyEclipse son una especie de instaladores con paquetes, parches y plugins de fácil instalación.
  7. netbeans: también un muy buen IDE para Java, que se puede extender con plugins. Hay varias formas para trabajar Python con él, como lo explican en la Wiki de Netbeans para Python, específicamente en la hoja PyhtonInstall.

Voy a dejar la lista hasta aquí, porque sino requeriría de un post sólo para hablar de IDE’s y editores de texto.

Básicas de Python

Los primeros pasos van a ser hablar de las variables, tipos de variables, y de algunas otras cosas.
Primero, Python es fuertemente tipado, lo que significa que una variable sólo puede ser tratada cómo del tipo que tiene, es decir que para utilizar las variables como de otro tipo, se tiene que hacer una conversión explícita (veremos cómo más adelante).
Segundo, Python es de tipado dinámico, lo que significa que no se requiere declarar el tipo de la variable, sino que el tipo automáticamente se asigna en tiempo de ejecución según el valor que se asigne a ella.
Ahora, de aquí en adelante me pongo linuxero. Para comenzar, python al ser un lenguaje interpretado, no genera archivos ejecutables, son los mismos archivos con el código fuente los que se necesitan para que el programa corra. En linux para que esto suceda requiere que el archivo tenga permisos de ejecución:

chmod +x

Un extra, los archivos de código python tiene extensión “.py”.

También es muy bueno comenzar tus archivos de código fuente con un hashbang indicándole a la línea de comandos que debe utilizar el interprete de Python. Así la primera línea de todos nuestros archivos de código fuente tienen cómo primera línea lo siguiente:

#!/usr/bin/env python

Con esto se logra que el interprete de comandos donde se ejecuta el programa sepa que debe utilizar el programa python y pasarle el script como parámetro. Suena complicado, pero en realidad no lo es, es así de simple: El interprete de comandos, bash es por defecto el de ubuntu y casi todas las distribuciones de GNU/Linux, no sabe que un archivo de extensión .py es un programa en Python, por lo tanto para ejecutar un programa con python hay que decirle a bash que programa utilizar para ejecutar el script. Hay varias formas de hacerlo, la primera es cómo mencione, colocando el “hashbang” y dándole permisos de ejecución y así bastaría con escribir:


Y así tendrías el script ejecutándose. La otra forma, que no requiere que el archivo tenga permisos de ejecución, ni el “hashbang” en la primera línea es invocando al programa python y dándole el archivo como parámetro:



En Python tenemos 3 tipos.

  • numericos,
  • cadena de caracteres o string,
  • booleanos.

Lo numericos se dividen en 4 tipos: enteros int, enteros long, flotantes y complejos.

  1. Los número complejos son, como lo dice su nombre, algo difíciles de entender y tratar, a menos que estes en el área de las matemáticas o un área aplicada, yo no los voy a tratar aquí, sólo les menciono que existen.
  2. Los enteros int en Python tienen un rango bastante amplio, yendo desde -2³¹ hasta de 2³¹, pudiendo así almacenar hasta 4 millardos de números; esto en plataformas de 32 bits.
  3. Los enteros long sólo están limitados por la memoria de la máquina, por lo que se recomienda no utilizarlos a menos que sea estrictamente necesario. Como en Python no declaramos las variables como en C/C++ o Java, para decirle a un entero que es de tipo long, se coloca una L mayúscula luego del valor de que se está asignando a la variable:
     entrero = 25L
  4. Los tipos flotante son los números reales, es decir, los números que tienen parte decimal. A diferencia de C/C++ o Java, todos los flotantes en Python son double (doble), es decir, tienen doble precisión, por lo que la cantidad de números que se pueden expresar utilizando este tipo de datos es mas grande.

Los booleanos sólo toman 2 valores True o False, sirven para estructuras de control, para evaluar expresiones.
Por último tenemos las cadenas de caracteres, pues son cadenas, que quieren que les diga.


Me faltaron un par de cosas. La primera, la tabla de los operadores aritméticos:

Operador Descripción
+ Suma
Resta o negación
* Multiplicación
** Exponente
/ División
// División entera
% Módulo

Y lo segundo que me falto es la asignación de las variables. En Python las variables no tienen que declararse, se crean en tiempo de ejecución (recuerdan arriba: “Tipado dinámico”), por lo que para crear una variable basta con darle un valor y automágicamente está creada con el tipo que se le asigno. Eso sí, luego que crean una variable con un tipo, no pueden cambiarla por otro, por lo menos no directamente, hay que hacer la conversión explícita. Aquí unos ejemlos rápidos:

entero = 35
cadena = "Hola Mundo"
CadenaEntero = "35"
enteroConvertidoDesdeCadena = (int)CadenaEntero
flotante = 30.5
booleano = True

Fin Actualización

Esto es lo más básico que tengo hasta ahora.

Luego seguimos, en el segundo post.


Be Free, Be Linux…