Clip/Manga Studio

De momento, no se pueden alinear objetos (al estilo Inkscape o similares)

Para crear una “rejilla democrática”, crear un “Panel” con las dimensiones del borde exterior de la rejilla, seleccionar su capa principal y luego subdividirlo con Layer / Ruler – Frame / Divide frame border equally

Para dibujar curvas paralelas, crear una regla especial de tipo curvas

Los ajustes detallados de la herramienta actual pueden estar ocultos, mira si Window/Subtool Detail está activado.

Enlazar / conectar bocadillos: crea los 2 bocadillos como capas diferentes, añade el rabillo que los conecta y combina ambas capas.

Se puede gestionar fácilmente la superposición de figura y fondo usando una capa para cada uno, y máscara de capa en el fondo (al pinchar en la máscara, puedes borrar lo que se ve, sin borrar el contenido en sí)

Si no te convence la sensibilidad de tu lápiz, prueba a refinarla en el propio Clip Studio.

Con la regla especial, es bastante fáćil dibujar líneas cinéticas (curva paralela, radial, lineas paralelas…)

Se pueden conseguir efectos bastante interesantes con las opciones de superposición de capa (Multiply, Substract…) Hay que tener cuidado al seleccionar colores con esa opción, ya que se captura el color que se ve, no el que hay realmente en la capa actual.

Si no controlas mucho el lápiz (lo cual es fácil, si usas tableta sin pantalla), suele ser más interesante hacer un dibujo a “lápiz” en una capa, y usarla como referencia (azul) para dibujar en otra capa la “tinta” más despacio y prestando atención al flujo.

Crear plumas personalizadas / materiales a partir de dibujo

Estupendo Tutorial sobre reglas de perspectiva en Clip Studio

Instalar Linux en Alienware R3

Desactivar “Secure Boot” en la BIOS (F2)

Arrancar UEFI desde pendrive Ubuntu (F12)

Instalar Ubuntu 18.04 (añadir opción kernel nomodeset a /boot/grub/grub.cfg)

Arrancar Ubuntu

Actualizar


sudo apt-get update
sudo apt-get upgrade

Instalar driver Nvidia y Optimus (prime)


apt-get install linux-headers-$(uname -r)
add-apt-repository ppa:graphics-drivers
apt-get update
apt-get install nvidia-driver-396
# quitar nomodeset en grub
reboot

# nvidia-prime
prime-select query
prime-select {intel|nvidia}

# Bumblebee (para controlador propietario)
apt-get install bumblebee-nvidia

Comprobar que en /etc/bumblebee/xorg.conf.nvidia, el BusID se correponde con el de la tarjeta NVidia (por ejemplo, PCI:01:00.0)

El brillo de la pantalla se puede ajustar con el siguiente comando (X representa el porcentaje, por ejemplo .8 equivale 80%)


xrandr --output eDP-1-1 --brightness X

Si el trackpad no funciona, probar a no usar el modulo i2c_hid


# Prueba OpenGL
LIBGL_DEBUG=verbose glxgears

Instalar CUDA


wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda_9.2.88_396.26_linux
bash cuda_9.2.88_396.26_linux
# parche recomendado
wget https://developer.nvidia.com/compute/cuda/9.2/Prod/patches/1/cuda_9.2.88.1_linux
bash cuda_9.2.88.1_linux
cat > /etc/profile.d/cuda.sh <

Suspender equipo

En la mayoría de los modelos, con la siguiente configuración de Grub se consigue que la suspensión del equipo funcione correctamente:


# Añadir en /etc/default/grub
GRUB_CMD_LINUX_DEFAULT += nogpumanager acpi_osi=! acpi_osi="Windows 2009"
# luego, ejecutar...
update-grub

Más información:

Archlinux en Alienware 13

Ubuntu 16.04

Bumblebee: cuelgues

Driver Nvidia y CUDA

Ubuntu

# Comprobar qué paquetes hay disponibles:
ubuntu-drivers devices
# Instalar
apt-get install nvidia-390
# Reiniciar
reboot
# comprobar
nvidia-smi

# https://developer.nvidia.com/cuda-downloads
# https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=debnetwork
# Descargar definición repositorio
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
apt-key adv –fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
apt-get update
apt-get install cuda

SSL Reverse proxy con Apache

Un ejemplo que sirve para Meteor:


SSLProxyEngine On
# snake oil certs in proxyied service -> skip checks
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

ProxyRequests Off
ProxyPreserveHost On

ProxyPass /websocket ws://localhost:3000/websocket
ProxyPassMatch ^/sockjs/(.*)/websocket ws://localhost:3000/sockjs/$1/websocket

ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
ProxyPassReverseCookiePath / /
ProxyPassReverseCookieDomain 127.0.0.1 52.211.154.50
RequestHeader set X-Forwarded-Proto "https"

Parece que en nginx la configuración análoga es trivial. Quizá sea un buen argumento para convertirse…

Secure cookies over reverse proxy with https

HTML

Etiquetas básicas

# Estructura:
<body>, <section>, <article>, <nav>, <aside>, <header>, <footer>, <h1>..<h6>, <details>, <summary>
# aside se aconseja para barras lateras, textos explicativos, bloques destacados...

# Semántica:
<a>, <p>, <form>, <img>, <table>, <ol>, <ul>, <dl>, <code>, <small>, <cite>, <quote>, <abbr>, <mark>, <dfn>, <data>, <time>, <var>, <address>, <figure>, <figcaption>

# Estilo:
# Ojo que tanto <div> como <span> no siguen una estructura jerárquica (aún cuando se aniden)
 <div>, <span>

<!-- Comentario -->

Etiquetas obsoletas

<b> -> font-style:bold / <strong>
<i> -> font-style:italic / <em>
<u> -> text-decoration:underline
<acronym> -> <abbr>
<tt>, <xmp>
<applet> -> <object>
<center>, <font>, <big>
<frame>
# atributos: align, background, bgcolor 

Caracteres referenciados

Lista completa (W3C)

Los más habituales:

# espacio en blanco
&nbsp;

# acentos -> acute
&Aacute; &oacute

# acentos invertidos -> grave
&egrave;

# tilde, ñ
&atilde; &ntilde;

# ampersand, copyright, grado
&amp; &copy; &deg;

# dolar, euro
&dollar; &euro;

# flechas -> arrow
&leftarrow; &uparrow; &rightarrow; &downarrow; 

Ejemplo de página básica

<!DOCTYPE html>
<head>
   <meta charset="UTF-8" />
   <title>Título de la página</title>
   <style>...</style>
</head>
<body>
  <header>
    <h1>Título cabecera (Nombre del sitio web)</h1>
  </header>
   
  <nav>
    <header>
      <h2>Título navegación</h2>
    </header>
    <ul>... </ul>
  </nav>
   
  <article>
    <header>
      <h1>Título del artículo</h1>
      <h2>Subtítulo del artículo</h2>
    </header>
     
    <section>
      <h3>Título de la sección</h3>
    </section>
    
    <footer>
      <h4>Título del pie del artículo</h4>
    </footer>
  </article>
   
  <aside>
    <h2>Título del texto explicativo</h2>
     
    <section>
    </section>
  </aside>
   
  <footer>
     Pie de página
  </footer>
</body>

Referencias

“Dive into HTML5”, por Mark Pilgrim.

Text level semantics

Smashing Magazine:

HTML5 semantics
Designing a HTML5 layout from scratch

MDN HTML Developer Guide:

Using HTML sections & outlines

Obsolete things to avoid

HTML5Doctor:

Details & summary elements

Analizar datos estructurados desde la línea de comandos

Para texto plano basta con herramientas clásicas como awk, pero para datos dentro de páginas HTML o en Json hay alternativas más cómodas:

  • jq: JSON
  • scrape: HTML (XPath)

Patrones

Extraer las celdas de una tabla

# -a permite seleccionar sólo uno de los atributos de los elementos encontrados
# la expresion Xpath puede contener "|" para elegir varios elementos según diferentes criterios
# para quedarse sólo con el texto debería bastar /text() , pero en scrape no funciona...
scrape -a id -e '//td[@class="temperature"]' < fichero

Unir dos líneas

# cada - une una nueva linea
paste - -
sed 'N'

Eliminar etiquetas HTML

sed 's_<[^>]*>__g'

Cambiar de separador

# de : a espacio
tr ":" " "

Pasar de hora a época

# actualizar base a la época correspondiente al dia
# en el ejemplo, se añaden 16 días extra 
# el fichero de entrada tiene tres columnas: hora, minuto, dato
awk 'BEGIN{base=1465596000+(16*24*3600)}{print ($1*3600 + $2*60 + base) " " $3}'

Gráfica de dos series de tiempos

gnuplot
plot "serie1.txt" using 1:2, "serie2.txt" using 1:2

Más info: Data science at the command line / Introducción a Xpath

lynx, xmllint y ejemplos Xpath

Más ejemplos de XPath

Maquetar con Scribus

Para variar el tamaño de una imagen, cambiar el tamaño del marco con la opción Imagen/”Escalar al tamaño del marco” seleccionada. Para “recortarla”, cambiar a Imagen/”Escalado libre” y cambiar el tamaño del marco.

Para cambios rápidos, se pueden usar los comandos “ajustar marco a imagen” y “ajustar imagen a marco”

Para rotar una imagen, XYZ/Rotar.

Para numerar las páginas, entrar en Editar/Páginas maestras, añadir un marco de texto y dentro de él insertar Caracter/Número de página

Para exportar a CMYK, activar la gestión de color en las preferencias del documento. En las opciones de “Exportar como PDF”, elegir compatibilidad “PDF/X3” y en la pestaña color, “salida dirigida a impresora”.

Para reducir el tamaño del PDF, elegir “compresión JPEG con pérdidas”, limitar la resolución (por ejemplo, a 300 ppp) y seleccionar una calidad de compresión media.

Dracut

Dracut es una herramienta para construir initramfs en base a eventos. Está más presente en el universo RedHat y derivados que en el Debian (aunque la mayoría de las distribuciones lo ofrecen como paquete)

Cuando falla el arranque, se puede forzar la consola de dracut añadiendo a los parámetros del kernel “rd.shell”. Dependiendo del fallo, podemos detener la secuencia de dracut con el parámetro “rd.break” (secuencia: cmdline,pre-udev,pre-trigger,initqueue,pre-mount,mount,pre-pivot,cleanup)

Por ejemplo, “rd.shell rd.break=initqueue”

Una vez en la shell de dracut, podemos activar los software RAID con

mdadm –assemble –scan

Detectar volúmenes LVM

lvm_scan

Listar dispositivos

blkid

Información detallada del RAID

mdadm -Q –detail /dev/mdNUM_RAID

firewall-cmd CentOS

firewall-cmd --state
firewall-cmd --get-default-zone
firewall-cmd --get-active-zones
firewall-cmd --zone=Z --list-all
firewall-cmd --permanent --zone=Z --add-source=127.0.0.1/8
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --direct --passthrough ipv4 -t nat -I POSTROUTING -o IFACE -j MASQUERADE -s PRIVATE_NET 
firewall-cmd --list-services
firewall-cmd --zone=public --add-service=https 
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --list-ports
firewall-cmd --zone=public --add-port=N/tcp
firewall-cmd --zone=public --add-port=N/tcp --permanent
firewall-cmd --list-rich-rules

Interfaces X11 tradicionales en la nube

No todas las herramientas que uno quiere utilizar en la nube se han desarrollado en base a las APIs específicas, con lo cual puede ser necesario montar capas intermedias de adaptación para que al usuario final le resulte igual de cómodo.

Una de las opciones más interesantes es Guacamole, un paquete que encapsula de forma eficiente el acceso a un servicio X11. Una vez instalado, el usuario se autentica y puede disponer de un escritorio remoto como si fuese local. Eso sí, conviene delimitar sus posibilidades para que no lo utilice con fines ajenos a la aplicación.

La instalación de guacamole en Ubuntu es relativamente sencilla:

# instalar servidor VNC
apt-get install tightvncserver

# instalar dependencias del servidor Guacamole
apt-get install libjpeg-turbo8-dev libcairo2-dev libossp-uuid-dev libpng12-dev libvncserver-dev tomcat6

# "compilar" el servidor
cd guacamole-server-0.9.9/
./configure --with-init-dir=/etc/init.d
make -j 4
make install
# añadir a /etc/bash.bashrc
export LD_LIBRARY_PATH=/usr/local/lib
export GUACAMOLE_HOME=/etc/guacamole

# instalar dependencias del cliente Guacamole
apt-get install maven2

# instalar cliente
cd guacamole-client-0.9.9/
mvn package
cp guacamole/target/guacamole-0.9.9.war /var/lib/tomcat6/webapps/

# configuración básica guacamole
# guacamole.properties
guacd-hostname: localhost
guacd-port:     4822
## Auth provider class (authenticates user/pass combination, needed if using the provided login screen)
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
basic-user-mapping: /etc/guacamole/user-mapping.xml

# user-mapping.xml - cambiar USERNAME, PASSWORD y VNCPASS 😉
<user-mapping>
    <authorize username="USERNAME" password="PASSWORD">
        <protocol>vnc</protocol>
        <param name="hostname">localhost</param>
        <param name="port">5900</param>
        <param name="password">VNCPASS</param>
    </authorize>
</user-mapping>

# configurar el conector de Tomcat en /etc/tomcat6/server.xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               address="127.0.0.1"
     redirectPort="8443" />

# arrancar demonio guacamole y reiniciar Tomcat
/etc/init.d/guacd restart
/etc/init.d/tomcat6 restart

# instalar "escritorio ligero"
apt-get install lxde
# arrancar servidor VNC
vncserver -localhost

# configurar el proxy en apache
ProxyPass /guacamole/ http://localhost:8080/guacamole-0.9.9/ flushpackets=on
ProxyPassReverse /guacamole/ http://localhost:8080/guacamole-0.9.9/

En caso de problemas, puede obtenerse información adicional en los ficheros /var/log/tomcat6/catalina.out, /var/log/syslog, ~/.vnc/HOSTNAME.log

En “create a Guacamole appliance” vienen cómo configurar la autenticación contra una base de datos MySQL.

La guía de usuario de Guacamole está bastante completa.

Otras opciones son novnc (que parece menos maduro) y x2go (bastante potente, pero de momento require modificar el equipo cliente, aunque sólo sea para instalar el plugin para el navegador…) Dentro del software commercial: Remote visualization, de Adaptive Computing.

Distribución de programas en Linux. Construcción estática

La comodidad de instalar la mayoría de los programas “localmente” (con herramientas tipo apt, yum, zypper…) nos hace olvidar uno de los puntos débiles de Linux: la distribución de programas.

Cuando el código fuente está disponible y las dependencias son pocas, lo normal es que el programa se compile sin demasiados dolores de cabeza.

En otro caso, la cosa se complica. Lo habitual es compilar el programa para las distribuciones más comunes, y ofrecerlo para descarga en el formato de paquete correspondiente (.deb, .rpm…) O bien, montar un repositorio público que se pueda añadir a la lista de orígenes de paquetes.

En estos tiempos de tiendas de aplicaciones para todos, comienza a sonar raro lo de querer instalar un programa “a mano”, pero es algo que al menos en Linux sigue siendo necesario. Por ejemplo, cuando careces de privilegios en un servidor remoto. Si el servidor tiene un entorno más o menos propicio a la compilación, suele bastar con bajarse el código y crear los binarios.

En este sentido, hay que reconocerle a Windows el mérito de soportar binarios de versiones antiguas (incluyendo bastante de la época MS-DOS). Siempre que no se recurriese a enlace dinámico (que lleva al famoso “dll hell”)

Algunas referencias para los valientes que quieran penetrar el mundillo de los binarios Linux portables:

# Origen: http://insanecoding.blogspot.in/2012/07/creating-portable-linux-binaries.html
ldd app
objdump -T app | grep GLIBC_
# enlace estático curl, ssl, crypto; dinámico zlib, dl, threads, rt
gcc -o app *.o -static-libgcc -Wl,-Bstatic -lcurl -lssl -lcrypto -Wl,-Bdynamic -lz -ldl -lpthread -lrt 

# Origen: http://askubuntu.com/questions/315907/libc-so-6-version-glibc-2-16-not-found
/catbed/ld-linux.so.3 --library-path=/catbed:/whatever-else /usr/bin/python -python-args
# como especificar parametros enlace estático en cmake
# origen: http://cmake.3232098.n2.nabble.com/Howto-compile-static-executable-td5580269.html
  set(CMAKE_EXE_LINKER_FLAGS -static)
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
    set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)       # remove -Wl,-Bdynamic
    set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
    set(CMAKE_SHARED_LIBRARY_C_FLAGS)         # remove -fPIC
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS)
    set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)    # remove -rdynamic
    set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) 

Comandos útiles Linux

# simple way to make propagate "execute" permissions (X sets execute if x is already set in some of the classes)
chmod -R a+X start_dir

# account expiration -> chage
chage -l USER

# disable bell / beep in terminal
xset b off

# ssh tunnels
# basic: VNC tunnel for display :4
ssh -L 5904:localhost:5904 usr23@remote-desktop.atwork.com

# Scenario 1: final is behind NAT, firewall at work, gateway host
# at final, create a "reverse tunnel" T1 from gateway to final. You will connect to port 22 of final (standard SSH) through port 8022 at gateway
ssh -R  8022:final.atwork.com:22 usr2@gateway.atwork.com
# at L, create a tunnel T2 from your laptop L port 8122 to port 8022 of gateway
ssh -L 8122:gateway.atwork.com:8022 usr2@gateway.atwork.com
# at L, connect to final through T2
ssh -p 8122 usr3@localhost

# Scenario 2: "only" problem is that final is behind work firewall
# at final
ssh -R  8022:final.atwork.com:22 usr2@laptop.athome.com
# at L
ssh -p 8022 usr3@localhost

# nc
# send file to peano and exit (without -q 0, nc keeps waiting for more data)
cat file | nc peano 8765 -q 0

AUDIO

# extract audio from video as 44.1KHz,320Kb/s MP3 file
ffmpeg -i input.wmv -ar 44100 -b:a 320k output.mp3

# Reduce audio volume
sox input.wav output.wav gain -n -24
# change sample frequency
sox input.wav -r 44.1k output.wav
# Convert audio (m4a to ogg)
ffmpeg -i Gimme_Gimme.m4a -map 0:0 -c:a libvorbis Gimme_Gimme.m4a.ogg
# flac to MP3 320 kbps
ffmpeg -i input.flac -b:a 320k output.mp3
# Rip CD audio
abcde -o vorbis

# Grabar CD audio
# 1: convertir a formato red book (stereo, 44.1KHz, 16 bits)
for f in $(ls *.mp3); do ffmpeg -i "$f" -map 0:0 "$f.wav" ; done
# 2: renombrar segun orden deseado
# 3: tostar (cdrtools)
wodim  -v -pad dev=/dev/sr0 -dao -swab *.wav

VIDEO

# convertir video a formato compatible con Windows Media Player (ideal para incrustar videos en Powerpoint)
# @see https://trac.ffmpeg.org/wiki/Encode/WindowsMediaPlayer
ffmpeg -r 30 -i foo.flv -codec:v mpeg4 -flags:v +qscale -global_quality:v 0 -codec:a libmp3lame foo.avi

# split video (ffmpeg)
ffmpeg  -i input.avi -ss hh:mm:ss -to hh:mm:ss -c copy output.avi

# multiplex audio & video
ffmpeg -i audio.m4a -strict -2 -i video.mp4 -strict -2 -c:a copy -c:v copy final.mp4

# resize video (ffmpeg)
ffmpeg -i IN.MP4 -c:v libx264 -c:a copy -s 800x600 OUT.mp4

# convert mjpeg video (ffmpeg)
# we may need to specify audio frequency because input video uses a strange frequency which is not automatically adapted
ffmpeg -i MVI_6229.AVI -c:v h264  -c:a mp3 -ar 44100  MVI_6229.AVI.mp4

# rip dvd (simple title-oriented movie; you may try -t 0 to rip all titles)
# -a -> select audio track, -E -> audio encoding (copy, vorbis, mp3, flac24...)
HandBrakeCLI -i /dev/cdrom -t 1 -o ~/output.m4v -e x264 -E "copy:*"

# a more specific approach: rip VOB by VOB (-strict -2 is required since AAC codec is considered experimental...)
ffmpeg -i /mnt/cdrom/VIDEO_TS/VTS_12_1.VOB -strict -2 vob_12_1.m4v

Images and PDF

# Resize image (Imagemagick's convert)
# use mogrify to resize "overwriting" the input image
convert input.jpg -resize 25%  image_scaled.jpg

# Rotate image
jpegtran -rotate 90 -outfile output.jpg input.jpg

# It's good to sharpen to compensate from the scale softness
# -unsharp RadiusxSigma+Amount+Threshold
convert input.jpg -resize "600x" -unsharp 2x0.5+0.7+0 -quality 98 output.jpg

# Raster
# http://www.imagemagick.org/Usage/transform/
convert autotrace:heart.gif  heart_traced.gif

# Clean whiteboard
convert img.gif -morphology Convolve DoG:15,100,0 -negate -normalize -blur 0x1 -channel RBG -level 60%,91%,0.1 $2

# Visual image directory
display 'vid:*.jpg'

# OCR image 09.jpg into 09.txt asuming portuguese language
tesseract 09.jpg 09 -l por

# Spell check (aspell)
# Usar -a para pipes (en vez de ficheros)
aspell -t -d pt_BR -c etimologia.tex

# Capture screen
scrot

# Image to pdf
convert *.png output.pdf



# Unir varios PDF en uno - por defecto comprime, a costa de la calidad (queda granulado -> -dPDFSETTINGS=/screen por defecto)
# Para mejor calidad, usar -dPDFSETTINGS=/prepress
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=proyecto.pdf -dBATCH proyecto-p*.pdf

# Dividir un PDF en varios (uno por página)
gs -q -o proyecto-p%02d.pdf -sDEVICE=pdfwrite proyecto.pdf 

# Extraer un subconjunto de paginas del PDF
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=2 -dLastPage=6 -sOutputFile=proyecto.pdf original.pdf

# Reduce PDF size (gs): use maximum 150 dpi for images
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dAutoRotatePages=/None -dColorImageDownsampleType=/Bicubic -dColorImageResolution=150 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=150 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=150 -sOutputFile=t.pdf input.pdf

# Convert PDF to JPG
# 200 DPI
gs -q -o output_p%04d.jpg -sDEVICE=jpeg -dPDFFitPage -r200 input.pdf

# Thumbnail of first page
gs -q -o output.jpg -sDEVICE=jpeg -dPDFFitPage -dLastPage=1 -g200x300 input.pdf

# Convert JPGs to single PDF
convert page1.jpg page1.pdf

Imprimir – Artículo relacionado: Comandos configuración CUPS

# Opciones más habituales de Cups: -n copies / -P page-list / -o sides=[one-sided|two-sided-long-edge|two-sided-short-edge]
# -o number-up=2
# <a href="https://www.cups.org/documentation.php/options.html">Listado completo de opciones Cups</a>
lp -d printer -o fit-to-page -o landscape XX.pdf
lp -d printer -o fit-to-page -o sides=two-sided-long-edge XX.pdf

# Añadir impresora
# PPDs from http://www.openprinting.org/printers
lpadmin -p name -E -v lpd://printer.localdomain/`hostname` -P xerox8560.ppd || exit 1
lpadmin -d $DEFAULT
lpoptions -p name -o Duplex=DuplexNoTumble -o PageSize=A4

# Lista colas
lpstat -a

# Imposicion (organizar paginas para folleto A5)
# pstops -> psutils
# Es importante especificar el tamaño de papel en ps2pdf, para que no se lie con la salida apaisada de pstops
pdftops input.pdf - | pstops -pa4 '4:-3L@.7(21cm,0)+0L@.7(21cm,14.85cm),1L@.7(21cm,0)+-2L@.7(21cm,14.85cm)' | ps2pdf -sPAPERSIZE=a4 - output.pdf
# Si las páginas de entrada ya están en A5, no hace falta escalarlas:
pdftops input.pdf - | pstops -pa4 '4:-3L(21cm,0)+0L(21cm,14.85cm),1L(21cm,0)+-2L(21cm,14.85cm)' | ps2pdf -sPAPERSIZE=a4 - output.pdf
# Unir dos páginas a5 en una página A4
pdftops INPUT - | psnup -pa4 -Pa5  -2 | ps2pdf -sPAPERSIZE=a4 - OUTPUT
# Más ejemplos de pstops: https://twiki.cern.ch/twiki/bin/view/Main/AVFedotovHowToPstops
# Crontab Fields
#minute hour day_of_month month day_of_week user  command
#/first 5 fields can be replaced by a special string, like/ @daily (run every midnigh), or @reboot (run once after reboot)
#List: 1,3,5,7,9. Range: 1-9/2 (2 is the step, optional)

# sudoers y sudoers.d/* tiene que tener permisos 440
# El orden importa, la ultima regla tiene precedencia sobre las anteriores
# Syntax: user/group doing sudo, host=(target user) [NOPASSWD:] comma list of commands (absolute path)
nagios  ALL=(ALL) NOPASSWD: /usr/cmd1,/usr/cmd2

# text conversion: UTF16 -> ascii
iconv -f utf16 fichero

# Calculators
bc
qcalc

# strace
# Opciones interesantes:
# -fp: conectarse a un proceso. Los descriptores de fichero se pueden consultar con lsof
# -c: contar número llamadas. Util para ver donde gasta el tiempo un proceso
# -T: cronometrar cada llamada al sistema

tcpdump

# Listar solicitudes DHCP
tcpdump  -s 1500 '((port 67 or port 68) and (udp[8:1] = 0x1))'
# Mostrar paquetes ARP
tcpdump -vvv arp
# Mostrar solicitudes a DNS de Google
tcpdump -n "dst host 8.8.8.8 and dst port 53"

Cómo comprimir en paralelo en Debian

Paralelismo en el compresor

De momento, la opción -T de xz no está activa, con lo cual hay que recurrir a las versiones paralelas de los clásicos: pigz o pbzip2.

Una vez instalado, basta con especificar el compresor en los parámetros de tar (normalmente, estos comandos paralelos detectan los cores disponibles, con lo cual no hace falta especificar nada):

tar cf test.tar.bz2 -I pbzip2 test

Paralelismo en los trabajos

Para comprimir muchos ficheros, una solución obvia es comprimir varios a la vez. Esto sólo requiere alguna herramienta que reparta los ficheros entre los compresores. Gnu parallel viene como anillo al dedo:

# 2 ejemplos del manual
# comprimir todos los ficheros "*.html"
parallel gzip ::: *.html
# convertir todos los "*.wav" en mp3 con LAME
parallel lame {} -o {.}.mp3 ::: *.wav

# comprimir con xz todos los ficheros del listado "files",
# usando un máximo de 4 cores:
parallel -P 4 xz < files

WordPress en Docker

# PASOS PRELIMINARES (opcionales, según las circunstancias 😉 )
# Arrancar Docker
docker -d -s="devicemapper"
# Descargar imagen MySQL 
docker pull mysql:5.7
# Descargar imagen WordPress
docker pull wordpress

# ARRANCAR CONTENEDORES (necesario cada vez que no estén arrancados 😉 )
# Arrancar contenedor MySQL 
docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=clave -e MYSQL_DATABASE=wordpress -d mysql:5.7
# Arrancar contenedor WordPress
# Los ficheros de WordPress se instalarán en la ruta que pasemos con -v
# (en este ejemplo, /home/yo/Dropbox/Webs/wordpress/)
docker run -e WORDPRESS_DB_PASSWORD=clave -d --name wordpress --link wordpressdb:mysql -p 127.0.0.2:8080:80 -v "/home/yo/Dropbox/Webs/wordpress/":/var/www/html  wordpress

Con esto ya tenemos disponible un WordPress para desarrollo local en 127.0.0.2:8080

Recuperar ficheros borrados de un sistema de ficheros ext3 ext4

Lo primero, detener todas las posibles escrituras.

Reiniciar con un Live CD, por ejemplo el estupendo Kali Linux (que además incluye extundelete).

Hacer una imagen de la partición (o volumen) de la que se quieren recuperar los datos. La imagen se puede guardar en otra partición, en un disco externo, en otro ordenador…

Después, se puede pasar a intentar recuperar los ficheros a partir de la imagen, con herramientas como extundelete:

extundelete --recover-all imagen.img

extundelete ofrece opciones para concretar el qué intentar recuperar (y así ahorrar algo de tiempo)

Obviamente, lo suyo es recuperar de una copia de seguridad (backup), pero no siempre es posible…