Blog personal

Gonzalo Murillo

Author: gonzalo (page 1 of 7)

Una mala gripe que había que pasar

A veces es necesario ponerse enfermo… solo durante un breve periodo de tiempo… justo el necesario para valorar todo lo que tenemos por el “simple hecho” de estar sanos. Solo quizás por comprender lo frágil y arbitrárea que es la salud. La gripe de 2018 ha sido fuerte, muy fuerte, y me ha alcanzado de lleno. No recordaba haberlo pasado tan mal desde hace años, y no desde luego, por una gripe.

Ahora que parece que me recupero lentamente, pienso en lo afortunado que soy por tener salud, y por que la tengan aquellas personas que están a mi alrededor y a las que tanto quiero.

 

Useful documents about TCP / IP

The following documents cover the basics of TCP/IP troubleshooting:

TCP Tips and Tricks

Advanced TCP Stuff

Command Line Tools

BI-11_Inside_the_TCP_Handshake

One of the best presentations about basic stuff:

B5 – TCP Analysis – First Steps

An excellent source of information is SharkFest retrospectives

NFS version 3

https://docs.oracle.com/cd/E19620-01/805-4448/z4000027624/index.html
https://tools.ietf.org/pdf/rfc1813.pdf

Estimación de zonas

 

John Carmack interviews

This is a document with John Carmack interviews

http://fd.fabiensanglard.net/doom3/pdfs/johnc-interviews.pdf

Reamde de Neal Stephenson

Me gusta la ciencia ficción y mis autores favoritos son Neal Stephenson , Willian Gibson y Bruce Sterling.

Empecé a leer la novela “REAMDE” de Stephenson durante un viaje a Noruega en 2013, y estamos acabando 2017, ¡así que he tardado casi cuatro años en leerla!

Este retraso no es debido a que no me gustara, sino que al  haberla leído de forma tan relajada, he tenido que empezar varias veces desde el principio para recordar la trama y personajes principales.

Una novela, desde mi punto de vista, muy recomendable, con el particular estilo de Neal de mezclar e interrelacionar muchos tecnologías y conceptos diferentes.

Estilo barroco, humor y tecnología ¡ La he disfrutado!

A por la siguiente, que posiblemente será Criptonomicón, otra novela que dejé inconclusa.

 

 

¿Cuál es la forma más Pythonica de abrir un fichero?

En Python se habla de que algo es “Pythonic” o “Pythonica” como yo lo he traducido,  cuando cumple con la filosofía del lenguaje Python.

¿Y cuál es dicha filosofía?

Muy sencillo, si abrimos el interprete de Python y tecleamos “import this”, lo veremos:

>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren’t special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one– and preferably only one –obvious way to do it.

Although that way may not be obvious at first unless you’re Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it’s a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea — let’s do more of those!

>>>

Así que algo es “Pythonic” o “Pythonico” si cumple el Zen del lenguaje Python.

Partiendo de esa premisa, ¿cuál es la forma más “Pythonica” de usar ficheros?

Supongamos que queremos leer de un fichero.
La primera forma en la que pensamos, sería algo así:

f = open('file.txt')
a = f.read()
print a
f.close()

Sin embargo esta forma, no es considerada Pythonica

¿Por qué motivo?

Porque si ocurre una excepción el fichero no será cerrado.
¿Cuál es entonces la forma “Pythonica” de hacer esto?

Con la sentencia with

with open(‘file.txt) as f:
for line in f:
print(f)

Lo que asegura with es que si se produce cualquier excepción dentro del bloque with, el fichero se cerrará, y por eso se considera la forma Pythonica de hacerlo.

Función enumerate en Python

La función enumerate es una función incorporada al propio lenguaje Python que permite añadir un contador a un elemento iterable.

Veamos un ejemplo:

Supongamos que tenemos la siguiente lista que contiene frutas

frutas=[‘pera’,’manzana’,’platano’,’ciruela’,’fresa’]

Queremos recorrerla, e indicar el número de ocupa esa posición dentro de la lista.

¿Cómo conseguimos hacer esto en Python?

Con la función incorporada enumerate

for pos, fruta in enumerate(frutas):
print(pos,fruta)

Si ejecutamos el código anterior, obtenemos la siguiente salida:

/usr/bin/python2.7
(0, ‘pera’)
(1, ‘manzana’)
(2, ‘platano’)
(3, ‘ciruela’)
(4, ‘fresa’)

Como podemos apreciar el contador empieza en 0. Si queremos que el contador empiece en otro número cualquiera, podemos indicárselo a la función enumerate.

Supongamos que queremos que empiece en 1, en lugar de en 0.

Tendríamos que indicárselo a la función enumerate de la siguiente forma:

for pos, fruta in enumerate(frutas,1):
print(pos,fruta)

Esto cambiaría la salida del programa del siguiente modo:

/usr/bin/python2.7
(1, ‘pera’)
(2, ‘manzana’)
(3, ‘platano’)
(4, ‘ciruela’)
(5, ‘fresa’)

Process finished with exit code 0

Como podemos ver el contador en este lugar empieza en 1, y no en 0.

Bucles en Python al estilo C

La forma habitual de recorrer los elementos de un conjunto en Python es la siguiente

for variable in secuencia:
	Declaración1
	Declaración2	
	...
	Declaraciónn

Así por ejemplo, si tenemos una lista, y queremos visualizar todos sus elementos, la forma de hacerlo sería la siguiente:

lista=[1,2,3,4,5,6,7,8,9,10]

for elemento in lista:

print(elemento)

Al ejecutar el anterior script Python, obtendríamos lo siguiente:

/usr/bin/python2.7
1
2
3
4
5
6
7
8
9
10

Process finished with exit code 0

Es decir, se ha recorrido cada elemento en la lista, y cada uno de ellos se ha visualizado por pantalla.

No obstante, los que venimos del lenguaje de programación C, estamos acostumbrados a la siguiente construcción de bucle…

for(i=0;i<n;i++)

{

printf(“%d”,i)

}

¿Cómo se migra esa construcción tan característica del lenguaje C a Python?

Necesitamos conocer la función incorporada al lenguaje Python range()

La función range se usa para generar una lista de progresiones aritméticas.

Su sintaxis es: range (inicio, fin, paso)

Un ejemplo:

rango=range(1,10)
print(rango)

¿Qué creéis que mostrará la ejecución del anterior script?

A priori, podría pensarse que mostrará una lista de números del 1 al 10 ¿verdad?
No es el caso, lo que muestra es una lista de números del 1 al 9, tal y como sigue:

/usr/bin/python2.7
[1, 2, 3, 4, 5, 6, 7, 8, 9]

El valor de fin en la función range, es el número inmediatamente superior al que queremos obtener en la progresión.

Combinando range con for.

Así que la manera de imitar el comportamiento de un bucle for en Python es combinar for y range.

Vamos a migrar el siguiente bucle C a Python

for (i=0;i<=10;i=i+2)

{

}

Dicho bucle en Python se escribiría del siguiente modo

for i in range(0,11,2):

¡A programar!

PlotMyTraining

Al hilo de lo comentado en mi post anterior, he decidido entrenar con método durante 2018, para lo cual estoy siguiendo el entrenamiento propuesto en la WEB entrenamientociclista.com

De momento me está gustando mucho la plataforma, pero un problema que encontré fue que los entrenamientos están descritos siguiendo una fórmula como la que sigue:

Rodillo
1h a intensidad 135 ~ 144ppm.

Sesión I

3 x (4´ 145 ~ 153ppm. / 6´ 98 ~ 123ppm.) 

Lo anterior quiere decir que hay que entrenar una hora de rodillo a una intensidad de 135 a 144 pulsaciones por minuto y dentro de esta hora meter 3 series de 4 repeticiones a un ritmo cardiaco de entre 145 y 153 pulsaciones por minuto, seguidas de 6 minutos de una serie entre 98 y 123 pulsaciones por minuto).

No me gusta este método de expresarlo porque resulta un poco lío de seguir, prefiero simplemente cuando estoy en el rodillo, mirar una gráfica y ver por dónde voy y cuál es el próximo cambio de intervalo.

Algo tal y como lo que sigue:

En la gráfica anterior podemos ver que los primeros 30 minutos entrenamos a 135 pulsaciones por minuto con una cadencia de 80, para después realizar 4 minutos a 145 ppm y cadencia 80, seguidos de seis minutos a 115 ppm…

En definitiva, es una representación gráfica del entrenamiento descrito por entrenamientociclista.com, en la que además se muestran las zonas cardiacas.

¿Cómo he hecho esto?

Pues con un script en Python que me he programado y que te puedes descargar aquí

El programa te pide tus datos personales, y un fichero donde está el entrenamiento.

El formato de dicho fichero debe ser el siguiente:

minutosxppmxcadencia
minutosxppmxcadencia
minutosxppmxcadencia

Donde cada línea es una serie a realizar. Tantas líneas como sea necesario, con un salto de línea entre series.

Por ejemplo, si queremos dibujar un entrenamiento de 30 minutos a unas pulsaciones por minuto de 120 con una cadencia de 80, seguidas luego por 20 minutos a 135 y cadencia 95, sería así:

30x120x80
20x135x95

Esto lo guardaríamos como fichero de texto que pasaríamos al script plotmytraining.py

El script require Python 2.7 y tener instalada la librería matplotlib

Espero que a alguien más le sea útil.

 

Older posts

© 2018 Blog personal

Theme by Anders NorenUp ↑