Roberto Alsina: My Git tutorial for people who don't know Git

As part of a book project aimed at almost-beginning programmers I have written what may as well pass as the first part of a Git tutorial. It's totally standalone, so it may be interesting outside the context of the book.

It's aimed at people who, of course, don't know Git and could use it as a local version control system. In the next chapter (being written) I cover things like remotes and push/pull.

So, if you want to read it: Git tutorial for people who don't know git (part I)

PS: If the diagrams are all black and white, reload the page. Yes, it's a JS issue. Yes, I know how to fix it.

Roberto Alsina: I have written half a book

LIke mentioned before I am trying to write a book and ... well, I may be actually making progress? At least the generated PDF is about 170 pages long, which means I have written a bunch in this past month.

I have finished the second of four planned parts, which means I have done about half of it. Since I expect the next two parts to be shorter, it's actually more than that.

The target audience are people who have finished the python tutorial but are not exactly programmers yet. They have the syntax more or less in their heads, but how do you turn that into an actual piece of code?

  • Part 1 is about "prototyping", the process of dumping an idea into rough code.
  • Part 2 is about polishing that rough code into ... not so rough code. Includes a gentle introduction to testing, for example.
  • Part 3 (to be written) is about things that are not code:
    • Git / Gitlab
    • Issues
    • Packaging
    • Setting up a website
    • CI
    • Lots more
  • Part 4 is still to be thought but basically it will cover implementing a large feature from the ground up.

I much appreciate comments about it.

PD: Si, va a haber una traducciń al castellano. O mas bien al argentino. Una vez que lo termine.

Joaquin Tita: Prevent ssh timeouts

Locally add the following to ~/.ssh/config
ServerAliveInterval 120 # null packet every 120 seconds
On the server side add the following:
ClientAliveInterval 120 # null packet every 120 seconds
ClientAliveCountMax 720 # 24hs

Done!

Joaquin Tita: fail2ban unban ip

To search all the ips that were banned we enter interactive mode:

$ fail2ban-client -i
Then we check a jail status, for example sshd:
> status sshd
the output:
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 27
|  `- File list: /var/log/auth.log
`- Actions
   |- Currently banned: 37
   |- Total banned: 38
   `- Banned IP list: <a big list of banned ips>

So, if we want to unban a particular ip address, let's say X
Then, we execute:
> set ssh unbanip (within interactive mode)

Lastly, if you want to execute it directly from command line:

$ fail2ban-client get <JAIL> actionunban <IP-ADDRESS>

That's all.

Facundo Batista: Actualización y nuevo proyecto


fades

Después de casi un año, con Nico liberamos una nueva versión de fades.

¿Qué hay de nuevo en esta release?

  • Revisar si todo lo pedido está realmente disponible en PyPI antes de comenzar a instalarlo
  • Ignora dependencias duplicadas
  • Varias mejoras y correcciones en los mensajes que fades muestra en modo verbose
  • Prohibimos el mal uso de fades: instalarlo en legacy Python y ejecutarlo desde adentro de otro virtualenv
  • Un montón de mejoras relacionadas al proyecto en sí (pero no directamente visibles para el usuario final) y algunas pequeñas otras correcciones

Pruébenlo.

Loguito de fades

infoauth

infoauth es un un pequeño pero práctico módulo de Python y script para grabar/cargar tokens a/desde disco.

Esto es lo que hace:

  • graba tokens en un archivo en disco, pickleado y zippeado
  • cambia el archivo a sólo lectura, y sólo legible por vos
  • carga los tokens de ese archivo en disco

En qué casos este módulo es útil? Digamos que tenés un script o programa que necesita algunos tokens secretos (autenticación de mail, tokens de Twitter, la info para conectarse a una base de datos, etc...), pero no querés incluir estos tokens en el código, porque el mismo es público, entonces con este módulo harías:

    tokens = infoauth.load(os.path.expanduser("~/.my-tokens"))

Fijate que el archivo va a quedar legible sólo por vos y no en el directorio del proyecto (así no tenés el riesgo de compartirlo por accidente).

CUIDADO: infoauth NO protege tus secretos con una clave o algo así, este módulo NO asegura tus secretos de ninguna manera. Sí, los tokens están enmarañados (porque se picklean y comprimen) y otra gente quizás no pueda accederlos fácilmente (legible sólo por vos), pero no hay más protección que esa. Usalo bajo tu propio riesgo.

Entonces, ¿cómo usarlo desde un programa en Python? Es fácil, para cargar la data:

    import infoauth
    auth = infoauth.load(os.path.expanduser("~/.my-mail-auth"))
    # ...
    mail.auth(auth['user'], auth['password'])

Para grabarla:

    import infoauth
    secrets = {'some-stuff': 'foo', 'code': 67}
    infoauth.dump(secrets, os.path.expanduser("~/.secrets"))

Fijate que como grabar los tokens es algo que normalmente se hace una sola vez, seguro es más práctico hacerlo desde la linea de comandos, como se muestra a continuación...

Por eso, ¿cómo usarlo desde la linea de comandos? Para mostrar la info:

    $ infoauth show ~/.my-mail-auth
    password: ...
    user: ...

Y para grabar un archivo con los datos::

    $ infoauth create ~/.secrets some-stuff=foo code=67

Fijate que al crear el archivo desde la linea de comandos tenemos la limitación de que todos los valores almacenados van a ser cadenas de texto; si querés grabar otros tipos de datos, como enteros, listas, o lo que quieras, tendrías que usar la forma programática que se muestra arriba.

Esta es la página del proyecto, y claro que está en PyPI así que se puede usar sin problema desde fades (guiño, guiño).

Roberto Alsina: I am trying to write a Python book

Once upon a time, I tried to write a book. It did not end well. I was trying to dump a whole lot of knowledge at once. Knowledge I did not really have, to be honest. When I look at that book I see a failed thing.

So, of course, many years later, I am trying again, but with the lessons learned in my mind.

  • It will be a smaller book.
  • I am not also writing a whole tool chain for it.
  • It will be about things I know.

So, what is it?

The temporary title, right now, is something like "Boxes: your second Python book". It says your second Python book because you do need a working knowledge of Python syntax as provided by the official Python Tutorial, but not much else. When there is a particularly hairy piece of code it may link to the tutorial or the reference or something.

The "idea" of the book is to bridge a gap that exists between knowing the basics of reading and writing a language (specially if it's your first!) and being able to effectively using it to create a useful project.

It follows the growth of "Boxes", a simplistic text layout engine, from a vague idea to a fully working, useful, tested, and published piece of software.

It's not there yet, but it's about 25% of the way there.

You can read it here: https://ralsina.gitlab.io/boxes-book/ and the sources are at https://gitlab.com/ralsina/boxes-book

Comments much appreciated!

Mariano Guerra: Creemos en la Web: Lo espacial es invisible a los ojos

En la sección previa (Creemos en la Web: CSS y cosas por el estilo) terminamos con una pagina que se veía así:

/galleries/cew/4/05-link.png

Que tendríamos que hacer si quisiéramos que la palabra lista tuviera la clase llamativo?

Hasta ahora para aplicar una clase a una palabra o conjunto de palabras aprovechábamos un tag que ya estaba ahí (b, i o li), pero dos de ellos aplican un formato que no queremos, y el otro solo funciona con listas.

Como podemos hacer para definir una selección para aplicarle atributos pero que en si no signifique nada?

Para eso hay un tag llamado span que en ingles significa algo así como tramo, palmo, lapso o mas detallado: la extensión completa de algo de punta a punta; la cantidad de espacio que cubre algo.

Osea, demarca el comienzo y fin de algo, su extensión y nada mas. Este tag no significa nada en si mismo, solo lo usamos para demarcar una región a la cual queremos referirnos para algo.

Si, muy difuso, vamos a algo mas tangible, en nuestro caso queremos usar span para demarcar la palabra lista y aplicarle la clase llamativo:

<p>
    Una <span class="llamativo">lista</span> no ordenada:
</p>

Y

<p>Una <span class="llamativo">lista</span> ordenada:</p>

Logrado nuestro objetivo pasamos al siguiente desafió, queremos resaltar el segundo párrafo poniéndole un borde, para eso vamos a usar un conjunto de atributos CSS nuevos:

<p style="border-width: 1px; border-style: solid; border-color: red;">Esto es otro párrafo</p>

Es un poco largo para solo decir "quiero un border rojo, de 1 pixel de ancho y solido", por suerte hay una versión abreviada:

<p style="border: 1px solid red;">Esto es otro párrafo</p>

No se vos, pero a mi me parece que el texto esta muy pegado al borde rojo, preferiría que tuviera un poco mas de espacio.

Para eso usamos una de dos formas de darle mas "espacio" a un tag, una es el espacio "interno" (entre el borde y el contenido) y otro es el espacio "externo" (entre el borde y sus vecinos).

El espacio interno en ingles se llama padding (se traduce "relleno"), el espacio externo en ingles se llama margin (se traduce "margen").

Estos dos atributos los vas a usar mucho en el día a día y como se usan mucho hay formas abreviadas y mas especificas de usarlos, empecemos con la abreviada que es la que nos sirve a nosotros.

<p style="padding: 8px; border: 1px solid red;">Esto es otro párrafo</p>

Eso esta un poco mejor!

Ya que estamos haciéndonos espacio, demosle un poco mas de espacio exterior:

<p style="margin: 8px; padding: 8px; border: 1px solid red;">Esto es otro párrafo</p>

Un poco mejor, pero si bien le da espacio con respecto al párrafo anterior y el siguiente, también tiene un margen izquierdo que lo "desalinea" con respecto al resto de los tags.

Para poder especificar margenes y rellenos con mas nivel de detalle vamos a necesitar usar las versiones menos abreviadas, ambas aplican tanto a margin como a padding así que las vemos juntas:

Primero la que ya vimos:

margin: 8px;
padding: 8px;

Esto aplica a los 4 lados del tag, el siguiente nos permite especificar dos valores:

margin: 8px 0px;
padding: 8px 0px;

El primer valor es para arriba y abajo, el segundo valor para la izquierda y la derecha.

El no abreviado nos permite especificar los cuatro valores:

margin: 8px 0px 0px 0px;
padding: 8px 0px 0px 0px;

Y el orden es como las agujas del reloj:

margin: <arriba> <derecha> <abajo> <izquierda>;
padding: <arriba> <derecha> <abajo> <izquierda>;

Pero que pasa si solo queremos especificar uno de ellos? tenemos que poner en 0 a todos los otros siempre? Por suerte no, hay otra forma de ser aun mas especifico, diciendole cual margen o relleno queremos definir:

margin-top: 8px;    /* top: arriba */
margin-right: 0px;  /* right: derecha */
margin-bottom: 0px; /* bottom: abajo */
margin-left: 0px;   /* left: izquierda */

Como veras a la derecha de las definiciones puse las traducciones entre /* y */, si escribís eso en tu CSS va a funcionar. Esto es porque son comentarios, una forma de agregar notas en el código CSS que el navegador ignora ya que es para los humanos.

Si querés escribir comentarios en HTML es un poco distinto:

<!-- Esto es un comentario, puede ir en cualquier lado y el navegador
     lo va a ignorar, puede extenderse mas de una linea.

     suele ser útil cuando queremos esconder un tag pero no borrarlo.
-->

Volviendo al tag span, este tag sirve solo para rodear segmentos de texto, que pasa si queremos agregar un borde con relleno a los primeros 3 párrafos?

Agregar borde a cada párrafo no sirve, porque lo que queremos es "rodear" los 3 párrafos con un borde y el tag span solo sirve para rodear texto.

Obviamente este problema se resuelve con un nuevo tag, se llama div y cumple la misma función que span pero se diferencia en que dentro de el puede haber otros tags.

Probemoslo rodeando los 3 primeros párrafos con un borde verde y relleno de 8 pixeles:

<div style="border: 1px solid green; padding: 8px">
  <p>Esto es un párrafo, la siguiente palabra es en
     <b class="llamativo">negrita</b>, la siguiente en
     <i class="llamativo">itálica</i>
  </p>

  <p style="margin: 8px; padding: 8px; border: 1px solid red;">
    Esto es otro párrafo
  </p>

  <p>
    Una <span class="llamativo">lista</span> no ordenada:
  </p>
</div>

El resultado queda algo así (tené en cuenta que esta sección ya tiene CSS así que en Thimble se va a ver un poco distinto):

Esto es un párrafo, la siguiente palabra es en negrita, la siguiente en itálica

Esto es otro párrafo

Una lista no ordenada:

Con lo que aprendimos en esta sección podemos arreglar una cosa que no quedaba del todo bien.

Quizás notaste que al aplicar la clase llamativo a los ítems de la lista, el marcador de la izquierda también se volvió llamativo, si queremos que solo el contenido del ítem sea llamativo y no el ítem completo, podemos hacer uso de nuestro nuevo amigo el tag span para aplicar la clase solo al contenido.

Pasamos de:

<ul>
  <li class="llamativo">Manzana</li>
  <li>Durazno</li>
  <li class="llamativo">Banana</li>
</ul>
  • Manzana
  • Durazno
  • Banana

A:

<ul>
  <li><span class="llamativo">Manzana<span></li>
  <li>Durazno</li>
  <li><span class="llamativo">Banana<span></li>
</ul>
  • Manzana
  • Durazno
  • Banana

Y Problema resuelto.