Manejo eficiente de marcadores

Hace algún tiempo les había presentado a buku, un gestor de línea de comandos de marcadores. Usar Firefox y buku rompe un poco el flujo de trabajo al tener que ir a una línea de comandos. Entonces aquí es cuando bukubrow, un complemento escrito por Sam A. Horvath-Hunt viene al rescate. Se trata de una extensión para Firefox que funciona como interfaz gráfica de buku:

buku

Con esta extensión podemos buscar, agregar, editar, borrar marcadores, abrirlos en ventanas y/o pestañas. Todos eso se puede hacer o bien accediendo al botón en la barra de herramientas como haciendo clic derecho sobre la página deseada. Es importante tener en cuenta que es necesario bajar e instalar la bukubrow-host que sirve para conectar buku con la extensión. Esta aplicación usa un archivo json para conectarse con la extensión de Firefox:

{"name":"com.samhh.bukubrow","description":"Bukubrow host for the Firefox extension","path":"/usr/local/bin/bukubrow-linux-x64","type":"stdio","allowed_extensions":["bukubrow@samhh.com"]}

De esta manera podemos manipular la base de buku directamente desde Firefox :wink:

Más información: Native messaging - Mozilla | MDN

17 Comandos para manejar el audio en Linux

Introducción

En la actualidad el sonido en Linux es manejado por dos servicios ALSA y PulseAudio. El primero de ellos es el que tiene una relación más cercana con el hardware, mientras que el segundo es el que se comunica con las aplicaciones y es con quien el usuario tiene más interacción. En cuanto al hardware, es importante recordar que la mayoría de las placas de audio contienen un dispositivo llamado codec, el cual se encarga de convertir las señales digitales en analógicas y viceversa.

1. Listar las placas de audio

 lspci
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (rev 02)
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 620 (rev 02)
00:04.0 Signal processing controller: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem (rev 02)
00:14.0 USB controller: Intel Corporation Sunrise Point-LP USB 3.0 xHCI Controller (rev 21)
00:14.2 Signal processing controller: Intel Corporation Sunrise Point-LP Thermal subsystem (rev 21)
00:15.0 Signal processing controller: Intel Corporation Sunrise Point-LP Serial IO I2C Controller #0 (rev 21)
00:15.1 Signal processing controller: Intel Corporation Sunrise Point-LP Serial IO I2C Controller #1 (rev 21)
00:16.0 Communication controller: Intel Corporation Sunrise Point-LP CSME HECI #1 (rev 21)
00:17.0 SATA controller: Intel Corporation Sunrise Point-LP SATA Controller [AHCI mode] (rev 21)
00:1c.0 PCI bridge: Intel Corporation Sunrise Point-LP PCI Express Root Port #1 (rev f1)
00:1c.5 PCI bridge: Intel Corporation Sunrise Point-LP PCI Express Root Port #6 (rev f1)
00:1f.0 ISA bridge: Intel Corporation Sunrise Point-LP LPC Controller (rev 21)
00:1f.2 Memory controller: Intel Corporation Sunrise Point-LP PMC (rev 21)
00:1f.3 Audio device: Intel Corporation Sunrise Point-LP HD Audio (rev 21)
00:1f.4 SMBus: Intel Corporation Sunrise Point-LP SMBus (rev 21)
01:00.0 3D controller: NVIDIA Corporation GM107M [GeForce GTX 950M] (rev a2)
02:00.0 Network controller: Intel Corporation Wireless 8260 (rev 3a)

Aquí vemos que la placa de audio es Intel Corporation Sunrise Point-LP HD Audio (rev 21).

Luego, podremos obtener más información de la misma:

 lspci -nn -d 8086:9d71 -mm -k -v
Slot:   00:1f.3
Class:  Audio device [0403]
Vendor: Intel Corporation [8086]
Device: Sunrise Point-LP HD Audio [9d71]
SVendor:        ASUSTeK Computer Inc. [1043]
SDevice:        Device [1790]
Rev:    21
Driver: snd_hda_intel
Module: snd_hda_intel
Module: snd_soc_skl

El driver snd_hda_intel indica que la placa usa la especificación Intel High Definition Audio. Tener en cuenta que se pueden ver los dispositivos de sonido usb con lsusb y usb-devices.

2. Listar el codec de audio

 aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC295 Analog [ALC295 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Headset [Logitech USB Headset], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

Aquí se ve que el codec de la placa es ALC295 Analog.

3. Listar dispositivos de salida

 pactl list sinks short
0       alsa_output.pci-0000_00_1f.3.analog-stereo      module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED
1       combined        module-combine-sink.c   s16le 2ch 44100Hz       SUSPENDED
3       PulseEffects_apps       module-null-sink.c      s16le 2ch 44100Hz       RUNNING
4       PulseEffects_mic        module-null-sink.c      s16le 2ch 44100Hz       SUSPENDED
5       alsa_output.usb-Logitech_Logitech_USB_Headset-00.analog-stereo  module-alsa-card.c      s16le 2ch 44100Hz   RUNNING

Algunos dispositivos son virtuales y corresponden a aplicaciones tales como PulseEffects_mic y PulseEffects_mic. El dispositivo combined es para enviar la salida a más de una dispositivo.

4. Listar los flujos de reproducición

 pactl list sink-inputs short
199     5       88      protocol-native.c       float32le 2ch 44100Hz
3106    3       11      protocol-native.c       float32le 2ch 44100Hz
3124    3       11      protocol-native.c       float32le 2ch 44100Hz

Veremos a continuación como podemos sacar más información de estos flujos.

5. Ver los programas que están usando el sistema de sonido

 pactl list clients short
0       module-systemd-login.c  (null)
6       module-x11-xsmp.c       (null)
8       protocol-native.c       plasmashell
11      protocol-native.c       firefox
17      protocol-native.c       rocketchat-desktop
20      protocol-native.c       thunderbird
21      protocol-native.c       firefox
22      protocol-native.c       VNote
26      protocol-native.c       plasmashell
81      protocol-native.c       org_kde_powerdevil
87      protocol-native.c       pulseeffects
88      protocol-native.c       pulseeffects
89      protocol-native.c       pulseeffects
102     protocol-native.c       plasmashell
109     protocol-native.c       skypeforlinux
110     protocol-native.c       skypeforlinux
138     protocol-native.c       pactl

6. Ajustar el volumen

De acuerdo al listado anterior, puedo ajustar firefox:

pactl set-sink-input-volume 199 50%

O modificar el de puseefects

pactl set-sink-input-volume 3124 40%

O sino, cambiando el volumen de todo el dispositivo:

pactl set-sink-volume 5 50%

7. Cambiar el dispositivo de salida

Aquí estaríamos moviendo el flujo de reproducción de los auriculares al de la placa de sonido interna:

pactl move-sink-input 3124 alsa_output.pci-0000_00_1f.3.analog-stereo

8. Agregar un dispositivo manualmente

El dispositivo de alsa lo podemos sacar por el comando aplay, y luego:

pacmd load-module module-alsa-sink device=hw:1,0

9. Listar las extensiones del sistema de audio

Esta lista muestra el número del módulo, el nombre y los argumentos:

 pactl list  modules short
0       module-device-restore
1       module-stream-restore
2       module-card-restore
3       module-augment-properties
4       module-switch-on-port-available
5       module-udev-detect
7       module-alsa-card        device_id="0" name="pci-0000_00_1f.3" card_name="alsa_card.pci-0000_00_1f.3" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1"
8       module-bluetooth-policy
9       module-bluetooth-discover
10      module-bluez5-discover
11      module-esound-protocol-unix
12      module-native-protocol-unix
13      module-gconf
14      module-native-protocol-tcp      auth-anonymous=1
15      module-esound-protocol-tcp      auth-anonymous=1
16      module-combine
17      module-combine-sink
18      module-switch-on-connect
19      module-default-device-restore
20      module-rescue-streams
21      module-always-sink
22      module-intended-roles
23      module-suspend-on-idle
24      module-systemd-login
25      module-position-event-sounds
26      module-role-cork
27      module-filter-heuristics
28      module-filter-apply
30      module-cli-protocol-unix
33      module-null-sink        sink_name=PulseEffects_apps sink_properties=device.description="PulseEffects(apps)"device.class="sound" channels=2 rate=44100
35      module-null-sink        sink_name=PulseEffects_mic sink_properties=device.description="PulseEffects(mic)"device.class="sound" channels=2 rate=44100
37      module-alsa-card        device_id="1" name="usb-Logitech_Logitech_USB_Headset-00" card_name="alsa_card.usb-Logitech_Logitech_USB_Headset-00" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1"

Las extensiones le ofrecen funcionalidades adicionales a a pulseaudio.

10. Listar dispositivos de entrada

 pactl list sources short
0       alsa_output.pci-0000_00_1f.3.analog-stereo.monitor      module-alsa-card.c      s16le 2ch 48000Hz  SUSPENDED
1       alsa_input.pci-0000_00_1f.3.analog-stereo       module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED
2       combined.monitor        module-combine-sink.c   s16le 2ch 44100Hz       SUSPENDED
5       PulseEffects_apps.monitor       module-null-sink.c      s16le 2ch 44100Hz       RUNNING
6       PulseEffects_mic.monitor        module-null-sink.c      s16le 2ch 44100Hz       SUSPENDED
7       alsa_output.usb-Logitech_Logitech_USB_Headset-00.analog-stereo.monitor  module-alsa-card.c      s16le 2ch 44100Hz   IDLE
8       alsa_input.usb-Logitech_Logitech_USB_Headset-00.analog-mono     module-alsa-card.c      s16le 1ch 44100Hz   SUSPENDED

11. Listar flujos de entrada

 pactl list source-outputs short
2       5       89      protocol-native.c       float32le 2ch 44100Hz

12. Examinar la configuración

Este comando es útil si tenemos algún problema y preguntamos en un foro. Proporcionar nuestra configuración nos va a permitir obtener más fácilmente una respuesta.

pacmd dump
### Configuration dump generated at Sun Aug 11 10:55:57 2019

load-module module-device-restore
load-module module-stream-restore restore_device=false
load-module module-card-restore
load-module module-augment-properties
load-module module-switch-on-port-available
load-module module-udev-detect
load-module module-alsa-card device_id="0" name="pci-0000_00_1f.3" card_name="alsa_card.pci-0000_00_1f.3" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1"
load-module module-bluetooth-policy
load-module module-bluetooth-discover
load-module module-bluez5-discover
load-module module-esound-protocol-unix
load-module module-native-protocol-unix
load-module module-gconf
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-combine 
load-module module-combine-sink 
load-module module-switch-on-connect 
load-module module-default-device-restore
load-module module-rescue-streams
load-module module-always-sink
load-module module-intended-roles
load-module module-suspend-on-idle
load-module module-systemd-login
load-module module-position-event-sounds
load-module module-role-cork
load-module module-filter-heuristics
load-module module-filter-apply
load-module module-cli-protocol-unix

set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 0xb018
set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo no
suspend-sink alsa_output.pci-0000_00_1f.3.analog-stereo no
set-sink-volume combined 0x10000
set-sink-mute combined no
suspend-sink combined yes

set-source-volume alsa_output.pci-0000_00_1f.3.analog-stereo.monitor 0x10000
set-source-mute alsa_output.pci-0000_00_1f.3.analog-stereo.monitor no
suspend-source alsa_output.pci-0000_00_1f.3.analog-stereo.monitor no
set-source-volume alsa_input.pci-0000_00_1f.3.analog-stereo 0x3039
set-source-mute alsa_input.pci-0000_00_1f.3.analog-stereo no
suspend-source alsa_input.pci-0000_00_1f.3.analog-stereo yes
set-source-volume combined.monitor 0x10000
set-source-mute combined.monitor no
suspend-source combined.monitor yes

set-card-profile alsa_card.pci-0000_00_1f.3 output:analog-stereo+input:analog-stereo

set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
set-default-source alsa_input.pci-0000_00_1f.3.analog-stereo

### EOF

13. pamixer

Este programa se puede descargar desde su sitio en GitHub.. Se instala compila e instala sencillamente con los pasos make y make install.

Tiene varios comandos útiles, sirve para activar o desactivar el estado mudo de un dispostivo:

./pamixer -t

14. pulsemixer

Esta herramienta se puede instalar como dice en su sitio de GitHub

Luego al ejecutarlo el comando pulsemixer:

pulsemixer

Las teclas de función permite fácilmente alternar entre los dispositivos de salida, entrada, y las placas de audio.

15. Reiniciar pulseaudio como usuario

systemctl restart --user pulseaudio

16. Configurar un dispositivo de salida predeterminado

pactl set-default-sink alsa_card.usb-Logitech_Logitech_USB_Headset-00

17. Configurar un dispositivo de entrada predetermianda

pactl set-default-source alsa_input.usb-Logitech_Logitech_USB_Headset-00.analog-mono

Conclusión

Desde luego que existen herramientas gráficas para realizar casi todas estas operaciones. No obstante, al usarlas desde la línea de comandos nos permite entender un poco más como funciona el sistema de sonido en Linux, que ciertamente no carece de cierta complejidad. Digno es de mencionar que muchas de las configuraciones se pueden guardar y hacer permanentes en el el archivo ~/.config/pulse/default.pa.

Fuente y más información

Tabla comparativa Microsoft Windows, OS X y Linux

Esta es una tabla comparativa resumida de los 3 sistemas operativos principales en la actualidad. Si bien Wikipedia cuenta con una muy buena, decidí hacer una resumida con los datos que a mí entender son los más buscados e interesantes.

Windows OS X Linux
Licencia Propietaria Propietaria Libre
Tipo de desarrollo Código fuente cerrado Código fuente cerrado (con componentes libres) Código fuente abierto
Kernel Híbrido Híbrido Monolítico
Año de creación 1985 2001 1991
GUI (Interfaz gráfica de usuario) Windows Shell Aqua Hay múltiples para elegir
Idiomas soportados 138 381 Más de 500
Principales Sistemas de archivos NTFS,FAT32, exFAT HFS, HFS Plus, Apple FIle System ext4, xfs, zfs
Versiones para teléfonos celulares Windows CE iOS Android, Tizen, Ubuntu Touch, SailfishOS, Plasma Mobile, etc.
Arquitecturas soportadas ARM, IA-32, ARM64, Itanium, x86-64, DEC Alpha, MIPS, PowerPC x86_64 Alpha, ARC, ARM, C6x, H8/300, Hexagon, Itanium, m68k, Microblaze, MIPS, NDS32, Nios II, OpenRISC, PA-RISC, PowerPC, RISC-V, s390, SuperH, SPARC, Unicore32, x86, Xtensa

Fuente y más información: - macOS - Wikipedia


  1. Es una estimación aproximada de acuerdo a Debian -- Archivos PO en Debian, para cada idioma. Tener en cuenta que Linux es heterogéneo: depende del software referido y también de la distribución. 

10 extensiones recomendadas para Firefox

Estas son 10 extensiones que recomiendo para usar en Firefox:

Complementos de Firefox

1 Copy as Markdown

Esta extensión permite copiar un link como markdown, es realmente útil para luego pegarlo en cualquier editor que soporte ese lenguaje.

2 DuckDuckGo Privacy Essentials

Esta extensión proporciona el grado de privacidad que posee un sitio de acuerdo a : - Si es una conexión cifrada - Cantidad de rastreadores - Prácticas de privacidad

3 Markdown Here

Esta extensión permite escribir en cajas de texto formateado en lenguaje markdown y luego con un clic hacer que lo convierta en html interpretado

4 Max Tabs (Web Extension)

Muchas veces corremos la tentación de tener infinidad de pestañas abiertas, esto además de consumir recursos, resulta caótico y nos saca de foco. Esta extensión pone un límite a la cantidad de solapas abiertas.

5 Plasma Integration

Logra que Firefox y el entorno de escritorio Plasma trabajen mejor en conjunto permitiendo: - Manejar los controles multimedia - Enviar archivos al teléfono celular usando KDE Connect - Mostrar archivos descargados

6 Save-to-Read

Aunque parecería algo trivial hace algo muy útil con unos clics guarda las páginas que deseamos leer en otro momento en carpeta especial de los Marcadores.

7 PrivacyBadger

Esta extensión es un proyecto de la Electronic Frontier Foundation se complementa de manera genial con la de DuckDuckGo ya bloquea de manera automática cookies y/o dominios con la posibilidad de personalizar la configuración en el caso de que algún sitio no funcione correctamente con algún bloqueo aplicado.

8 TrackMeNot

Este complemento es una idea ingeniosa de Daniel C. Howe (artista y crítico de tecnología) y Helen Nissebaum (Profesora de ciencia de la información en Cornell Tech) para evitar la vigilancia electrónica. En lugar de ocultar o cifrar nuestra actividad en Internet, hace uso del ruido y de la obfuscación: realiza búsquedas aleatorias en segundo plano en los principales motores de búsqueda.

9 uBlock Origin

Esta extensión cuyo autor es Raymond Hill, es una de las más populares tal vez y sirve para bloquear publicidad y molestas ventanas emergentes.

10 Vivaldifox

El nombre de esta extensión se debe a una característica del aspecto visual del navegador Vivaldi. Aplica colores en la barra de Firefox de acuerdo al contenido del sitio, más allá de ser un toque estilístico es de ayuda también para identificar a las pestañas abiertas.

VivaldiFox

Obtener datos provechosos del uso de memoria

Memoria Virtual y ps_mem

Hay herramientas que sirven para cuanta memoria consume un determinado proceso, pero ps_mem en cambio puede calcularla por programa.

Está escrito por Pádraig Brady es encargado de mantenimiento de las GNU coreutils, e involucrados en otros importantes proyectos de software libre.

Todos los programas

La memoria compartida es problemático para calcular, y la herramienta automáticamente selecciona el método más exacto para el kernel en ejecución.

Además de la memoria que es específica para un programa, esta herramienta puede calcular de la manera más exacta la memoria compartida para comunicarse con otros procesos.

Importante: Necesita privilegios de root para dar resultados más exactos.

Por Procesos

También puede mostrar los valores diferenciados de acuerdo a sus argumentos:

Diferenciados según argumentos

La herramienta funciona examinando el directorio proc analizando por cada proceso la línea del comando completa, el estado, las asignaciones de memoria y la cantidad de páginas de memoria utilizadas.

En definitiva, ps_mem un complemento excelente para ps, free y top

Presentaciones con Backslide

Funcionalidades

  • Generador de plantillas para obtener distintos diseños visuales.
  • Servidor de previsualización.
  • Exportación de HTML autocontenido.
  • Conversión automatizada a formato PDF.
  • Soporte de presentaciones múltiples.

Bases

Este software se basa en Remark.js y Markdown. Utiliza DeckTape para exportar la presentación a un archivo PDF. Para generar estilos usa Sass, el cual es un lenguaje compatible con CSS que permite usar variables y funciones, anidar y mezclar reglas, etc. Para el servidor de previsualización usa node.

Instalación

La instalacíón se hace sencillamente con el gestor de paquetes de javascript npm:

npm install backslide

En mi caso prefiero instalarlo como usuario común y no como root, no obstante hay que tener en cuenta luego de que esté en la variable PATH. Por ejemplo:

ln -s $HOME/node_modules/backslide/bin/bs $HOME/.local/bin/bsa

Creación de dispositivas

Para comenzar a crear nuestra presentación es necesario ejecutar el siguiente comando:

bs init

Este comando generará un árbol de archivos como el siguiente:

.
├── presentation.md
└── template
    ├── index.html
    ├── remark.min.js
    └── style.scss

1 directory, 4 files
  • El contenido lo generaremos editando el archivo presentation.md

Por ejemplo:

title: Linux Operador C1   
class: animation-fade
layout: true

<!-- This slide will serve as the base layout for all your slides -->
.bottom-bar[
        {{title}}
]

---
background-image: url(assets/imgs/a-1644824-unsplash.jpg)
class: impact

# {{title}}
## Permisos, tuberías y redireccionamiento

![](assets/imgs/clase1-LiOp.jpg)

---

## Otra Slide

- item 1
- item 2
- item 3

---

## Otra Slide

- item 1
- item 2
- item 3

--

- item 4
- item 5
- item 6

El directorio template contiene:

  • styles.scssLa hoja de estilos en Sass
  • remark.min.jsLa copia offline de Remark.js
  • El archivo html que invoca los dos archivos de arriba

Edición y reproducción

Entonces, el principal archivo que debemos modificar y adaptar es presentation.md. Algunas cosas para tener en cuenta:

  • La primera diapositiva suele tener el atributo layout: si su valor es truela misma se usará como plantilla para el resto de las diapositivas.
  • Cuando se quiere aplicar una clase se usa el siguiente formato:
.NombreDeClase[
    contenido
]

Por ejemplo, el siguiente código:

.col-6[
- item 4
- item 5
- item 6]

Será convertido al siguiente HTML:

<div class="col-6"><ul>
<li>item 4</li>
<li>item 5</li>
<li>item 6</li>
</ul>
  • Si se desea aplicar la clase a toda la diapositiva se debe anteponer el atributo class:
---

class: alt-bg

## Ejemplo

- item 4
- item 5
- item 6
  • De hecho, se puede aplicar una imagen de fondo a la diapositiva:
---   

background-image: url(superfoto.jpg)              

## Ejemplo

- item 4
- item 5
- item 6
  • Para hacer aparecer el contenido de manera progresiva se usa el separador --:
## Ejemplo
- item 1
--

- item 2
--

- item 3

Es decir la idea es crear contenido en presentation.md y los detalles del formato los podemos definir en styles.scss:

Usando Backslide

Mientras editamos obviamente queremos ver como va saliendo nuestra presentación, en cuyo caso ejecutamos:

bs serve -p 4444

El puerto es opcional, pero es útil si necesitamos trabajar con más de una presentación a la vez, usando obviamente diferentes puertos para cada una.

Exportación

Para exportar se usa:

bs e

Tener en cuenta que cualquier archivo con extensión .md será procesado por bs

En el directorio distestá el html con la preentación completa.

y para convertir a pdf:

bs p

El archivo resultante estará en el directorio pdf.

Conclusión

Me resultó un poco más cómodo trabajar con Backslide que con MarkDeck ya que no es necesario contar con docker para crear y/o probar las presentaciones. La plantilla que viene predeterminada está bastante bien y puede ser modificada a gusto, además los controles para ver las notas del orador y navegar por la presentación son muy útiles.

MarkDeck o hay vida más allá del pagüerpoin

El modelo de software de oficina de los '90 relegan la importancia del contenido frente a la sobreabundancia de herramientas.

Por ejemplo, supongamos que queremos o necesitamos a hacer una presentación. La interfaz del programa podría abrumarnos o distraernos. Aplicaciones como Impress de LibreOffice es de gran ayuda como alternativa a PowerPoint, pero podemos pensar en maneras alternativas de hacer una presentación. Podemos centrarnos en escribir el texto, seleccionar imágenes, gráficos, etc. sin resignar un buen "look and feel".

Asi es como en la actualidad tenemos distintos proyectos de software libre que tienen este enfoque. Uno de ellos se llama MarkDeck creado por Arne Hilmann. Este software convierte markdown a html5 con un aspecto atractivo, sin necesidad de subirla a internet en ningún momento. Solamente usando markdown usando nuestro editor de textos preferido (neovim en mi caso :wink: )

Bases

Como es habitual en el desarrollo de software libre MarkDeck está subido a los hombros de otros proyectos preexistentes, los cuales son:

  • Markdown: Un LML para crear HTML.
  • Pandoc: Es una librería escrita en Haskell que sirve para convertir entre distintos formatos de procesadores y lenguajes de marcado de texto.
  • reveal.js: Se trata de un framework para crear presentaciones en HTML.
  • PlantUML: Una herramienta basada en java para crear diagramas
  • Ditaamini: Librería de la extensión de diagramas para asciidoctor
  • ASCIIToSVG: Programa para convertir arte ascii en diagramas en formato svg
  • Graphviz: Es un programa para hacer diagramas a partir de archivos de textos escritos (principalmente) en el lenguaje DOT.
  • asciinema: Un grupo de herramientas para grabar y reproducir sesiones de terminal
  • DeckTape: Exportador de archivos PDF a partir de páginas web
  • vega-lite: Genera gráficos interactivos a partir de archivos json
  • mathjax-pandoc-filter: Filtro de pandoc para convertir fórmulas matemáticas de LaTeX en en SVG embebido
  • font-awesone: Es un grupo de íconos y CSS para la web

Instalación

Un requisito para usar MarkDeck es tener instalado docker y docker-compose ya que utiliza una serie de containers para lanzar los servicios que nos permiten tanto editar la presentación como reproducirla. Otro detalle a tener en cuenta es que al usar docker necesitamos privilegios mayores a los de un usuario común, para ello es conveniente agregar nuestra cuenta a la del grupo docker. Para que quede así por ejemplo:

grep docker /etc/group
docker:x:1001:sergio

Luego podemos crear un directorio en el cual estarán los archivos de nuestra presentación y los de MarkDeck y entrmos en el mismo:

$ mkdir new-ppts1 && cd new-ppts1

A continuación descargamos el archivo scaffold con nuestra herramienta preferida:

$ http -d https://raw.githubusercontent.com/arnehilmann/markdeck/master/scaffold

El archivo scaffold.txt es un script de bash que define y ejecuta los containers de Docker usando docker-compose. Arrancamos el servicio de docker si no está activo: $ sudo systemctl start docker

Y luego ejecutamos el script:

./scaffold.txt

markdeck-start

Podemos comprobar además los containers que están corriendo: Containers de MarkDeck

Archivos de MarkDeck

Archivos de MarkDeck

  • El script start para arrancar los containers
  • El script stop para detener los containers
  • El script update-mardeckque vuelve a descargar y ejecutar el archivo scaffold
  • El directorio deck que guarda los archivos de la presentación renderizada
  • El directorio assetses donde ponemos los archivos que queremos que sean permanentes, tales como imágenes, hojas de estilo en cascada, sesiones de terminal, etc.
  • En el directorio deck podremos encontrar un archivo pdf generado a partir de la presentación.

Editando y reproduciendo la presentación

  • Hay que editar el archivo slides.md
  • La presentación se ve en http://localhost:8080

Reproducción de MarkDeck

  • Tiene una serie de recursos útiles en http://localhost:8081
  • Un archivo de presentación comienza con una sección de configuración del tipo y luego cada slide comienza con un encabezado de primer nivek en markdown:
---
title: Introducción a Linux - Clase 1
variant: impress
pdf: intro_linux-clase1.pdf
slideNumber: true
controls: true
controlsTutorial: true
asciinema: true
standalone: slides.html
---

# Slide 1

- item 1
- item 2
- item 3

# Slide 2

- item 4
- item 5
- item 6

Una configuración importante es standalone: slides.html la cual sirve para generar un archivo web con todos los objetos de la página embebidos (podremos encontrar el archivo en deck/slides.html) y poder transportarla a otra computadora.

Hay varias maneras de enriquecer la presentación con:

  • Fondos de diapositivas (colores, gradientes, imágenes)
  • Íconos de font-awesome
  • emojis
  • resaltado de código
  • Diagramas con asciiart
  • Equaciones matemáticas
  • Sesiones de terminal
  • Nube de palabras (en realidad es una herramienta externa)

Conclusión

Nos guste o no hoy casi toda la informática gira en torno a un navegador web. La ofimática se ha movido de aplicaciones faraónicas a la web. Por eso tiene sentido trabajar en su lugar con pequeñas aplicaciones que hagan bien una determinada tarea, al mejor estilo UNIX. Teniendo nuestra aplicación en HTML neutraliza el problema de los formatos cerrados de software monopólico.

Diapositiva de MarkDeck

Enlaces

GNU y Linux

Retomo esta controversia sobre el nombre del sistema operativo. ¿Cómo deberíamos llamarlo GNU/Linux o Linux? Como obedeciendo un mandato religioso, muchos siguen escribiendo GNU/Linux. ¿Tendrá importancia? Bueno, tal vez no tanta como le podría asignar Richard Stallman, pero creo que sí porque tiene que ver justamente con la libertad de la que tanto declama el presidente y fundador de la Free Software Foundation.

La posición de Stallman y sus seguidores dice que debería llamarse GNU/Linux1, la otra sostiene que Linux es la denominación correcta. Los primeros sostienen que GNU/Linux hace justicia el hecho de que Richard Stallman tenía como propósito crear un completo sistema operativo llamado GNU. Y dado que Linus Torvalds solamente aportó el núcleo del sistema operativo a un conjunto de herramientas pre-existentes el nombre debe ser compuesto. Desde la visión opuesta2 dicen que es tan grande la cantidad de componentes en una distribución de Linux que siguiendo ese razonamiento tendríamos nombres bastante complejos como Plasma/KDE/Xorg/GNU/Linux.

Además, desde ambas partes nos recuerdan que hay sistemas con núcleo Linux que no poseen las herramientas GNU, por ejemplo, Android.

La posición GNUista tiende a minimizar la importancia de Linux: "es sólo un kernel". Cabe recordar que el núcleo Hurd recién comenzó a estar apenas usable 10 años después de la creación de Linux y 18 años más tarde del surgimiento del proyecto GNU3. De hecho, en la actualidad no tiene la madurez que se espera para un sistema operativo productivo4.

CentOS5 saca provecho del código fuente de Red Hat para crear una distribución de Linux. Hago hincapié en este ejemplo en particular, ya que no hay pretensión de originalidad en el proyecto. De hecho me animaría a decir que es un caso extraordinario de aprovechamiento de la la licencia GNU GPL. Dicen, frente a la pregunta si le hacen alguna modificación a las mismas

No. El mandato esencial de CentOS para nuestros repositorios base y de actualizaciones es NO extender o mejorar los paquetes o funcionalidades más allá de las que suministra los RPM's fuente del upstream (es decir Red Hat). CentOS se esfuerza intencionalmente en proporcionar funcionalidad binaria a nuestros usuarios. CentOS ofrece otros repositorios (opcionales) 6

A nadie se le ocurriría llamarlo Red Hat/CentOS.

  • Ubuntu está basada en Debian y nadie hablar de Debian/Ubuntu.
  • OS X deriva de Darwin y este a su vez de FreeBSD. A nadie se le ocurriría llamarlo de FreeBSD/Darwin/OS X.

En realidad, muchas distribuciones ni siquiera usan el nombre de Linux. ¿Alguien se ha quejado por eso? En cambio si es frecuente leer cosas como GNU/NetBSD por citar apenas un caso. Es injustificable esa diferencia. Creo que Stallman confunde el reconocimiento hacia el proyecto GNU con el derecho que cada uno tiene para iniciar un camino paralelo.

¿No es acaso Linux ejemplo de la famosas libertades del software reclamadas por el movimiento del software libre?: la libertad 1 de :

"...estudiar cómo funciona el programa, y cambiarlo para que haga lo que usted quiera (libertad 1). El acceso al código fuente es una condición necesaria para ello. 7

Y la libertad 3 de :

La libertad de distribuir copias de tus versiones modificadas a otros. 7

Más aún, creo que Stalmann está en todo su derecho a llamarle GNU/Linux. Pero presionar a otros para que se adapten sus deseos de uno, no tiene nada que ver con la libertad.


Información adicional:


  1. ¿Por qué GNU/Linux? - Proyecto GNU - Free Software Foundation 

  2. 4 Opinions supporting "Linux" 

  3. Linux y GNU - Proyecto GNU - Free Software Foundation 

  4. status Podríamos seguir profundizando cada uno de los argumentos, pero creo que el eje de la discusión es totalmente errado. Los stallmanistas insisten en cuestión de reconocimiento, algo que no tiene nada que ver en este asunto. No es una cuestión de reconocimiento. ¿Desde cuando los nombres son acumulativos? Cuando Linus Torvalds creó su kernel lo hizo empezando un nuevo proyecto. En ningún momento lo hizo como parte del proyecto GNU de Stallman. ¿Está mal? No lo se. Pero estaba y está en todo su derecho de escoger el nombre que le sea de agrado. De hecho, sabemos bien que el nombre no fue elegido por él. i La licencia GNU GPL hasta donde se, en ningún momento prohíbe crear un proyecto derivado con otro nombre. De hecho hay casos en el mundo del software que lo ilustran perfectamente, los cuales citaré a continuación: 

  5. What is CentOS Linux? 

  6. La traducción y el texto entre paréntesis es mío. Does CentOS change the upstream Source RPMs? 

  7. ¿Qué es el software libre? - Proyecto GNU - Free Software Foundation 

Expansión indirecta

Es conocida la funcionalidad de expansión de parámetros en bash, por ejemplo, si hacemos:

$ echo $XDG y luego presionamos la tecla TAB, la shell mostrará las variables que comienzan con XDG:

$XDG_CONFIG_DIRS      $XDG_SEAT             $XDG_SESSION_PATH
$XDG_CURRENT_DESKTOP  $XDG_SEAT_PATH        $XDG_SESSION_TYPE
$XDG_DATA_DIRS        $XDG_SESSION_CLASS    $XDG_VTNR
$XDG_MENU_PREFIX      $XDG_SESSION_DESKTOP  
$XDG_RUNTIME_DIR      $XDG_SESSION_ID

¿Pero tenemos una manera rápida para muestre todos los valores de esas variables? La respuesta es afirmativa:

$ for i in  ${!XDG*}; do echo "$i es ${!i}"; done
XDG_CONFIG_DIRS es /etc/xdg:/usr/share/kde-settings/kde-profile/default/xdg
XDG_CURRENT_DESKTOP es KDE
XDG_DATA_DIRS es /home/sergio/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_MENU_PREFIX es kf5-
XDG_RUNTIME_DIR es /run/user/1000
XDG_SEAT es seat0
XDG_SEAT_PATH es /org/freedesktop/DisplayManager/Seat0
XDG_SESSION_CLASS es user
XDG_SESSION_DESKTOP es KDE
XDG_SESSION_ID es 2
XDG_SESSION_PATH es /org/freedesktop/DisplayManager/Session1
XDG_SESSION_TYPE es x11
XDG_VTNR es 1

Bash hace dos cosas distintas en ${!XDG]} busca todas las variables que comienzan con XDG, mientras que ${!i} hace una expansión indirecta, de alguna manera es como una variable que apunta a otra. Interesante, no ;) ?

Elige Tu Propio Prompt

El prompt

El prompt es la cadena de texto que le indica al usuario que puede ingresar comandos en un shell. En Linux existe la variable PS1 que guarda el valor del mismo. PS1 significa "Prompt String 1".

Por ejemplo, en Fedora tiene el valor [\u@\h \W]\$ y se expande a:

test@localhost:~$

Esta variable reemplaza automáticamente determinados caracteres escapados con una contrabarra. Algunos de ellos son:

Caracter escapado Reemplazado por
\d Fecha en formato dom abr 21
\h El nombre del host sin el dominio
\H El nombre del host completo
\t hora en formato 24 hs
\T hora en formato 12 horas
\@ hora en formato 12 horas am/pm
\u El usuario actual
\w el directorio actual
\W la ruta relativa del directorio actual

También se pueden usar secuencias de escape ANSI para colorear, por ejemplo

Prompt con colores ANSI

Esto se explica así:

  • La secuencia \[\033indica el comienzo de una secuencia ANSI
  • [1;32m\]es color verde
  • \[\033[0m\]cierra la secuencia de colores (de otra manera todo lo que tipeemos a continuación quedará también en verde

Podemos seguir personalizando el prompt a nuestro gusto y necesidad.1

También podemos echar mano a algunos de los proyectos que nos facilitan esta tarea, tal como veremos a continuación.

sexy-bash-prompt

Sino queremos hacer todo a mano podemos usar un software como sexy-bash-prompt. Todd Wolfson creó un prompt para bash que también puede usarse para status y ramas en git. Utiliza tput, un programa para configurar terminales usadas por la shell, y también para inicializar o resetear la terminal.

Instalación de sexy-bash-prompt

  • Creamos el directorio Descargas si no existe:

# [ -d ~/Descargas ] || mkdir ~/Descargas

  • Clonamos el repositorio:-

# git clone --depth 1 --config core.autocrlf=false https://github.com/twolfson/sexy-bash-prompt

  • Entramos en el directorio del repo:

# cd sexy-bash-prompt

  • Instalamos:

# make intall

  • Recargamos la configuración de la shell

# . ~/.bashrc

¡Listo!

sexy-bash-prompt

Configuración de sexy-bash-prompt

Se puede adaptar a gusto el aspecto del prompt editando el archivo ~/.bashrc y/o ~/.bash_prompt

Personalizando sexy-bash-prompt

Aquí vemos un ejemplo de configuración personalizada:

powerline

Powerline2 se trata de un software mucho más sofisticado escrito en python por Kim Silkebækken.

Originalmente este proyecto se llamaba vim-powerline el cual proporcionaba una línea de estado para vim, pero posteriormente evolucionó para ser una línea de estado para aplicaciones tales como bash y tmux entre otros.

Instalación de Powerline

En el caso de Fedora viene como paquete y se puede instalar con:

# dnf install powerline

La configuración para bash se puede realizar en el archivo .bashrc de esta manera:

if [ -f `which powerline-daemon` ]; then
  powerline-daemon -q
  POWERLINE_BASH_CONTINUATION=1
  POWERLINE_BASH_SELECT=1
  . /usr/share/powerline/bash/powerline.sh
fi

En el caso de CentOS 7, el software se puede instalar con pip y luego agregar en .bashrc:

if [ -f `which powerline-daemon` ]; then
  powerline-daemon -q
  POWERLINE_BASH_CONTINUATION=1
  POWERLINE_BASH_SELECT=1
  .  /bindings/bash/powerline.sh
fi

Y así queda luego de hacer . .bashrc:

Powerline

Configuración de Powerline

La configuración de powerline en CentOS al instalar con pip está en /usr/local/lib/python3.6/site-packages/powerline/config_files. En Fedora se encuentra en /etc/xdg/powerline. Para modificar alguno de los archivos se pueden crear el directorio ~/.config/powerline y poner las modificaciones allí.

Existen varios archivos de configuración que tienen el mismo nombre, pero ubicados en diferentes directorios, los cuales se combinan, como es habitual los archivos del usuario tienen prioridad sobre los globales.

Poniendo como ejempleo CentOS y la shell BASH, los archivos de configuración serían:

Ruta del archivo o directorio Descripción
/usr/local/lib/python3.6/site-packages/powerline/config_files/config.json Archivo principal de configuración
/usr/local/lib/python3.6/site-packages/powerline/config_files/colorschemes/default.json Configuración predeterminada del esquema de colores
/usr/local/lib/python3.6/site-packages/powerline/config_files/colorschemes/shell/default.json Configuración predeterminada del esquema de colores para la shell

Al editar el archivo local ~/.config/powerline/config.json podemos cambiar el esquema de colores predeterminado:

Esquema de colores

Para cambiar el esquema de colores:

# mkdir -p .config/powerline/colorschemes/shell # cp /usr/local/lib/python3.6/site-packages/powerline/config_files/colorschemes/shell/__main__.json .config/powerline/colorschemes/shell/

La definición de esos grupos se puede ver en /usr/local/lib/python3.6/site-packages/powerline/config_files/colorschemes/default.json

Por ejemplo superuser tiene el valor information:additional, el cuál este a su vez tiene: "fg": "gray9", "bg": "gray4", "attrs": [].

Podemos copiar el archivo correspondiente y personalizarlo:

# cp /usr/local/lib/python3.6/site-packages/powerline/config_files/colorschemes/shell/default.json .config/powerline/colorschemes/shell/

Supongamos que le hacemos la siguiente modificación:

{
        "name": "Default color scheme for shell prompts",
        "groups": {
                "hostname":         { "fg": "brightyellow", "bg": "mediumorange", "attrs": [] },
                "environment":      { "fg": "white", "bg": "darkestgreen", "attrs": [] },
                "mode":             { "fg": "darkestgreen", "bg": "brightgreen", "attrs": ["bold"] },
                "superuser":             { "fg": "brightred", "bg": "white", "attrs": ["bold"] },
                "attached_clients": { "fg": "white", "bg": "darkestgreen", "attrs": [] }
        },
        "mode_translations": {
                "vicmd": {
                        "groups": {
                                "mode": {"fg": "darkestcyan", "bg": "white", "attrs": ["bold"]}
                        }
                }
        }
}

Luego habría que cambiar el archivo principal del tema .config/powerline/colorschemes/shell/__main__.json:

{
        "groups": {
                "continuation":         "cwd",
                "continuation:current": "cwd:current_folder",
                "exit_fail":            "critical:failure",
                "exit_success":         "critical:success",
                "jobnum":               "information:priority",
                "superuser":            "mysuperuser"
        }
}

Hay cambios que no se aplican directamente, para este tipo de casos hacer lo siguiente:

# powerline-daemon --replace

Para cambiar de tema:

cp /usr/local/lib/python3.6/site-packages/powerline/config_files/themes/unicode_terminus_condensed.json .config/powerline/themes/shell/default.json

Y luego recargar el daemon.

PureLine

Otra alternativa escrita por Chris Marsh es Pureline3, que ofrece un prompt al estilo de Powerline pero escrito en bash.

PureLine

Instalación de pureline

  • Clonar el repositorio

# git clone https://github.com/chris-marsh/pureline.git

  • Entrar en el diretorio

cd pureline/

  • Usar alguno de los archivos de configuración existentes:

cp pureline/configs/powerline_full_256col.conf ~/.pureline.conf

  • Agregar la línea siguiente en ~/.bashrc:

source ~/.pureline/pureline .pureline.conf

  • Y recargar la configuración de bash:

souce ~/.bashrc

Configuración de PureLine

Editando el archivo ~/.pureline.conf se puede modificar a gusto el prompt:

Configurando PureLine

Quedaría así:

E incluso se puede cambiar el símbolo principal del prompt:

Full Custom

Nota sobre fuentes

Hay dos maneras básicamente en que un prompt muestre bien los glifos (por ejemplo flechas y otros símbolos especiales): usar la fuente PowerlineSymbols.otf (en Fedora está en el paquete powerline-fonts) como secundaria para una de las fuentes existentes o instalar una fuente parcheada4.

Conclusión

Un prompt puede resultar una herramienta que proporcione información muy útil y también para diferenciar hosts al loguearnos. De estas opciones me parece la mejor PureLine ya que está escrita en bash, la configuración es más natural y sencilla. Powerline usa de acuerdo a ps_mem unos 12 MB de memoria RAM. No obstante, de acuerdo a su propio sitio de desarrollo hay que tener en cuenta que las próximas versiones de PureLine puede cambiar el modo de configuración, por lo tanto sus archivos podrían necesitar necesitar cambios.