Puesto que me encuentro como tantos otros dandole vueltas a la dichosa aceleracion 3d con ATI en Ubuntu, segui un tutorial que recomendaba la eliminacion de todo lo referente al modulo fglrx que viene en los repostiorios, segui dicho tutorial y parece ser que la cosa funciona mas o menos, dmesg no me lanza ningun error relacionando con el driver ni nada por el estilo, pero cuanod ejecuto glxgears:
Una vez me instalé el amule en mi Ubuntu Hoary para hacer copias de seguridad de mi Windows :-P. Total, que detecté que al arrancarlo las letras aparecían a un tamaño ridículo. Y no sólo me passaba con el amule, también con pptpconfig y otros.
En determinadas «circunstancias especiales» puede ser necesario que un PC tenga una tarjeta de red con una dirección MAC específica. Esta receta explica cómo conseguirlo con ifconfig, iproute o macchanger
Bueno, pues hoy arranco la web de CISCO y al intentar ejecutar las pruebas, cual es mi sorpresa cuando veo que el test no se ve apropiademante! Concreto, me aparecen las casillas para marcar las respuestas, las pestañas para seleccionar las preguntas, las imagenes en caso de haberlas, pero no me aparece nada de texto... sorprendente cuan menos!
Un minúsculo tutorial para quién necesite o simplemente le apetezca aprender Python.
Introducción
Python es un lenguaje interpretado, interactivo y orientado a objetos. Se le compara con C++. Java o Perl. Tiene variables, clases, objetos, funciones y todo lo que se espera que tenga un lenguaje de programación «convencional». Cualquier programador puede empezar a trabajar con Python con poco esfuerzo. Según muchos estudios, Python es uno de los lenguajes más fáciles de aprender y que permiten al novato ser productivo en tiempo record, lo cual lo hace ideal como primer lenguaje.
Python es perfecto como lenguaje «pegamento» y para prototipado rápido de aplicaciones (aunque finalmente fuera necesario rehacerlas en otros lenguajes), aunque eso no implica que no se puedan ser definitivos. Dispone de librerías para desarrollar aplicaciones multihilo, distribuidas, bases de datos, con interfaz gráfico, juegos, gráficos 3D, cálculo científico, machine learning y una larga lista.
Este pequeño tutorial utiliza la versión actual de Python (3.9) y presupone que el lector tiene nociones básicas de programación con algún lenguaje como C, Java o similar.
Empezamos
Nada como usar algo para aprender a usarlo. El intérprete de Python se puede utilizar como una shell (lo que se llama modo interactivo), algo que viene muy bien para dar nuestros primeros pasos.
$ python3
Python 3.9.1+ (default, Jan 20 2021, 14:49:22)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Variables y tipos
Las variables no se declaran explícitamente, se pueden usar desde el momento en que se inicializan. Y normalmente no hay que preocuparse por liberar la memoria que ocupan, tiene un «recolector de basura» (como Java).
$ python3
>>> a = "hola"
En el modo interactivo se puede ver el valor de cualquier objeto simplemente escribiendo su nombre:
>>> a
'hola'
Python es un lenguaje de tipado fuerte, pero dinámico. Eso significa que no se puede operar alegremente con tipos diferentes (como se hace en C). Las operaciones están definidas para trabajar con los tipos previstos.
>>> a + 1
Traceback (most recent call last):
File "", line 1, in
TypeError: Can't convert 'int' object to str implicitly
Esa operación ha provocado que se dispare la excepción TypeError. Las excepciones son el mecanismo más común de notificación de errores.
Pero se puede cambiar el tipo de una variable sobre la marcha:
>>> a = 3
En realidad no hemos cambiado el tipo de a, sino que hemos creado una nueva variable que reemplaza la anterior.
Tipos de datos
Valor Nulo
Una variable puede existir sin tener valor ni tipo, para ello se asigna el valor None. Es el valor adecuado cuando se quiere indicar que una variable no se refiere a ningún objeto:
>>> a = None
>>> a
>>>
Booleanos
Lo habitual:
>>> a = True
>>> a
True
>>> not a
False
>>> a and False
False
>>> 3 > 1
True
>>> b = 3 > 1
>>> b
True
Numéricos
Python dispone de tipos enteros de cualquier tamaño que soportan todas las operaciones propias de C, incluidas las de bits. También hay reales como en cualquier otro lenguaje. Ambos tipos se pueden operar entre si sin problema. Incluso tiene soporte para números complejos de forma nativa.
>>> a = 2
>>> b = 3.0
>>> a + b
5.0
>>> b - 4j
(3-4j)
Secuencias
No hay tipo carácter, se utilizan cadenas de tamaño 1. Las cadenas admiten operaciones como la suma y la multiplicación.
El tipo bytes permite manejar secuencias de bytes. Es especialmente útil para serialización de datos. Por ejemplo, podemos convertir una cadena de caracteres UTF-8 a bytes y viceversa:
Las tuplas son una agrupación de valores similar al concepto matemático de tupla. Se pueden empaquetar y desempaquetar varias variables (incluso de tipo diferente).
>>> x = greeting, 'f', 3.0
>>> x
('hola ', 'f', 3.0)
>>> v1, v2, v3 = x
>>> v2
'f'
Las Listas son similares a los vectores o arrays de otros lenguajes, aunque en Python se pueden mezclar tipos.
>>> x = [1, 'f', 3.0]
>>> x[0]
1
Las listas también se pueden sumar y multiplicar:
>>> x = [1, 'f', 3.0]
>>> x + ['adios']
[1, 'f', 3.0, 'adios']
>>> x * 2
[1, 'f', 3.0, 1, 'f', 3.0]
Cualquier secuencia se puede indexar desde el final o mediante «rodajas» (slices):
Python dispone de otros tipos de datos nativos como conjuntos (sets), pilas, colas, listas multidimensionales, etc.
Type checking
Aunque Python es un lenguaje de tipado dinámico, en la versión 3.0 ya se daba la opción de hacer anotaciones sobre las variables y sus tipos, y actualmente (se introdujo con el PEP 484) existe un módulo donde se definen la semántica y convenciones para especificar de forma opcional esas anotaciones o hints.
>>> pi: float = 3.14
Las anotaciones de las variables se almacenan en el atributo __annotations__:
El comportamiento del lenguaje es el mismo, y las variables puede cambiar el tipo de valor que almacenan independientemente de su definición sin producir errores:
>>> pi: float = 3.14
>>> pi = "Tres coma catorce"
Sirve principalmente para facilitar la comprensión del código y poder llevar a cabo comprobaciones de tipos o type checking sobre el código escrito con herramientas como MyPy.
Orientado a objetos
Casi todo en Python está orientado a objetos, incluyendo las variables de tipos básicos, y hasta los literales!
Los módulos son análogos a las 'librerías' o 'paquetes' de otros lenguajes. Para usarlos se utiliza la sentencia import:
>>> import sys
>>> sys.exit(1)
Estructuras de control
Están disponibles las más habituales: for, while, if, if else, break, continue, return, etc. Todas funcionan de la forma habitual excepto for. El for de Python no es un while disfrazado, como ocurre en algunos lenguajes. Este for hace que, en cada iteración, la variable de control tome los valores que contiene una secuencia, es decir, que itere sobre ella. Ejemplo:
>>> for c in "hello":
... print(c)
...
'h'
'e'
'l'
'l'
'o'
Indentación estricta
En muchos lenguajes se aconseja «tabular» de determinada manera para facilitar su lectura. En Python este estilo es obligatorio porque el esquema de indentación define los bloques. Es una importante peculiaridad de este lenguaje. Se aconseja tabulación blanda de 4 espacios. Mira el siguiente fragmento de un programa Python:
El cuerpo del bloque for queda definido por el código que está indentado un nivel debajo de él. Lo mismo ocurre con el if. La sentencia que define el bloque siempre lleva un ':' al final. No se utilizan llaves ni ninguna otra cosa para delimitar los bloques.
Funciones
Nada mejor para explicar su sintaxis que un ejemplo:
deffactorial(n):ifn==0:return1returnn*factorial(n-1)# y su invocación
print(factorial(10))
Python is different
Como cualquier lenguaje, Python tiene sus peculiaridades, y conocerlas puede ayudar a sacarle el máximo potencial. Siempre hay una manera más «pythónica» de hacer las cosas, utilizando por ejemplo las características de programación funcional que incorpora. Como ejemplo, el factorial se puede hacer aún más compacto con algo como:
Lo normal es escribir un programa en un fichero de texto con extensión .py, utilizando algún buen editor (como code). Después ese fichero se puede ejecutar como cualquier otro programa. Para eso, la primera línea del fichero debe tener un «shebang», es decir, algo como:
#!/usr/bin/python3
Y no olvides darle permisos de ejecución al fichero:
Esta receta es para todos aquellos que estais en un entorno restrictivo en el que solo hay acceso al exterior a través de un proxy HTTP, como es mi caso actualmente.
Tan solo os será necesario un programa llamado Corkscrew. Los usuarios de Debian y derivados lo tenemos a tiro de apt-get.
Explicación
¿Qué hace este programa? Pues aprovecha una capacidad del proxy, el método CONNECT que permite hacer una conexión a un puerto TCP usando al proxy como intermediario. Lógicamente esto es de sobra conocido por un administrador de red y lo mas normal es que el proxy esté situado detrás de un firewall que no permitirá al proxy acceder a puertos distintos de los puramente web. Estos puertos son el HTTP:80 y HTTPS:443, cabe la posibilidad de que también tengamos acceso a FTP a través del proxy, lo que significará que éste también puede acceder a los puertos 20 y 21.
Con esta información ya nos vamos haciendo una idea de lo que va a pasar. Vamos a invocar ssh a través de Corkscrew para que se conecte al servidor de destino utilizando el proxy. El servidor de SSH utiliza el puerto 22 y lo normal es que el proxy no pueda acceder a dicho puerto, por este motivo será necesario que en el servidor al que queremos acceder le hayamos hecho un pequeño truco previo. El “truco” consiste en redirigir un puerto web que no esté en uso al puerto 22. Usualmente se utiliza el 443.
Vamos a ver como se cocina todo esto junto.
Elaboración
En primer lugar hay que redirigir el tráfico de nuestro servidor, del puerto 443 al 22. Una opción es lanzar el demonio ssh directamente en el puerto 443, pero eso no parece una solución elegante. No obstante quien quiera hacerlo no tiene más que tocar en /etc/ssh/sshd_config.
Lo mas limpio es usar iptables para redirigir el trafico. La orden es esta.
Donde proxy.curro.es el la dirección del proxy de nuestra red y 8080 es el puerto que usa el proxy. Las variables %h y %p se refieren al host y al port que usaremos para conectar y se le pasan desde el comando ssh como veremos a continuación.
Ahora para conectar a cualquier sitio tan sólo necesitamos ejecutar la orden.
$ssh -p 443 usuario@servidor.casa.com
Más difícil todavía
Si nuestro proxy necesita autenticación tendremos que crear un segundo fichero en .ssh/autenticacion con lo siguiente
Si os pasa, además de todo lo anterior, que vuestra conexión se corta cada dos por tres por falta de actividad basta con añadir esto en el fichero ssh_proxy
Vale, ya puedo acceder mediante SSH al ordenador de casa desde el trabajo, ¿y que? Pues si tenéis problemas con el proxy de vuestro trabajo porque os deniega el acceso a algunas páginas web que os son imprescindibles y el departamento de sistemas os ignora completamente, tan solo tenéis que instalar un proxy HTTP en vuestro ordenador, como por ejemplo squid (la configuración por defecto de squid en Debian funciona para lo que queremos hacer) y tunelizar las peticiones desde nuestro ordenador con el siguiente comando.
Estamos suponiendo que el servidor squid casero corre en el puerto por defecto, y redirigimos nuestro puerto local hacia el puerto remoto. Ahora solo tenemos que configurar el programa que queramos para que use como proxy
localhost:3128
y todo listo, ya estamos usando el proxy de casa sin restricciones.
En esta receta explico como instalar eDonkey2000. La idea es instalar el core en un PC y el cliente ed2k-gui en otro PC distinto.
Instalar el core
Después de bajar el core desde ed2k, lo siguiente es instalarlo:
#dpkg -i el_core_que_sea.deb
Y después configurarlo:
$ edonkeyclc
[--- Storing settings in '/XXXXX/XXXX/.eDonkey2000' ---]
Welcome to eDonkey2000 command line client 1.3.0
Enter commands at any time (type '?' for help)
>
Ahora se nos abre el shell del core. Lo primero será crearnos un usuario del core:
>name fulanito
Ahora vamos a establecer la velocidad máxima de bajada (20 KB/sec) y de subida (7 KB/sec), por ejemplo:
>dumax 20 7
Lo siguiente será crear un usuario y una contraseña para poder conectar desde los clientes gráficos a nuestro core (o cliente en modo texto):
>pass usuario passwd
Ten en cuenta que el passwd no se cifra ni nada por el estilo, por eso es aconsejable usarlo bajo una red segura.
Veamos lo que hemos creado:
> vo
Name: fulanito
Max Download Speed: 20.00
Max Upload Speed: 7.00
Line Speed Down: 0.00
TCP Port: 0
UDP Port: 3620
Admin Port: 4663
Admin Name: usuario
Admin Pass: passwd
Verbose: 0
SaveCorrupted: 1
MaxConnections: 45
ScreenLines: 24
Allow Private Messages: 0
Allow Viewing of Files: 0
Una vez configurado el core, salimos guardando la configuración introducida.
>q
Are you sure wanna quit (Y/n)?
y
Y ahora lo que hacemos es volver a lanzar el mismo programa pero indicandole que espere conexiones del cliente gráfico:
$edonkeyclc -g
Instalar el gui
En el otro PC nos tendremos que bajar el GUI ed2k-gui.
Al igual que antes, lo instalamos como root con:
#dpkg -i paquetito_gui.deb
Ahora lo lanzamos mediante el comando "ed2k_gui" o en el menú Aplicaciones -> Internet -> Controlador central eDonkey2000 GTK+.
Al iniciar el gui saldrá un ventana "Connect to...", pues bien, elegimos la segunda opción "Connect to a core running on another computer". Ahora hay que rellenar los siguientes datos:
Pulsamos aceptar y si todo ha ido bien deberiamos acceder al gui sin ningún problema. Una vez dentro hay que cambiar una opción importante para que el core siga corriendo en la otra máquina aunque cerremos el gui. Esta opción se encuentra en la pestaña "Opciones" -> "GUI1". Hay que desmarcar la opción que pone "apagar el núcleo al salir". Las demás opciones a gusto del cosumidor :-).
Script de inicio
Este es el script que he incluido en /etc/init.d/ para que cuando se encienda la máquina el core se ejecute,
yo lo he llamado "core-ed2k":
Cómo configurar «a mano», es decir, sin DHCP, los parámetros más importantes de una tarjeta de red en Debian GNU/Linux, Ubuntu o similar.
Hay otras posibilidades (como etherconf) pero la finalidad de esta receta es utilizar los comandos básicos disponibles en los sistemas GNU/Linux, en concreto con ipconfig y route del paquete net-tools.