Posts Tagged ‘Programación’

h1

[bash-tip] Trabajando con fechas

15/04/2014

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.

Ejemplos:

x3mboy@Liss ~ $ date +%d-%m-%Y
05-02-2015
x3mboy@Liss ~ $ date +%D
02/05/15
x3mboy@Liss ~ $ date +%F
2015-02-05
x3mboy@Liss ~ $ date +%T
10:37:06
x3mboy@Liss ~ $ date +%x
05/02/15
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:

https://gist.github.com/X3MBoy/e934c967eac98b6d9c86

Espero les sea de utilidad.

Be Free, Be Linux
X3MBoy

h1

[bash-tip] Instalando Turpial

25/12/2013

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:

http://paste.ubuntu.com/6636151/

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

Be Free, Be Linux
X3MBoy

h1

[bash-tip] Actualizando turpial

19/12/2013

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á:


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

cd $USER_HOME/libturpial
git pull origin master
sudo python setup.py develop
cd $USER_HOME/turpial
git pull origin development
sudo python setup.py 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
X3MBoy

h1

[bash-tip] Condicionales

26/11/2013

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:
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html#tab_07_01

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
X3MBoy

h1

[bash-tip] Automatizar tareas

15/05/2013

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:

#!/bin/bash
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 actualizar.sh
./actualizar.sh

Be Free, Be Linux
X3MBoy

h1

Post sobre bash

02/05/2013

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.

 

Saludos,

Be Free, Be Linux…

h1

Python – Post 02

11/04/2013

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.

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!='':
        lista.append(i)
    else:
        break

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).

Actualización

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.

Saludos,

Be Free, Be Linux…