Python WTF: Entendiendo cómo funciona is

He estado echando un ojo a un post de Reddit, donde algunos comportamientos del lenguaje parecen que no son los adecuados (bug), pero que se deben en su mayoría a pequeños fallos de comprensión de la sintaxis tan propia de python.

El que os traigo aquí es el siguiente:

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

Aparentemente vemos que hay una inconsistencia en el funcionamiento. Lo esperado es que si comparas si 256 is 256 es que te de que sí. Hasta aquí bien. El problema lo tenemos con el siguiente número: 257, donde no funciona igual.

Esto se debe a dos causas. La primera de las dos es la implementación interna de CPython, la distribución python por excelencia. Aquí, todos los enteros desde -5 hasta 256 (ambos incluidos), tienen una única instancia, por ser los enteros que más se utilizan. Sin embargo, los enteros que son mayores de 257 o menores que -5 tienen otra dirección en memoria a medida que se crean.

La segunda causa es cómo funciona realmente is. Lo que hace es comparar referencias a bajo nivel en memoria, por lo que, como hemos visto antes, los números contenidos en el intervalo [-5, 256] tendrán la misma dirección en memoria y darán True en la comparación.

Como dato curioso, si intentamos lo mismo en pypy, una implementación de Python optimizada para cálculos numéricos, nos funcionará para todos los enteros.

Para concluir, lo mejor que podemos utilizar para comparar en python es el operador ==, que éste sí que tiene el comportamiento esperado en todos los casos. Si queremos ir más en modo hardcore utilizando las referencias a memoria con cuidado, entonces utilizaremos is.

Fuente | Reddit

1 0

Atom editor: Introducción e Instalación

Emacs vs Vim, la eterna batalla de los editores, a la que, bajo mi opinión, le ha salido un serio y potente competidor, y apoyado nada más ni nada menos que por los creadores de Github. Sí, es cierto, los dos primeros son prácticamente los únicos (nano y ed no cuentan) para usar a través de una terminal. Pero salvo contadas ocasiones, la terminal no se suele utilizar.

A cambio, Atom (que así se llama el editor en cuestión) nos ofrece una interfaz bastante más amigable que vim (eso es fácil) y que Emacs. Nos recuerda bastante a la del editor Sublime Text del que probablemente habrán copiado bastantes cosas, salvo la de ser código libre. Hablando de código fuente, está escrito en Coffeescript, y reconozco que en este punto probablemente pierde con prácticamente cualquier otro editor, pues tarda bastante en iniciarse y en cargar algún que otro plugin.

Siendo Javascript el mayor de sus lastres en lo que a rendimiento se refiere, es la mayor de las ventajas cuando hablamos de la comunidad. Actualmente, todo el ecosistema Node.js es el que más ha crecido en los últimos años y muchos desarrolladores Javascript lo han tomado como su editor de referencia y han creado muchos plugins.

Según a quién se pregunte, opinará que Atom es un editor de texto hipervitaminado y habrá otros que te digan que es un IDE sencillito. Lo que está claro es que no estamos ante un Gedit ni frente a un IDE como IntelliJ IDEA, sino en un punto intermedio. Para algunos se les vendrá muy grande, y para otros demasiado escasa, pero yo soy de los que creo que en el punto medio está la virtud. El hecho de que no esté pensado para nada en concreto y que se pueda usar para todo a la vez (con sus correspondientes plugins) creo que lo convierte en la herramienta que deberías tener instalada siempre.

¡Pues a instalarlo, que no se diga! La intención del tutorial es seguirlo con Linux, pero este editor es multiplataforma, así que salvo la instalación, el resto de los capítulos podrías seguirlo con cualquier otro sistema operativo como Windows o MacOS.

Nada más instalar Atom, esta es la primera pantalla que veremos
Nada más instalar Atom, esta es la primera pantalla que veremos

Para Debian/Ubuntu/LinuxMint/+derivados y Fedora/CentOS/+derivados tenemos paquetes compilados como .deb o .rpm que hacen la instalación realmente sencilla. Simplemente os recomiendo acudir a la web atom.io y descargar el último paquete disponible. Veo que estás esperando un comando para copiar y pegar…

Para .deb:

wget https://atom.io/download/deb -O atom.deb && dpkg -i atom.deb

Para .rpm:

wget https://atom.io/download/rpm -O atom.rpm && rpm -i atom.rpm

Y para arch y derivados, podremos descargarlo de los repos oficiales

pacman -S atom

A continuación veremos algunos atajos de teclado que serán muy útiles para encontrar lo que buscamos. Por ejemplo, empezemos por el más básico: Ctrl + Shift + P. Esto nos abrirá la paleta de comandos, muy utilizada en Atom: Cada extensión que instales tendrá nuevas funcionalidades, a las que podrás acceder o bien a través de la paleta de comandos, o bien con los atajos de teclado que incluya por defecto. Ojo, todos estos atajos de teclado se pueden modificar, pero eso lo dejamos para otro día.

Paleta de comandos de Atom
Paleta de comandos de Atom

Podemos abrir la ventana de configuración con Ctrl + ,, para no tener que ir hasta el menù “Edit > Preferences”. Podemos ocultar la barra de navegación lateral izquierda con Ctrl + \ (He de decir que a mí la que me ha funcionado es Ctrl + º porque para escribir el carácter de barra invertida necesito presionar también AltGr).

Dejaremos para la próxima parte nuevos plugins o funcionalidades más avanzadas. Pero para empezar, lo que vamos a intentar es quitar los menús de la parte superior. En algunos entornos donde la resolución de pantalla es limitada, disponer del máximo espacio posible es vital para estar cómodos.

Seleccionar window:toggle-menu-bar en Atom
Nuestro primer uso a la paleta de comandos!!

Para ello, abrimos la paleta de comandos (Recuerda: Ctrl + Shift + P y buscamos Window: Toggle menu bar. Cuando esté seleccionado, aceptamos con intro. Es recomendable no escribir todo el texto de arriba. Si observáis el ejemplo de arriba, sólo con poner men ya aparece la opción que deseamos.

En la siguiente entrada tendréis más información para personalizar el editor como más os guste! Hasta entonces, ¡Un saludo!

4 0

GTK y Python: Cambiar el estilo de una GTKLabel

Lleva siendo así prácticamente desde que implementé la GtkHeaderBar en Pimagizer, pero como habéis podido ver, recientemente uso el tema Arc, que implica tener un fondo oscuro en las barras de menús y herramientas. Y el problema surge ahí, en que los botones que tan bonitos se veían con el tema por defecto de GTK, pero cambia con un tema oscuro:

A la derecha botones con imagen en un tema GTK claro, a la derecha lo mismo pero con un tema oscuro
Claramente la diferencia está ahí…

La solución más eficaz pasa por convertir ese botón en uno normal y corriente, sin imágenes de ningún tipo, simplemente utilizando texto, y en concreto GTKLabel. Si estáis utilizando Glade o algún sistema gráfico parecido, podéis saltar a la siguiente sección.

Crear los elementos básicos

Daremos por hecho que ya tienes una ventanita corriendo con GTK, ya que el objetivo del artículo no es enseñar a utilizar los elementos de GTK, sino utilizar uno muy concreto. Aquí repasamos cómo se crea la etiqueta dentro del botón.

buttonPx = Gtk.ToggleButton()
labelPx = Gtk.Label("Px")  # Aquí va nuestro texto
buttonPx.add(labelPx)
buttonPx.show()
labelPx.show()

Un código bastante sencillito. Creamos un GtkToggleButton (hereda de GTKButton) y un objeto GTKLabel con el texto Px. Le decimos al botón que utilice la etiqueta que acabamos de crear y mostramos ambos objetos. Veamos cómo quedaría:

Los botones de la HeaderBar con etiquetas de texto pequeñas
No se parece demasiado al resultado que queremos conseguir…

Como podemos ver en la imagen, se consigue el objetivo de no usar una imagen para mostrar en los botones, pero son muy distintos de lo que teníamos antes: dos botones con el texto bien visible.

Decidiendo el estilo de la GTKLabel

Afortunadamente GTK ofrece bastantes herramientas para poder personalizar los aspectos que necesitemos, como este concretamente. Lo que estamos buscando exactamente es esto: Text Attribute Markup, que inicialmente fue desarrollada por Pango. Formalmente lo conocemos como Pango Text Attribute Markup Language. No os preocupéis demasiado: es muy parecido a HTML, así que aprender la sintaxis no será complejo.

Básicamente, la sintaxis se basa en XML al igual que HTML. Tenemos el soporte de etiquetas algo más reducido, pero las clásicas <b>, <i> o <u> las tenemos. Añade alguna más como <big>, <small>, <sup> y <sub>, permitiendo hacer cosas más complejas sin meterse con CSS. Lo interesante con las opciones viene con la etiqueta <span>, que permite una serie de opciones muy interesante, como distintas tipografías, colores o tamaños. De la que nos ocupa ahora son los tamaños, ya que los colores vendrán predefinidos por el tema GTK del usuario.

Para decidir el tamaño de nuestra etiqueta podemos utilizar medidas absolutas (píxeles, puntos, etc…) o relativas. Lo recomendable es utilizar medidas relativas, porque se adaptarán a la resolución que esté usando el usuario. Las medidas absolutas las veremos muy bien en nuestro ordenador, pero cambiará drásticamente cuando cambiemos a otro con una resolución más distinta.

Para la etiqueta <span> disponemos del atributo size=”” o font_size=””. En la documentación tenéis informacion sobre otros muchos atributos, y modos de uso, pero nos centaremos en los tamaños relativos. Disponemos de una escala de 7 tamaños, ordenadas de menor a mayor: ‘xx-small‘, ‘x-small‘, ‘small‘, ‘medium‘, ‘large‘, ‘x-large‘, ‘xx-large‘. La que aplicaremos en nuestra aplicación será la más grande, pues obtendremos el resultado similar al que conseguíamos con las imágenes.

<span size="xx-large"><b>Px</b></span>

También le ponemos la etiqueta <b> para darle más grosor a la fuente. Ahora sólo nos queda incorporarlo al código

Utilizar marcado Pango en GTKLabel

Al código de nuestra primera sección le debemos de dar unos breves retoques para poder poner lo que necesitamos. Y es que si rellenamos la etiqueta tal cual lo tenemos en el cuadro de texto anterior el usuario verá las etiquetas, que es algo que no deseamos. GTKLabel tiene un atributo que indica si se está utilizando marcado o no.

buttonPx = Gtk.ToggleButton()
labelPx = Gtk.Label("<span size="xx-large"><b>Px</b></span>")
buttonPx.add(labelPx)
buttonPx.show()
labelPx.set_use_markup(True)  # Muy Importante!!
labelPx.show()

Como vemos, la penúltima línea es la que nos dejará hacer la magia. Le estamos diciendo que aplique el marcado a esa etiqueta. Y ya, al ejecutar de nuevo nuestra aplicación tendremos el resultado que buscábamos:

Las GTKLabel de la aplicación ahora se ven adecuadamente
¡Ahora sí!

Siempre podéis consultar el resultado en directo en la versión 0.4.5 de Pimagizer.

Un saludo!

Véase: Documentación GTK | Pimagizer

0 0

[Tip] Mostrar el tamaño de los ficheros en KB o MB al hacer ls -l

Hoy vengo con un pequeño truquito, no va ser tan extenso como otros días, pero es de esas cosas que, a la larga, te facilitan la vida. No es ni más ni menos que la menudez de mostrar el tamaño de los ficheros en KB, MB, GB, etc… Reconozco que te hace vago, por no tener que contar los bytes, pero es mucho más cómodo.

El problema se da cuando hacemos un ls -l normal para mostrar el tamaño de los archivos y tenemos unos cuantos bastante grandes:

$ ls -l

Para estar seguros que hemos contado centenas de megas y no unidades de gigas de un vistazo, simplemente hay que añadir el flag -h al comando ls:

$ ls -lh

Y ya, para rematar, si lo queremos activar permanentemente, podríamos definir un alias en nuestro .bashrc (o .zshrc, como quieras), que, sumado al flag para colorear la salida, quedaría de la siguiente manera. Así, copiando esta línea la tendremos siempre lista cuando abramos una consola.

alias ls=”ls -h –color=auto”

Un saludo!

2 0

Cambiando la apariecia por defecto en Ubuntu 16.04

No es mi intención hacer el típico (y ya viejo) artículo de “10 cosas a hacer después de instalar Ubuntu 16.04”, pero, hacía casi dos años que no instalaba Ubuntu en el ordenador, así que voy a hacer una pequeña excepción. Además, ya hace casi 6 meses que salió este Xenial Xerous, y casi que debería hacerlo para Yakkety Yak, pero los temas son, en cierta medida, atemporales. De cualquier manera, en casi todos los enlaces tendrás las instrucciones para poder instalarlo allí donde quieras.

Captura de Pantalla según se inicia sesión en Ubuntu
Pantalla según se inicia sesión

La excusa, como podréis adivinar por la imagen, es por la apariencia por defecto de Ubuntu. Yo entiendo que haya gente que le guste, porque esa mezcla de colores cálidos y marrones le parezca bonito, o simplemente porque es la que viene por defecto y tal: tampoco hace falta gastar tiempo en cambiarlo.

Captura de pantalla con la terminal, navegador de archivos y actualizaciones del sistema abiertos
Un poco más en detalle el tema

Yo personalmente no pertenezco a ninguno de los dos grupos. No me gusta el conformismo, y esos colores del tema Ambiance no me convencen para nada. Menos lo hacen los del tema Radiance, que por algo no viene por defecto… Así que me puse manos a la obra. He de confesar que tampoco le eché mucho tiempo, pero para la próxima, por si yo también lo necesito, dejo una serie de enlaces, paquetes y scripts por si en el futuro hace falta echar mano de ellos.

Vamos con el tema GTK. No sé si es el que todo el mundo usa ahora, hace tiempo que no veo las típicas entradas de “Muestra tu escritorio”, pero aparece muy bien valorado en Github y con un gran soporte detrás, tanto de usuarios como de distribuciones. El tema se llama Arc, y son tres variantes: Arc, Arc Dark y Arc Darker.

Diferentes versiones del tema Arc
Las tres variantes del tema Arc

He de decir que estoy muy agradecido a la comunidad que lo desarrolla, porque ofrece paquetes binarios desde repositorios para instalarlo, lo que significa que lo instalas rápidamente y tendrás actualizaciones inmediatas. Las instrucciones para el resto de sistemas están en GitHub o aquí, pero dejo los comandos para instalarlo en Ubuntu 16.04

wget http://download.opensuse.org/repositories/home:Horst3180/xUbuntu_16.04/Release.key
sudo apt-key add – < Release.key
sudo sh -c “echo ‘deb http://download.opensuse.org/repositories/home:/Horst3180/xUbuntu_16.04/ /’ >> /etc/apt/sources.list.d/arc-theme.list”
sudo apt-get update
sudo apt-get install arc-theme

Lo siguiente es el paquete de iconos. Los hay de distintas formas, colores y tipos, pero he preferido huir de los tan mainstream Numix (Ojo, el proyecto es excelente) y buscar algo que no sea taaan uniforme. Los que propongo no son tan conocidos ni probablemente tendrán ese soporte que tuvo en su momento el pack Faenza, pero me encantan. Son el pack Paper

Iconos tema paper
Iconos del tema Paper

Para instalarlo en Ubuntu:

sudo add-apt-repository ppa:snwh/pulp
sudo apt-get update
sudo apt-get install paper-icon-theme

Lo último (aunque podríamos seguir con otras cosas más detalladas como fuentes, cursores y no sé que más) es el fondo de pantalla. Esto es bastante más personal todavía. Los que ofrece Ubuntu de forma oficial en esta distro están más o menos bien, pero, nada que ver si el fondo en cuestión es propio, hecho con tu querida cámara. Así que, por si queréis imitarlo os dejo un enlace a la foto. Aunque hace tiempo la subí a Flickr con marca de agua y bajo Copyright, ahora pongo la imagen original con los mismos derechos que el blog: Creative Commons 4.0 BY – SA.

Wallpaper de la torre Foster
Wallpaper de la torre Foster

Y por si queréis algo más veraniego, dejo otro, también bajo licencia Creative Commons que, este sí, podréis descargarlo desde Flickr sin problema ninguno.

Tïtulo: On the harbour
Wallpaper veraniego – On the harbour

Un saludo, y que lo disfrutéis.

2 0

Sobre Mercadona y la pasta Gallo

Se acabó. Ya está. Ya no verás más sobre los estantes de muchos Mercadonas el paquete de macarrones de Gallo. Lo único que quedaba por desaparecer era la línea Sin Gluten, ya que Mercadona no había conseguido fabricante que produjera pasta sin gluten. Pero lo ha encontrado, ni más ni menos, que en Italia. En fin, sin querer entrar en temas de deslocalización, tendrás que dejar de acudir al Mercadona que hay tan cerca de tu casa si quieres otra marca de pasta distinta a la de Hacendado.

Y antes de que me tiréis piedras, no os asustéis. El blog sigue hablando de software. Este es el ejemplo comercial que más familiar nos puede parecer al que lleva a cabo Microsoft. Esa multinacional que de la noche a la mañana pasó de odiar Linux a amarlo, y a poder instalarlo dentro del propio Windows. Esa multinacional que se ha puesto a amar el software libre y que contra todo pronóstico lidera el ranking de empresas con más contributores de código de software libre en github (mirror).

Ranking de las empresas con mas contributores de Software libre
Google cae hasta el 5º lugar en el ranking…

Microsoft ha sido siempre ese monstruo gigante famosamente conocido con la estrategia comercial “Adoptar, extender y extinguir“. Cerca estuvo de que, con la citada estrategia, desapareciesen otros navegadores de Internet de la faz del ciberespacio que no fueran Internet Explorer. Este ejemplo es fácil. Microsoft adopta una tecnología, en este caso, Internet Explorer. Como Windows viene instalado prácticamente en cualquier máquina, e Internet Explorer con él, nadie se preocupará de buscar otro software para entrar a la web (extender). A la larga, los pocos usuarios que no habían adquirido Internet Explorer (o Windows) se verían abocados a usarlo, ya que al final es lo que utiliza la mayoría y nadie iba a preparar ninguna web para otro navegador que no fuera Internet Explorer (extinguir).

Continuar leyendo “Sobre Mercadona y la pasta Gallo”

2 0

Cambia de SO: Ahora con HTTP/2 y Cifrado SSL

Ha tardado, pero al final ha llegado. Siento las disculpas si llegaste hasta aquí hace algún día y te has encontrado con el mensaje por defecto de Nginx o directamente no respondía. La razón de esa pequeña indisponibilidad ya está resuelta y no es ni más ni menos que la configuración de un certificado SSL, el soporte de HTTP/2 y la activación del módulo pagespeed para Nginx.

Logo Nginx
Un servidor web muy rápido, pero hasta que lo configuras…

La verdad es que estos problemas surgen de escoger a Nginx como servidor en lugar de coger el más conocido en esta materia: Apache. Este último es compatible con un montón de módulos y la instalación de los mismos es automática. Si no me equivoco, la instalación del certificado SSL de Let’s Encrypt es prácticamente introducir un único comando y ya. Yo, sin embargo, me ha tocado seguir algún que otro tutorial para solucionarlo, editando los archivos de configuración de Nginx.

Continuar leyendo “Cambia de SO: Ahora con HTTP/2 y Cifrado SSL”

1 0

Recuperar el acceso al sistema cuando pierdes la contraseña de usuario

Lo mío con la Raspberry es una especie de relación amor-odio. La abandoné en su caja hace algún mes, y esta misma semana la quise retomar, de nuevo, como un proyecto multicosa (perdón por la patada al diccionario). Algo así como mediacenter Kodi, servidor de ficheros y alguna que otra cosa. Eso sí, con la lentitud propia de la primera raspberry (la de 256MB de RAM).

El caso, que para ahorrar algo de tiempo decidí que era más sencillo retomar la copia de la tarjeta de memoria que ya traía instalada la distribución OSMC. Todo bien hasta que no podía iniciar sesión con SSH. Ni una sola de las contraseñas que recuerdo hacía que diera válido el usuario (no, ni siquiera con la que viene por defecto: osmc). Me había olvidado la contraseña.

Por suerte, simplemente sacando la tarjeta SD y metiéndola en un ordenador cualquiera es posible acceder al sistema de archivos. Y es aquí donde radica la principal condición para poder aplicar este método: tienes que poder acceder, tanto como lectura y escritura, al sistema de ficheros, incluidos los que corresponden al usuario root. Dicho de otro modo, debes de ser capaz de acceder físicamente al disco desde otra máquina.

Atención: Este método es aplicable a cualquier sistema Linux al cual  tengas acceso root al disco duro, sea la tarjeta sd de una raspberry pi o el disco duro o SSD de un ordenador cualquiera. Eso sí, no puede estar cifrado. Continuar leyendo “Recuperar el acceso al sistema cuando pierdes la contraseña de usuario”

1 0