Blog personal

Gonzalo Murillo

Category: Programming (page 1 of 2)

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

John Carmack interviews

This is a document with John Carmack interviews

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

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

 

How to read in Python a file between two lines

#!/urs/bin/python
import sys,re

if(__name__ == “__main__”):
with open(“Autosupport”) as f:
for l in f:
pattern=’^Replication Data Transferred over 24hr.*’
pattern2=’^Replication Detailed History’
if(re.match(pattern,l)):
print(l)
for l2 in f:
print (l2)
if (re.match(pattern2,l2)):
sys.exit(0)

Become a better programmer

One of the goals for 2017 is to become a better programmer.

I always had an interest in computer programming, but I feel that this year I want to deeply inmerse more in this (amazing) topic.

I want to read some books to become a better programming, like the following ones:

Head first design patterns:

Programming Pearls:

Clean Code

Apart from that I want to code more, do more coding!

I have joined a Professional Android Developer Micromaster

https://courses.edx.org/dashboard/programs/45a14e9d-8f08-44b4-a00b-84d47b012237/professional-android-developer

Prehistoric computing

Thanks to the effort of microhobby.org I have discovered that all the numbers of the old Spanish computing magazine: MicroHobby, can be downloaded in a PDF format.

When I saw them, I remembered almost every single cover of the magazine (and I am impressed by the quality of those covers).

Furthermore I have discovered amazed that I did a very small contribution on number 1 (I completely forgot about this, truly)

This was probably 1990.

http://microhobby.speccy.cz/mhf/196/MH196_14.jpg

Yes, computers have been part of my life always.

Processing network captures in pcap format

I would like to build my own tool for analyzing network captures.

Most of the time my job involves to spot why a network protocol is performing slowly: using Wireshark for that task is nice, but I want something more automatic, just able to detect the issues I normally deal with, in an automatic way.

That is the reason I have decided to do some homework and analyze which libraries are available for processing pcap files.

The original pcap library in C can be found @ tcpdump.org

Information about the file format can be found @ Libpcap information

There is a port to python of the pcap library Python port of the pcap library

Also in Python, there is a tool that seems to be much more ambitious but worthy: Scapy

This is just a first sketch. Lot of job needs to be done to accomplish something useful.

Older posts

© 2018 Blog personal

Theme by Anders NorenUp ↑