Reglas generales para el género de los sustantivos en alemán

Una de las partes complicadas del alemán es saber el género de los sustantivos, porque hay tres y no coinciden con los que usamos en español, así que me copio aquí unas cuantas reglas generales para tenerlas a mano y repasarlas de vez en cuando. Ojo que todas tienen excepciones, pero para salir del paso si no recordamos el género pueden servir:

Masculino

  • Sexo natural según el género: der Vater, der Sohn, der Onkel.
  • Profesiones: der Polizist, der Koch, der Lehrer. Para construir el femenino añadimos -in: die Polizistin, die Köchin, die Lehrerin.
  • En general los países no tienen género, pero los que lo tienen son masculinos: der Libanon, der Irak, der Iran, der Sudan, der Jemen.
  • Las estaciones del año (der Frühling, der Sommer, der Herbst, der Winter), los meses del año y los días de la semana.
  • Precipitaciones, tormentas, rayos y centellas: der Regen, der Schnee, der Sturm, der Donner, der Blitz,…
  • Los puntos cardinales: der Norden, der Süden, der Osten, der Westen.
  • Marcas de coches: der Audi, der BMW
  • Montañas, minerales y piedras
  • Nombres de bebidas alcohólicas (ojo, no das Bier claro)
  • Terminaciones de palabras típicas de masculino:
    • -and
    • -ant
    • -är
    • -ast
    • -ent
    • -er
    • -eur
    • -ich
    • -ig
    • -iker
    • -ismus
    • -ist
    • -ling
    • -or

Femenino

  • Sexo natural según el género: die Mutter, die Tante, die Tochter
  • Las especies de árboles: aunque el árbol es masculino (der Baum), las especies de árboles son femeninas: die Ulme, die Eiche
  • Las flores, los números, aviones, motos y barcos.
  • Terminaciones de palabras típicas de femenino:
    • -ade
    • -age
    • -aille
    • -aise
    • -anz
    • -e
    • -ei
    • -elle
    • -enz
    • -ette
    • -ie
    • -ik
    • -ille
    • -ine
    • -in
    • -ion
    • -isse
    • -ität
    • -itis
    • -ive
    • -heit
    • -keit
    • -schaft
    • -sis
    • -ung
    • -ur

Neutro

  • Metales
  • Elementos químicos
  • Hoteles, cines y cafés
  • Colores
  • Notas musicales
  • Unidades físicas
  • Letras del abecedario
  • Terminaciones de palabras típicas del neutro
    • -chen: todos los diminutivos son neutros.
    • -ett
    • -ing
    • -ma
    • -tel
    • -um

Fuentes: Crónicas germánicas, alemanista.com

Una acción de Nemo para reducir el tamaño de los PDF

Primero guardamos este script que es el que se ocupa de reducir el PDF:

Lo descomprimimos (WordPress no deja adjuntar ficheros .sh) y lo guardamos por ejemplo en /home/koas/bin.

Y para la acción de Nemo creamos un fichero en /home/koas/.local/share/nemo/actions con este contenido:

[Nemo Action]
Active=true
Name=Shrink PDF
Exec=/home/koas/bin/shrinkpdf.sh %F %F.pdf 300
Selection=S
Extensions=pdf;
EscapeSpaces=true

Mover carpeta de datos de MySQL

Hay ya miles de entradas sobre cómo cambiar la carpeta de datos de MySQL de /var/lib/mysql a cualquier otra, pero me costó encontrar la solución al problema “Error 13 – Permission denied” que me daba al intentar arrancar MySQL después de cambiarle la carpeta de datos.

El problema es que la nueva ruta estaba en /media/koas/Ext4Bucket, un segundo disco duro que tengo instalado. Para que funcione hay que darle a /media/koas permisos 777.

Nuevo artículo en dev.to

En este blog escribo básicamente para mí mismo, pero hay algunos temas sobre los que creo que puedo escribir artículos que realmente sean útiles para más personas. Esos artículos los escribiré (en inglés) en dev.to, que es un portal de contenido para desarrolladores.

Y aquí tenemos el primero, habla sobre cómo usar cabeceras HTTP para ayudarnos a depurar sitios web que están en producción.

Música para programar: el género Italo Disco y las sesiones de Juan Prada

Hace unos años en un viaje a Cangas de Onís para actuar con la Orquesta Vaya Panorama mi amigo Juan Prada me descubrió el género Italo Disco, que es básicamente música disco italiana de los ochenta que está muy bien para programar.

Fue una recomendación doble, porque Juan además de programador también es DJ, así que sabe mucho de los dos mundos. Podéis descargar las sesiones que hace para Frisky Radio (que también son ideales para programar) en su página web.

Cambiar el lenguaje de programación de un repositorio de GitHub

A veces GitHub no detecta correctamente el lenguaje principal de un repositorio. Por ejemplo, para Mi Segundo PC como tiene más ficheros con extensión php que js decía que el lenguaje era PHP en vez de JS.

Para solucionarlo creamos un fichero .gitattributes en el directorio raíz del repositorio con este contenido:

* linguist-vendored
*.js linguist-vendored=false

Esto le indica a GitHub que desactive la detección de lenguaje para todos los ficheros y la active para los .js, haciendo así que el lenguaje detectado sea JavaScript.

Eliminando autenticación para phpMyAdmin

¡Atención! Esto solo hay que hacerlo en nuestro equipo de desarrollo, lógicamente es una locura quitar la autenticación al phpMyAdmin en un servidor accesible desde Internet, ahí no solo debemos tener autenticación sino proteger además la carpeta con una contraseña de acceso porque phpMyAdmin no tiene ninguna protección contra ataques de fuerza bruta (no entiendo por qué, no les costaría nada implementar algo como phpLoginBlacklist).

Pero en nuestro equipo es un rollo que cada cierto tiempo caduque la sesión y nos pida que nos identifiquemos otra vez, así que la solución es editar el fichero /etc/phpmyadmin/config.inc.php y en el bloque de datos del primer servidor añadir estas líneas:

// Esta línea ya existirá, cambiamos su valor a config
$cfg['Servers'][$i]['auth_type'] = 'config';

// Estas son las líneas que añadiremos
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'pass';
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['AllowRoot'] = TRUE;

Sublime Text: convertir espacios a tabs al guardar un fichero

No soy un maniático como Richard en Silicon Valley:

Aunque yo también prefiero usar tabulados

pero como llevo un tiempo usando Pug para el HTML en Vue he acabado harto del mensaje de error Invalid indentation, you can use tabs or spaces but not both.

Para solucionar esto crearemos una carpeta UnexpandTabsOnSave en la carpeta Packages de la configuración de Sublime Text y dentro un fichero UnexpandTabsOnSave.py con este contenido:

import sublime, sublime_plugin, os

class UnexpandTabsOnSave( sublime_plugin.EventListener ):
  # Run Sublime's 'unexpand_tabs' command when saving any file
  def on_pre_save( self, view ):
    view.window().run_command( 'unexpand_tabs' )

Así cada vez que guardemos un fichero convertirá los espacios a tabs, Pug no se quejará y el Richard que llevamos dentro estará satisfecho.

Detectar atajos de teclado en una aplicación Vue

Para asociar atajos de teclado globales lo más sencillo es establecerlos en el div principal de nuestra aplicación Vue.

Así que si queremos por ejemplo lanzar nuestro menú de aplicaciones cuando el usuario haga Ctrl + Clic en cualquier parte de la página o pulse la combinación de teclas Meta + Espacio usaríamos este código:

<div id="app"
     v-on:keyup.meta.space="launchAppsMenu"
     v-on:click.ctrl="launchAppsMenu"></div>

Sin embargo al probar esto veríamos que el Ctrl + Clic funciona pero no así el Meta + Espacio. Esto es porque los eventos de teclado solo se generan para elementos que pueden tener el foco (focusables) y los div no son por defecto focusables. Para que lo sean solamente tenemos que añadirle el atributo tabindex, una vez lo tenga podrá recibir eventos de teclado. Así quedaría entonces nuestro código:

<div id="app" tabindex="0" 
     v-on:keyup.meta.space="launchAppsMenu"
     v-on:click.ctrl="launchAppsMenu"></div>

Número de compilación automático en aplicaciones Vue

Para disponer del número de compilación en nuestra aplicación Vue he creado este pequeño script. Para usarlo hay que modificar el fichero package.json y sustituir en “scripts” el valor de “build” por ./buildAndUpload.php

Luego creamos el fichero ./buildAndUpload.php con este contenido:

#!/usr/bin/php
<?php
// Get version number
$version = json_decode(file_get_contents('package.json'), true)['version'];
$version = substr($version, 0, -2);

// Get build number
$build = trim(file_get_contents('.buildNumber')) + 1;
file_put_contents('.buildNumber', $build);

echo "Shipping version $version build $build\n\n";

// Save version file
$js = "var appVersion = $version;var buildNumber = $build;";
file_put_contents('./public/appVersion.js', $js);

exec('vue-cli-service build');

// Upload dist folder to server

El número de compilación inicial lo guardaremos en el fichero .buildNumber. Y con esto ya estaría todo, ahora cada vez que compilemos nuestra aplicación se generará en la carpeta dist un fichero appVersion.js que podremos incluir en nuestra aplicación y que contendrá el número de versión (que se extrae del fichero package.json) y el número de compilación.