\documentclass[a4paper]{article}
\usepackage{fullpage}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{graphicx}
\usepackage{colortbl}
\usepackage {html}
\usepackage {hthtml}


\begin{document}
\begin{large}
\noindent
{\bf Prácticas de programación en python}  \\
Servicios Telemáticos 2015-2016\\
Grado en Ingeniería Telemática  \\
Universidad Rey Juan Carlos\\ 
\hturl{http://gsyc.urjc.es}
\hrule
\end{large}

\vspace{0.5cm}


%\subsection*{Cambios en el documento}
%\begin{itemize}
%\item
%\end{itemize}


\section*{Observaciones}
\begin{itemize}
\item
%Crea el fichero  \verb|~/st/practica01.txt|,
%que contendrá la memoria que escribas sobre  este segundo bloque de
%prácticas. 
%En la primera línea, indica tu nombre y login. 
%
%Si bien  es probable que este fichero lo dejes vacío
%(puesto que cuando la práctica consista en un script,
%en la memoria no es necesario escribir nada, a menos que tengas
%algún motivo para indicar algo)

Crea el directorio \verb|~/st/practica01| donde escribirás el resto de ficheros de esta práctica. 
Recuerda que la recogida de las prácticas 
se hará automáticamente el dia del examen, así que es muy importante que respetes al pie de la letra todos los
nombres de ficheros y directorios que indiquen todos los enunciados. 
%\item
%Haz que este directorio sea un repositorio git y vete metiendo en él todos los scripts, según los vayas escribiendo.

\end{itemize}

\section*{Práctica 1.1. Hola Mundo, listas }

Vamos a empezar por un script muy sencillo que será poco más que un \emph{hola mundo} sobre
el uso de listas.
Ponle como nombre
\verb|~/st/practica01/cola.py|.
\begin{enumerate}
\item
	Simula la lista de espera de clientes en la caja de un supermercado
Define dos listas: \verb|caja01| y 
	\verb|caja02|

\item
	Mediante sentencias básicas de python, vete añadiendo clientes (elementos) a 
	\verb|caja01| y 
	\verb|caja02|. Imprime de vez en cuando la lista

\item
	Un cliente desiste y abandona la cola

\item
	Un cliente tiene una compra muy pequeña y los demás le permiten ponerse el primero

\item
	Se abre la caja03.
	Los clientes de la 
	caja02 pasan en orden a la 
	caja03. Esto es, cambian de caja los que ocupan las posiciones segunda, cuarta, sexta...  No uses bucles, simplemente escribe unas
	pocas líneas moviendo unos pocos elementos. No modifiques la caja01.

\item
	En un arrebato de injusticia, invierte el orden los clientes en la caja01.

\item
	Con una sentencia \verb|if|, haz que si existe un cliente llamado Ernesto en caja01, pase a ser el primero de la cola. Muestra un mensaje
	que diga \emph{Ernesto pasa de la posición n a la 1}, donde n es la posición que ocupaba inicialmente. En este mensaje, usa la numeración 
	propia del lenguaje natural (que empieza en 1, no en 0)

\item
	Crea una lista llamada \emph{linea\_de\_cajas}
	que contenga todas las cajas (las listas de los apartados anteriores). Será una lista cuyos elementos serán a su vez, listas.

\item
	A partir de linea\_de\_cajas, empleando bucles, muestra un informe similar a este:
	\begin{verbatim}
Caja con 2 clientes: Ernesto, Luis
Caja con 3 clientes: Ana, Pedro, María
Caje con 2 clientes: Marta, Juan
	\end{verbatim}

\item
	Modifica linea
	linea\_de\_cajas, para que pase a ser una lista de cadenas (no una lista de listas). Cada elemento será una única cadena, formada por los clientes 
	de la caja, separados por el caracter punto y coma.
	

\end{enumerate}



\section*{Práctica 1.2. Introducción a los diccionarios}
Escribe el 
\emph{script}
\verb|~/st/practica01/prueba_diccionarios.py|, que

\begin{enumerate}
\item
Defina un diccionario donde la clave sea un nombre de ciudad o provincia, y 
el valor, una lista de comidas o bebidas típicas de ese lugar.

\item
Añada nuevos elementos al diccionario.

\item
Añada nuevos elementos a alguna de las listas

\item
Defina la lista \verb|alcoholicas| con elementos como \verb|vino, sidra, cerveza|. 
Borre del diccionario todas las bebidas incluidas en esta lista.

\item
Defina la lista \verb|comunidad_valenciana| con los elementos \verb|valencia, alicante, castellon|. 
En el caso de que en el diccionario esté alguna de estas provincias, le
añade como plato típico \verb|paella|

\item
Borre todas las entradas con claves incluidas en  \verb|comunidad_valenciana|

\item
Defina la función \verb|muestra_alfabetico|
que muestre el contenido del diccionario en un formato apropiado para que lo lea un humano
(esto es, bien tabulado, sin corchetes, etc),
por orden alfabético de las claves

\item
Defina la función \verb|muestra_por_longitud|
que muestre el contenido del diccionario en un formato apropiado para que lo lea un humano,
ordenado por el número de elementos de las listas


\end{enumerate}

\section*{Práctica 1.3. Introducción a las funciones}

Escribe el script
\verb|~/st/practica01/redondea_nota.py|, donde declararás y probarás la
función \verb|redondea_nota|. Esta función recibirá dos parámetros:
\verb|nota| y
\verb|modo|. Devolverá una cadena.

\begin{itemize}
	\item
Nota será la nota numérica de un estudiante, calificada de 0 a 10. 

	\item
La cadena
devuelta será la calificación en forma de cadena (suspenso, aprobado, matrícula de honor... emplea
las categorías que quieras).

	\item
El parámetro 
\verb|modo| podrá contener las cadenas
\verb|normal|,
\verb|laxo| o
\verb|estricto|. Según el modo, los criterios de calificación serán distintos. Por ejemplo,
en modo estricto, una nota de 4.99 sería un suspenso. En modo laxo, una nota de 4 podría ser un aprobado.

\item
Aplica los criterios que consideres oportunos, de forma que la correspondencia entre
la nota numérica y la calificación final sea más o menos estricta, según el parámetro
modo.

\end{itemize}



\section*{Práctica 1.4 Ordenación}
 
En esta práctica escribirás un script
llamado \verb|~/st/practica01/ordena.py|, donde probarás cómo ordenar una lista con el método sort(),
definiendo una función para personalizar el órden.


    \begin{itemize}
    \item
La estructura de datos a ordenar será una lista de listas, por ejemplo

  \begin{footnotesize}
  \begin{verbatim}
[ [1,3], [5], [0], [2,2,2] ]
  \end{verbatim}
  \end{footnotesize}


Una vez ordenada, su estado será

  \begin{footnotesize}
  \begin{verbatim}
[ [0, [1,3], [5], [2,2,2] ]
  \end{verbatim}
  \end{footnotesize}
    \item
Si hubiera listas que suman igual, primero debe aparecer la que tenga menor número de elementos

    \item
Si alguna lista tuviera un elemento no permitido, esto es, algo diferente a un número, el script
morirá (Usa \verb|raise SystemExit|). La lista vacía es un elemento no permitido.

\item
Aunque esto es una prueba, hazlo razonablemente \emph{bien}. Define las funciones que necesites. No uses
más de 2 o 3 sentencias if anidadas.
    \end{itemize}






\section*{Práctica 1.5 Cambia\_nombre.py}
En esta práctica escribirás un script
llamado \verb|~/st/practica01/cambia_nombre.py|, que, en el caso de que sea posible,
modificará los nombres de todos los ficheros y directorios contenidos en ciertos directorios,
para usar caracteres que
sabemos que no causarán ningún problema en ningún sistema de ficheros: minúsculas, números, guiones, 
barras bajas y puntos.

\begin{enumerate}
\item
Recibirá como argumento uno o más directorios. Mostrará un error por stderr y
morirá si
alguno de los argumentos no es un directorio. En caso de no recibir ningún argumento,
se entiende que trabaja sobre el directorio actual

\item
El script intentará cambiar el nombre a todos los ficheros y directorios
del directorio o directorios indicados

\item
Solo trabajará con el directorio actual, 
no recorrerá directorios y subdirectorios recursivamente

\item
El cambio de nombre que intentará hacer será:
    \begin{itemize}
    \item
Reemplazar los espacios por barras bajas (\verb|_|)
    \item
Cambiar todas las mayúsculas por minúsculas
\item
Reemplazando la eñe por \verb|nn| , \verb|ny| , \verb|gn| o alguna combinación similar
\item
Reemplazando las vocales con tilde por la misma vocal sin tilde
\item
Reemplazar cualquier carácter \emph{raro}, como \verb)|@#~!"·$%&) etc por un punto o una barra
baja
    \end{itemize}
\end{enumerate}

Decimos \emph{intentar} porque tal vez este cambio sin más no sea posible. Por ejemplo,
un directorio que contenga los ficheros 
\verb|HOLA!|, 
\verb|hola!| y
\verb|hola.|

(Son tres nombres legales, pero al intentar cambiarlo, los tres generarían el mismo
nombre simplificado. A esta situación la denominaremos \emph{colisión})


Práctica básica: Cuando se de un caso como este, el script indicará por salida estándar que ciertos
ficheros no se modifican. Se limitará a cambiar lo que sea posible cambiar. 

Prática optativa: En caso de colisión, el script buscará diferentes nombres para todos
los ficheros. Por ejemplo añadiendo \verb|.001|, \verb|.002|, etc, entre el nombre
y la extensión  (si existe)


Busca en el módulo os.path la función que te indica si un fichero es un directorio. Para
sustituir caractes en una cadena, puedes reconstruir una cadena carácter a carácter o
usar métodos de los objetos string.


\section*{Práctica 1.6 optparse / argparse}
En este ejercicio mejorarás el script del apartado anterior, usando la librería
\verb|optparse| 
o la librería
\verb|argparse|. Cualquiera de las dos es válida pero argparse es preferible, es más moderna
y su uso algo más sencillo.

    \begin{enumerate}
    \item
Una vez que hayas acabado el script anterior, hazle una copia llamada
\verb|~/st/practica01/cambia_nombre0.py|

Ahora añadirás funcionalidad a

\verb|~/st/practica01/cambia_nombre.py|

Observa que cambia\_nombre0.py será el script especificado en la práctica 1.5 y \verb|cambia_nombre.py|, el script de esta
práctica.
    \item

Usando
\verb|optparse|
o
\verb|argparse|
, haz que

\verb|~/st/practica01/cambia_nombre.py|
acepte los siguientes flags:

  \begin{footnotesize}
  \begin{verbatim}
-h --help          Mostrar un mensaje de ayuda
-r --recursive     Recorrer los directorios recursivamente
-s --spaces        Reemplazar los espacios por barra baja
-c --case          Reemplazar las mayúsculas por minúsculas
-n --enne          Reemplazar la eñe por otra combinación de letras
-t --accent        Reemplazar las vocales con acento
-w --weird         Reemplazar los caracteres "raros"
  \end{verbatim}
  \end{footnotesize}

Si el script no recibe ni -s ni -c ni -n ni -t ni -w, entonces se comportará
como si hubiera recibido las opciones -s, -c,  -n, -t, -w. Esto es, se
comportará como \verb|cambia_nombre0.py|


    \end{enumerate}

\section*{Práctica 1.7. Ficheros}
En esta práctica mejorarás el script ordena.py, añadiéndole lectura y escritura de ficheros.
Haz una copia de

\verb|~/st/practica01/ordena.py|

ponle como nombre

\verb|~/st/practica01/ordena0.py|

y ahora añadirás funcionalidad a 

\verb|~/st/practica01/ordena.py|

Observa que ordena0.py será el script especificado en la práctica 1.4 y ordena.py, el script de esta
práctica.


Este script recibirá un fichero de texto con la misma estructura de datos que ordena0.py,
pero representado en forma de texto, de forma que la lista de listas será un fichero de líneas,
con elementos separados por comas.

Por ejemplo, la estructura

  \begin{footnotesize}
  \begin{verbatim}
[ [1,3], [5], [0], [2,2,2] ]
  \end{verbatim}
  \end{footnotesize}

se representaría así

  \begin{footnotesize}
  \begin{verbatim}
1,3
5
0
2,2,2
  \end{verbatim}
  \end{footnotesize}

De la misma forma, una vez ordenada la estructura, se representaría así

  \begin{footnotesize}
  \begin{verbatim}
0
1,3
5
2,2,2
  \end{verbatim}
  \end{footnotesize}


    \begin{itemize}
    \item
El script leerá el texto desde el fichero indicado con la opción \verb|-i --input|. El valor por omisión será
la entrada estándar. Esto es, si no se indica ningún fichero, leerá desde stdin. 

    \item
El script escribirá el texto en el fichero indicado con la opción \verb|-o --output|. El valor por omisión
será la salida estándar. Esto es, si no se indica ningún fichero, escribirá en stdout

	\item
En caso de que el script no pueda leer o escribir, deberá capturar la excepción correspondiente
y mostrar un mensaje personalizado por la salida de error.

\item
La opción \verb|-h --help| debe mostrar un mensaje de ayuda

\item
Si el fichero de entrada contiene alguna línea en blanco, en cualquier lugar, será válido. 

\item
Si hay espacios o tabuladores antes o después de las comas, también será válido

\item
Si una línea acaba en coma, será incorrecta

\item
Si alguna línea contiene un elemento que no sea un número natural (incluyendo el cero), será incorrecta

\item
Si alguna línea no cumple con la especificación, el script debe mostrar el nº de línea incorrecto
(contando las líneas desde 1), mostrar el texto de la línea incorrecta y terminar
    \end{itemize}


\end{document}

\section*{Práctica 1.8. Python idiomático}
Crea el fichero  \verb|~/st/practica01.txt| y escribe en él la respuesta
a este apartado de las prácticas. En la primera línea escribe tu nombre y login.
Observa que este fichero está contenido en 
\verb|~/st|, no en 
\verb|~/st/practica01|.

Lee el artículo 
\emph{Programa como un Pythonista: Python Idiomático}.
(Recuerda que \emph{Google es tu amigo}.
No es necesario que estudies y entiendas ahora todas las técnicas descritas aquí.

¿Cuáles son las 2 recomendaciones que te han parecido más interesantes?
Escribe un ejemplo con cada recomendación
y cópialo en
\verb|~/st/practica01.txt| 





%%-------------------


\section*{Práctica 2.10 (optativa)}

Haz un script en python llamado \verb|~/st/practica01/localiza_nombres.py| que localice
todos los nombres (todos los enlaces duros) de un fichero en un directorio y sus subdirectorios, recursivamente.
 Recibirá como primer argumento el nombre a buscar, que deberá ser un fichero.
El segundo argumento será el directorio donde se hará la búsqueda.

Ejemplo:

\verb|localiza_nombres.py ~/mi_fichero ~ |

Busca en el directorio \verb|~| y en todos sus subdirectorios, nombres del fichero
\verb|~/mi_fichero|. Los mostrará por la salida estándar. Si el fichero que se busca
se encuentra dentro del directorio, se mostrará también.

Si los argumentos no son los previstos, el script mostrará un mensaje de error por stderr y morirá.

Sugerencia: 
Busca en \verb|os.path| la función adecuada para detectar dos ficheros con el mismo nombre. 
Aunque es menos recomendable, también puedes basarte en
\verb|ls -i|.





\section*{Práctica 2.11. Introducción a las Regex (optativa)}
Escribe el script
\verb|~/st/practica01/test_locales.py| 

    \begin{enumerate}
    \item
Define 4 regexp sencillas, distinta a las vistas en clase pero con nivel de dificultad similar. Al menos tienes que usar
una vez grupos y regex multilínea. Tienen que ser distintas a las de tus compañeros.

Ejemplos: Números de expediente de alumno de la urjc, cuentas bancarias, tarjetas de crédito, dni, número de socio de algun
organismo al que pertenezcas, elemento de algún lenguaje de programación, número de teléfono con alguna característica,
resultado de un ls, ps, fichero de configuración de linux, matrícula de coche, código postal, número de la seguridad
social, apellido \emph{conflictivo} (por ser compuesto o incluir varias palabras).

Sugerencia: Busca algún tipo de número de teléfono \emph{gold}. 
Ejemplo: 678 78887 es un número de este tipo porque es \emph{capicúa}. Un número puede ser \emph{gold} por muchos
otros motivos diferentes: correlativos, pares, impares, resultado de operaciones ariméticas, combinaciones de lo anterior...


    \item
Comprueba si el flag \verb|re.LOCALE| funciona como debe

\item
Práctica opcional: prueba este flag en una máquina Windows

    \end{enumerate}



\section*{Práctica 2.12. cambia\_ip.py (optativa)}
Supongamos que tenemos que cambiar las direcciones IP de los ordenadores
de los laboratorios de GSyC. Concretamente, cambiaremos los primeros tres octetos
de cada dirección, manteniendo el cuarto.

Escribe un script llamado \verb|~/st/practica01/cambia_ip.py| que recibirá

\begin{itemize}
\item
Como primer argumento, el prefijo del nombre de las puestos a modificar (alpha, beta,
gamma o  delta)

\item
Como segundo argumento, los tres primeros bytes de la nueva dirección IP

\item
Por omisión trabajará sobre el fichero \verb|/etc/hosts|, pero con la opción
\verb|-i input_file| se podrá cambiar el fichero de entrada

\item
Por omisión escribirá la salida en \emph{stdout}, pero con la opción
\verb|-m| modificará el fichero original (mostrando el error adecuado en caso
de no ser posible)

\item
Con la opción \verb|-h|, el script mostrará un mensaje de ayuda

\item
Puedes implementar las opciones largas al estilo gnu (\verb|--help, --input|, etc)
como te parezca oportuno
\end{itemize}

Ejemplo
  \begin{footnotesize}
  \begin{verbatim}
cambia_ip alpha 192.168.1
cambia_ip -m -i ~/st/practica01/hosts  eta 10.0.0.
  \end{verbatim}
  \end{footnotesize}

Observaciones
\begin{itemize}
\item
Solo se deben modificar aquellas línea que contengan
una dirección IP, nombre de máquina con dominio y/o nombre de máquina
sin dominio.  (Esto es, la dirección es obligatoria y debe aparecer
en primer lugar, el nombre
puede aparecer con dominio, sin él o de ambas formas, en cualquier orden).
El separador entre estos campos es uno o más espacios o tabuladores.

\item
El script no debe confundir eta con beta, delta, etc

\item
El segundo argumento puede acabar en punto o no. Pero si no tiene el formato 
adecuado, se mostrará el error correspondiente. El script debe comprobar que cada
octeto no sea mayor de 255

\item
Puedes suponer que las líneas de \verb|/etc/hosts| son correctas o bien,
opcionalmente, hacer las comprobaciones que estimes oportunas
(que sean verdaderas direcciones IP, que el nombre con dominio coincida con
el nombre sin dominio, etc)
\end{itemize}


\end{document}

\section*{Práctica 2.5. mueve\_subtitulos.py}

Los subtítulos son una opción muy conveniente para ver vídeos
en un idioma que no dominamos. En los formatos de vídeo antiguos,
como el VHS, la única opción para verlos era integrarlos en
la imagen, \emph{pegados} al resto del vídeo. Pero formatos
más modernos como el DVD permiten que el usuario los cambie
a su conveniencia.
Los formatos de vídeo para ordenador, como el avi o el
matroska (mkv) permiten que el reproductor muestre o
no ciertos subtítulos. Uno de los formatos más populares
es el .srt, lo soportan diversos reproductores. Por ejemplo, VLC,
que es uno de los mejores, libre y multiplataforma.
Si reproducimos el fichero \verb|pelicula.avi|, VLC
buscará un fichero \verb|pelicula.srt|. En caso de que lo
encuentre en el mismo directorio que la película, mostrará
los subtítulos.

En 
\htlink{este enlace }{http://gsyc.urjc.es/~mortuno/st/pelicula.srt}
puedes encontrar un ejemplo de fichero \verb|.srt|, verás que
tiene un formato muy sencillo:
para cada subtítulo, indica hora, minuto y segundo de su
aparición y de su desaparición.
Aunque no es imprescindible para hacer la práctica, si quieres
probarla bien, encontrarás el fichero \verb|.avi| correspondiente
en pantuflo, en \verb|/var/tmp/st/pelicula.avi|


En páginas web como \verb|subsecene.com| podemos encontrar subtítulos
de muchas películas y series de televisión. Con las series, hay
un problema: los subtítulos pueden corresponderse con una versión
del vídeo levemente distinta, por corresponderse a una emisión
en televisión o un dvd o bluray diferente.
Así, podemos encontrarnos con que los subtítulos aparezcan ligeramente
antes o ligeramente después del momento adecuado.

En esta prática escribirás el script 
\verb|~/st/practica01/mueve_subtitulos.py|, que modificará
un fichero
\verb|.srt|

\subsection*{Práctica básica}

\verb|mueve_subtitulos.py <fichero.srt> <segundos>|

Recibe como primer argumento un fichero srt, como segundo
argumento un número de segundos. Si es un número positivo,
los subtítulos se retrasarán el tiempo indicado.
Si es negativo, se adelantarán.

\begin{itemize}
\item
Si falta algún parámetro o si no se puede leer o escribir algún fichero,
el script mostrará el error correspondiente

\item
Por omisión, el script modificará el fichero original.
A menos que se indique otro fichero con la opción \verb|-o output_file| o
con \verb|--output_file output_file|

\item
En caso de modificar el fichero original, 
el script guardará  en el mismo directorio una copia
de la versión sin modificar, con extensión \verb|.srt.bak|. A menos que
se invoque con la opción 
\verb|-n| o con la opción \verb|--no_bak|
\end{itemize}


\subsection*{Práctica opcional}
Puede haber ficheros donde el desfase no sea homogéneo:
Por ejemplo podría ser de 1 segundo al comienzo de la película
y 4 segundos al final.

\verb|mueve_subtitulos.py fichero.srt  --start 1  --end -3 |

Mueve los rótulos para corregir un desfase de 1 segundo al inicio, menos 3 segundos al
final y en cada punto intermedio, el 
 desfase proporcional correspondiente.


Si lo deseas, también puedes introducir más flexibilidad. Por ejemplo: un desfase de
\verb|x| segundos en $t_0$, \verb|y| segundos en  $t_1$, \verb|z| segundos
en $t_3$, etc. En este caso, pasa los parámetros como estimes oportuno.


\end{document}

%%-------------------


\section*{Práctica 2.3}

Haz un script en python llamado \verb|~/st/practica01/localiza_nombres.py| que localice
todos los nombres (todos los enlaces duros) de un fichero en un directorio y sus subdirectorios, recursivamente.
 Recibirá como primer argumento el nombre a buscar, que deberá ser un fichero.
El segundo argumento será el directorio donde se hará la búsqueda.

Ejemplo:

\verb|localiza_nombres.py ~/mi_fichero ~ |

Busca en el directorio \verb|~| y en todos sus subdirectorios, nombres del fichero
\verb|~/mi_fichero|. Los mostrará por la salida estándar. Si el fichero que se busca
se encuentra dentro del directorio, se mostrará también.

Si los argumentos no son los previstos, el script mostrará un mensaje de error por stderr y morirá.

Sugerencia: 
Busca en \verb|os.path| la función adecuada para detectar dos ficheros con el mismo nombre. 
Aunque es menos recomendable, también puedes basarte en
\verb|ls -i|.


\end{document}


\section*{Práctica 2.5}
Busca en la libraría de estándar de python la documentación del módulo
\emph{signal}, que permite manejar las señales asíncronas de los procesos Unix.
(Las que envías desde la shell con el mandato \verb|kill|).
Escribe el script
\verb|~/st/practica01/cola.py|

\begin{enumerate}
\item
Simulará una cola de compradores en la caja de
un supermercado. La cola será un objeto global. Define las siguientes funciones 

\begin{itemize}
\item
\verb|llega_cliente(nombre_comprador)|. Añade un cliente a la cola
\item
\verb|cliente_pagando()|. Extrae un cliente de la cola
\item
\verb|imprime_cola()|. Muestra por stdout el contenido 
de la cola, en formato legible para una persona  
\end{itemize}


\item
Cada cliente será una cadena, (el nombre del cliente).
\item
Haz que las funciones verifiquen que realmente el argumento es una cadena,
en caso contrario, el script debe indicarlo por \emph{stderr} y finalizar.
\item
Cuando el script en ejecución reciba la señal SIGUSR1, invocará a la
función 
\verb|llega_cliente(nombre_comprador)|

\begin{itemize}
\item
Los nombres de comprador se irán tomando de los usuarios de la máquina, tal y como aparecen
en \verb|/etc/passwd|
\item
A continuación, imprimirá la cola
\item
Cuando todos los usuarios del fichero \verb|/etc/passwd| hayan entrado en la cola, el
programa finalizará.
\end{itemize}


\item
Cuando el script en ejecución reciba la señal SIGUSR2, invocará a la
función 
\verb|cliente_pagando()|, y a continuación
imprimirá la cola.

\end{enumerate}




\section*{Optativas}


Edita el fichero \verb|~/st/optativas.txt|. 
\begin{itemize}
\item
Describe aquí cualquier
optativas que hayas hecho relacionada con esta práctica.

Describe cualquier
aspecto de tu práctica que te parezca de especial calidad, todos los motivos por los que creas que
tu práctica merece una calificación mejor que \emph{apto} 
(comprobaciones adicionales, funcionalidad extra, etc)

\item
Si no has hecho ninguna optativa, simplemente indica  \emph{sin optativas}

\item
Usa este mismo fichero para describir cualquier mejora que hagas en 
prácticas posteriores

\end{itemize}


\end{document}




\section*{Práctica 2.5}
Busca en la libraría de estándar de python la documentación del módulo
\emph{signal}, que permite manejar las señales asíncronas de los procesos Unix.
(Las que envías desde la shell con el mandato \verb|kill|).
Escribe el script
\verb|~/st/practica01/cola.py|

\begin{enumerate}
\item
Simulará una cola de compradores en la caja de
un supermercado. La cola será un objeto global. Define las siguientes funciones 

\begin{itemize}
\item
\verb|llega_cliente(nombre_comprador)|. Añade un cliente a la cola
\item
\verb|cliente_pagando()|. Extrae un cliente de la cola
\item
\verb|imprime_cola()|. Muestra por stdout el contenido 
de la cola, en formato legible para una persona  
\end{itemize}


\item
Cada cliente será una cadena, (el nombre del cliente).
\item
Haz que las funciones verifiquen que realmente el argumento es una cadena,
en caso contrario, el script debe indicarlo por \emph{stderr} y finalizar.
\item
Cuando el script en ejecución reciba la señal SIGUSR1, invocará a la
función 
\verb|llega_cliente(nombre_comprador)|

\begin{itemize}
\item
Los nombres de comprador se irán tomando de los usuarios de la máquina, tal y como aparecen
en \verb|/etc/passwd|
\item
A continuación, imprimirá la cola
\item
Cuando todos los usuarios del fichero \verb|/etc/passwd| hayan entrado en la cola, el
programa finalizará.
\end{itemize}


\item
Cuando el script en ejecución reciba la señal SIGUSR2, invocará a la
función 
\verb|cliente_pagando()|, y a continuación
imprimirá la cola.

\end{enumerate}




\section*{Optativas}


Edita el fichero \verb|~/st/optativas.txt|. 
\begin{itemize}
\item
Describe aquí cualquier
optativas que hayas hecho relacionada con esta práctica.

Describe cualquier
aspecto de tu práctica que te parezca de especial calidad, todos los motivos por los que creas que
tu práctica merece una calificación mejor que \emph{apto} 
(comprobaciones adicionales, funcionalidad extra, etc)

\item
Si no has hecho ninguna optativa, simplemente indica  \emph{sin optativas}

\item
Usa este mismo fichero para describir cualquier mejora que hagas en 
prácticas posteriores

\end{itemize}


\section*{Práctica 2.1. Hola Mundo, objetos básicos}

Haz un script llamado
\verb|~/st/practica01/holamundo01.py|
en el que pruebes todo lo visto en clase
del tema python\_I hasta diccionarios, incluidos: esto es, ejemplos similares pero distintos a los que 
muestran las transparencias. 

Las instrucciones que generen errores, elíminalas con un comentario claro,
para que el script se pueda ejecutar hasta el final

\end{document}
\section*{Práctica 2.2. Hola Mundo, cadenas unicode, sentencias de control, ámbito y visibilidad de nombres de objetos}
Haz un script llamado
\verb|~/st/practica01/holamundo02.py| en el que pruebes todo lo visto en clase
del tema python\_I sobre: 
cadenas unicode, if, for y while, así como
 el ámbito y visibilidad de objetos mutables e inmutables,
esto es, su uso como objetos globales, locales o parámetros de funciones.


\section*{Práctica 2.3. Ficheros, excepciones y llamadas a la shell}
Haz un script llamado
\verb|~/st/practica01/holamundo03.py| para probar el manejo de ficheros,
de excepciones, llamada a la shell, el manejo de ficheros y obtención de
variables de entorno. Todo de forma similar a la mostrada en las transparencias.






