Dar permiso a un grupo de usuarios de AD para reiniciar el servicio de cola de impresión en Windows

Problema

Resulta que Windows tiene un problema con HP (o HP con Windows, qué mas da) y su controlador Universal Print Driver, que provoca que prácticamente cualquier programa se bloquee al imprimir esperando indefinidamente a que termine el proceso de impresión (splwow64.exe).

Parche

Tras perder una ingente cantidad de horas tratando de comprender y resolver el problema, di con un workaround, que es ejecutar este ficherito. Llamémoslo reiniciar_impresoras.bat:

sc stop spooler
taskkill /f /im splwow64.exe
sc start spooler

Básicamente, lo que hace es parar el proceso Cola de impresión (spooler), matar todos los subprocesos splwow64.exe colgados que queden y volver a levantar el servicio.

Vamos, lo que todo el mundo conoce como apagar y volver a encender, pero solo del proceso colgado.

Nuevo problema

Tienes que ser el Administrador para que esto funcione. Claro, en un entorno con más de 20 usuarios, no puedo dar esos permisos a cualquiera.

Dando permisos por servicio a los usuarios

Lo primero que vamos a hacer es respaldar los permisos actuales del servicio, para poder restaurarlos en caso de romperlo todo involuntariamente (cosa bastante fácil con estos asuntos). Para ello, ejecuta como administrador este comando y guarda bien todo el texto que te devuelva:

sc sdshow spooler

En mi caso devuelve:

D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCR‌​RC;;;SY)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Como todo el entorno está montado con un Active Directory (llamémoslo MiDominio), crea un grupo de usuarios al que le daremos luego permiso para reiniciar ese servicio. Lo llamaremos ReiniciarImpresoras.

Descárgate la utilidad SetACL (versión Administrators).

Ahora, siguiendo las instrucciones y la documentación, estableceremos el permiso para que los usuarios del grupo ReinicarImpresoras puedan reiniciar el servicio de Cola de impresión. Supongamos que la máquina en la que estamos trabajando se llama MiMaquina. Ejecuta lo siguiente como administrador:

SetACL.exe -on \\MiMaquina\spooler -ot srv -actn ace -ace "n:MiDominio\ReiniciarImpresoras;p:start_stop"

Ahora tus usuarios podrán ejecutar el script reiniciar_impresoras.bat cada vez que se les bloqueen.

Sincronizar tu colección de música del ordenador con la de tu teléfono móvil

Primero, enchufa tu móvil Android a tu ordenador para averiguar el ID con el que se monta, para reemplazarlo en la fila que pone PHONE_ID=XXXX-XXXX.

Ahora copia este script en ~/.local/bin/rsync-music2phone (por ejemplo).

#!/bin/bash

# Escribe aquí el ID de tu teléfono cuando se automonta con GVFS.
# Puedes averiguarlo desde Nautilus abriendo la carpeta y pulsando Ctrl+L.
# La ruta será algo parecido a /run/media/$USER/$PHONE_ID/
POHNE_ID=XXXX-XXXX

# Carpetas XDG
test -f ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs && \
    source ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs

# Por defecto, asumimos que guardas la música en una carpeta llamada "Música":
XDG_MUSIC_DIR="${XDG_CONFIG_HOME:-$HOME/Música}"

rsync --archive --exclude '*.jpg' --exclude '*.jpeg' --exclude '*.png' --exclude '*.bmp' --exclude '.*' --delete-before --delete-excluded --progress --modify-window 1 $XDG_MUSIC_DIR/ /run/media/$USER/$PHONE_ID/Music

Usa ese comando y tu colección se sincronizará solita.

Cómo crear un fichero SWAP (no una partición)

A veces tienes contratado un sistema remoto que no te permite modificar las particiones ni ampliar la RAM, pero necesitas más. La solución más sencilla sería una partición Swap, pero al no poder hacer particiones… ¿Qué puedes hacer? Pues un fichero Swap.

Gracias al Swap FAQ de Ubuntu os pongo una guía bien sencilla (sirve para cualquier distribución).

Reservamos 1024 MiB para un archivo swap:

# fallocate -l 1024m /mnt/1024MiB.swap

Esto evitará que los usuarios husmeen donde no deben:

# chmod 600 /mnt/1024MiB.swap

Lo formateamos:

# mkswap /mnt/1024MiB.swap

Lo montamos en esta sesión:

# swapon /mnt/1024MiB.swap

Hacer el cambio permanente:

# echo /mnt/1024MiB.swap none swap sw 0 0 >> /etc/fstab

Parchear Shellshock en sistemas antiguos

A estas alturas todos deberíamos saber qué es Shellshock, pero a modo de resumen: una seria vulnerabilidad en bash que nos puede salir muy cara si no lo actualizamos, y que lleva escondida entre nosotros unos 14 años.

Mi problema es que tenía un servidor bastante viejo ya, con una versión de Ubuntu anticuada, pero que por problemas de pereza agenda nunca he actualizado.

Gracias a Shellshocker ha sido coser y cantar.

Comprobar que tienes la vulnerabilidad

curl https://shellshocker.net/shellshock_test.sh | bash

Parchear la vulnerabilidad compilando Bash

Esto es útil para sistemas que no reciben actualizaciones. Si no es tu caso, probablemente con actualizar Bash desde el gestor de paquetes sea suficiente. Para los demás:

curl https://shellshocker.net/fixbash | sh && sudo chmod o+rx /bin/bash

Cómo instalar WhatsApp en una tablet Android

WhatsApp… Cómo lo detesto.

Para que no me esté pitando todo el día el móvil, decidí instalarlo en la tableta, pero resulta que solo está disponible para móviles.

Gracias al blog de tecnología de ABC encontré la solución, que es descargar manualmente http://www.whatsapp.com/android/current/WhatsApp.apk e instalarlo.

Recuerda que así no tienes actualizaciones automáticas.

Incomodidades Sociales Electrónicas Innecesarias (ISEI)

Hoy escribo un artículo que transciende de lo técnico que suele ser este blog, y pasa a ser algo más psicosociológico. Por supuesto, solo es una mera opinión, pero quería compartirla.

Por culpa de Gracias a las nuevas tecnologías, observo la creación de un nuevo fenómeno al que me he tomado la libertad de denominar ISEI (Incomodidades Sociales Electrónicas Innecesarias).

Básicamente, son situaciones socialmente incómodas, surgidas a partir de los nuevos medios electrónicos de comunicación (redes sociales y programas de MI, principalmente).

Lo más irónico de las ISEI es que son innecesarias. En una sociedad en que el único medio de comunicación remoto era el teléfono fijo y la carta, o en la que no se asumiera que estás las 24 horas del día conectado a la red de forma localizable, la gente jamás las experimentaría.

Cómo se originan las ISEI

En toda comunicación existe un emisor y un número indeterminado de receptores, aunque normalmente sea uno solo.

Lamentablemente, las ISEI las provocan los receptores, pero no son culpables de ello, ya que las provocan al dar un uso razonable a sus medios de comunicación.

Las ISEI se gestan únicamente en el interior de un emisor subjetivo, picajoso y desinformado. Este emisor cree que, por tener cierta información que permite monitorizar hasta cierto punto las actividades del receptor, puede adivinar sus pensamientos, actitudes o actividades.

Las ISEI son, por tanto, creación (y culpa) del emisor.

Contaré algunas experiencias recientes (no necesariamente mías), para mayor claridad:

El amigo bloqueado

Tengo un amigo al cual no veo muy a menudo, pero que es muy pelmazo escribiendo por WhatsApp. Tanto, que acabé bloqueándolo.

El otro día lo vi por la calle y lo saludé con una palmadita en la espalda. Ni me miró a la cara. Días más tarde recibí una llamada:

- Él: Hey, el otro día te vi por la calle.

- Yo: Sí, te saludé. Pensaba que no te habías dado cuenta, como no me dijiste nada…

- Sí, claro, por la calle me saludas, pero en el WhatsApp me sigues teniendo bloqueado, ¿eh?

- Es que te pones muy pelmazo por ahí, pero me puedes llamar cuando quieras.

- *click*

La amiga ausente

Cenando en un restaurante, con la típica amiga que vive más enganchada del móvil que de la realidad:

- ¿Qué miras tanto rato en el móvil?

- Es que me han comentado una foto en Instagram. ¿Tú tienes Instagram?

- No, ni me pienso hacer.

- ¡Puf, no tienes vida social!

La novia controladora

- ¡Eh, ¿por qué no respondiste a mi WhatsApp?! Vi que tenías el doble check

- Ah, pues no me ha sonado el teléfono.

Abres el móvil. No tienes notificaciones. Android debió matar el proceso sin preguntar. Abres WhatsApp y en ese instante aparecen las conversaciones y las notificaciones. Justo entonces tu novia te mira el móvil.

- Ya. “No te ha sonado”. Claaaro.

Piense mal y [creerá que] acertará

- Pues esta mañana he puesto un mensaje en el grupo de WhatsApp y nadie responde. Estoy harta, siempre igual. Yo no sé por qué, pero todos pasan de mi cara. Creo que me voy a salir y que les zurzan.

Pasa un rato, y aparecen varios mensajes en el grupo, del estilo: “Perdonad, que estaba en el trabajo. Ahora que me he desliado, aprovecho. ¡Me parece perfecto, contad conmigo!”

Por qué se crean las ISEI

Básicamente, porque el emisor asume como verdades cosas que muchas veces son mentiras. Veamos algunas:

Todos usan el sistema igual que yo

El emisor de una comunicación electrónica puede suponer que el receptor da el mismo uso que él a dicho medio de comunicación.

Es decir, alguien que se pasa el día enganchado a la red social X, deduce que el resto de gente también lo está, y que si no responden a sus mensajes o publicaciones es porque deliberadamente están ignorándolo.

La realidad puede distar mucho de su deducción. Por ejemplo, el receptor puede tener dicho programa configurado para no recibir notificaciones, o puede que lo utilice solo en lugares donde tenga acceso a Wifi, o puede que tenga una cuenta residual que apenas use.

También puede que el receptor reciba tal cantidad de notificaciones que acabe por ignorarlos sistemáticamente salvo que sean de vida o muerte, lo cual es un uso perfectamente aceptable de estos medios de comunicación.

El sistema es infalible

El emisor podría pensar: “Si he enviado el correo, es que ha llegado. Si ha llegado es que lo ha leído. Si lo ha leído, es que debería haber respondido. Si no ha respondido, es que me tiene manía.”

Puede olvidar que el correo de Mail Delivery Subsystem que borró hace unos minutos pensando que era un virus, tal vez le decía que el correo no se había podido enviar. Puede olvidar que se hartó de esos correos y los marcó como SPAM, con lo que nunca se enterará de que su correo falló. Puede olvidar que tal vez tenga un virus en su ordenador y su correo le haya entrado como SPAM al receptor, o que tal vez el receptor no lo ha visto aún, o que tal vez lo ha visto pero no ha tenido tiempo de leerlo, o que tal vez lo ha leído pero no pudo responder todavía porque está ocupado viviendo en el Mundo Real™.

En cualquier caso, eso abarcaría meros problemas de configuración, pero no olvidemos que los medios de comunicación están desarrollados por personas imperfectas, ergo tienen imperfecciones y caídas del sistema o de la red.

Este medio de comunicación sustituye a la tradicional

Este es, quizá, la más grave de las mentiras que puede asumir el emisor. Los nuevos medios de comunicación complementan a la comunicación tradicional, no la sustituyen.

Para un emisor afectado por esta mentira, alguien que no está en su red social favorita para él es como si no existiera, o no mereciera su trato.

Por ejemplo, si X no tiene Facebook y yo acostumbro a quedar con mis amigos usando eventos de Facebook, nunca quedaré con X.

Otro ejemplo: si quiero saber qué tal le va la vida a un amigo que no veo hace tiempo, le mando un WhatsApp diciendo “ola k ase”.

O quizá, si necesito urgentemente cierta cosa, la pido mandando un WhatsApp. Si no se me responde con la urgencia que exijo, me enfado con esa persona por no estar atento.

El emisor olvida que estos medios de comunicación nunca podrán sustituir a otros más tradicionales, como hacer una llamada, quedar con el receptor a tomar un café y hablar cara a cara.

Cómo evitarlas

Supongo que la única opción viable es informar a los emisores habituados a crearlas de lo que están haciendo en realidad (tal vez un enlace a este artículo te sirva…), de lo que esto revela acerca de ellos, y establecerles unas barreras claras.

La otra opción sería unirte a las hordas de emisores zombi de nuevas redes sociales, pero personalmente por ahí no pienso pasar. Fácilmente te convertirías en un creador de nuevas ISEI.

La última solución, más drástica, sería cambiar de amigos.

Me encantaría saber la opinión de los lectores, si es que hay alguno. Tranquilos, no pensaré mal si no opináis.

Proceso System consumiendo mucha CPU en un Windows virtualizado con VMWare

Me he tirado muchísimo tiempo tratando de identificar la fuente de un error que tenía en una máquina que trabaja con Windows 2008 Server R2 virtualizada en un VMWare ESXi.

Problema

El proceso System (el núcleo del sistema) estaba consumiendo tanta CPU que no dejaba prácticamente nada para los usuarios, y estos experimentaban interminables ralentizaciones.

Causa

Me mareó mucho la información sobre desactivar el módulo intelppm (los controladores de la CPU) que encontré en muchos sitios de Internet, pero todo eso no sirvió para nada más que para perder el tiempo.

Finalmente, la causa (al menos en mi caso) era que el archivo de paginación (el equivalente en Windows a las particiones swap) iba demasiado ahogado.

Solución

Ampliar el tamaño del disco duro desde VMWare (tuve que eliminar todas las snapshots para que me dejase), y después ampliar la partición desde Windows.

Cuidado con los “megas”

¡Contrata hoy el ADSL de 20 megas con un 15% de descuento!

Cuidado con esos megas.

En el habla cotidiana, la palabra megas es una abreviatura incorrecta e inexacta, de lo que las operadoras de telefonía se aprovechan para crear confusión y darte gato por liebre.

Vamos a diferenciar las 4 unidades de medida que se pueden entender por mega:

  1. Megabyte (MB): 1.000.000 bytes (recordemos que cada byte son 8 bits).
  2. Mebibyte (MiB): 1.048.576 (1024 x 1024) bytes.
  3. Megabit (Mb): 1.000.000 de bits (la octava parte de 1 MB).
  4. Mebibit (Mib): 1.048.576 bits (la octava parte de 1 MiB).

Es decir, que cuando la gente habla cotidianamente de megas, piensa que habla de megabytes, aunque en realidad esté hablando de mibibytes.

Sin embargo, cuando una compañía te vende conexiones de datos, siempre te está hablando en Mbps (Megabits por segundo), que es aproximadamente una octava parte de lo que tú crees que te están vendiendo (porque 1 byte son 8 bits).

Es decir, que el titular superior podríamos leerlo como:

¡Contrata hoy el ADSL de 2,5 MB/s con un 15% de descuento!

O, para ser más exactos:

¡Contrata hoy el ADSL de 2,384 MiB/s con un 15% de descuento!

Ahora ya nos entendemos…

Cómo transformar videos con GStreamer

Situación

Tienes unos cuantos vídeos en tu ordenador procedentes de diversas fuentes (cámara, móvil, Internet, etc.) con diversos formatos (.mp4, .mov, etc.) y quieres unificarlos en un formato libre (aunque no necesariamente, pero sí es recomendable) que ocupe menos espacio en tu disco duro (más información sobre los formatos de vídeo).

Solución fácil, pero uno por uno

Si no te importa ir archivo por archivo, lo más sencillo es usar Transmageddon, una aplicación que viene empaquetada en casi todas las distribuciones Linux, y que resulta muy fácil de utilizar.

Solución difícil, pero todos de una vez

Usaremos directamente GStreamer 1.0, que es la herramienta que usan entre bastidores casi todas las herramientas gráficas de audio en GNOME.

Crea un script llamado ~/.local/bin/gst-video-compress con este contenido:

#!/bin/bash

# Transform to Ogg (VP8 + Opus)
function transcode {
    gst-launch-1.0 \
        filesrc "location=$(readlink -f $1)" ! \
        decodebin name=demux ! \
            queue ! \
                progressreport "name=Encoding video for $1" ! \
                vp8enc ! \
                oggmux name=mux ! \
                filesink "location=$(readlink -f ${1%.*}).ogg" \
            demux. ! queue ! \
                progressreport "name=Encoding audio for $1" ! \
                audioconvert ! \
                audioresample ! \
                opusenc ! \
        mux. \
    && [ "$RM" == "y" ] && rm "$n"
}

# Fork it to make use of all processors
for f in $*; do
    while [ $(jobs | wc -l) -ge $(nproc) ]; do
        sleep 5
    done

    transcode $f &
done

# Don't exit until everything is finished
for j in $(jobs -p); do
    wait $j
done

Esto coge cualquier vídeo y lo transforma a Ogg (VP8 + Opus) con el mismo nombre de fichero que el anterior, y además transcodifica simultáneamente tantos videos como procesadores tengas. Si quieres entender lo que hace, consulta la explicación que ya di sobre qué son las tuberías de GStreamer y esta respuesta de Stack Overflow. También puedes usar el comando gst-inspect-1.0 con cada plugin (filesrc, decodebin, queue, etc.) para ver qué hace cada cual.

Ahora puedes invocar ese script de la siguiente manera:

$ gst-video-compress *.mp4 *.mov

Y si quieres que automáticamente vaya borrando los ficheros conforme vaya transcodificándolos sin errores:

$ RM=y gst-video-compress *.mp4 *.mov