Reading view

Yeah, THAT Was The Unrealistic Part

Client: “We would like a drawing of a moose on skis.”

I send the art.

Client: “Why there were two feet on each ski?”

Me: “People ski on two skis and a moose has four feet so I put two on each ski.”

Client: “That is ridiculous!”

Me: “Which part? You’ll have to be more specific?”

Client: “Well, I’m pretty sure they don’t make skis that can accommodate two feet each!”

Me: “Right. That was a pretty big leap on my part, sorry.”

  •  

Deadlines: Emphasis On "Dead"

I’m a year and a half into the development of a new web application for managing complex data sets. Our boss has never been able to provide proper specifications for what he needs, just a flood of vague ideas with no real detail and constantly changing scope.

My job is to try and turn this into a comprehensible list of tasks that the dev team can actually follow. Each month, I have a planning session with the boss where we hash out the next period of work. Each session, I remind him that changing the scope means adding more time.

We agree and sign off the work to be delivered by the end of the month. So far, we’ve hit every deadline.

I thought we had a pretty good system in place until:

Boss: “I can’t believe we’re so far behind and how poorly you’ve managed this project.”

Me: “What do you mean? Haven’t we met all the agreed deadlines throughout the project?”

Boss: “I’ve made a spreadsheet of all the dates I wanted each feature done by. So far, you’ve missed every single one of them.”

Me: “Excuse me? We’ve always delivered what’s been agreed on time. Where have these new dates come from?”

Boss: “This is how long I thought the work should take and I made up my own timeline.”

Me: “I’ve never seen these dates before, let alone agreed to them. At a glance, many of them seem extremely optimistic.”

That’s business talk for “f****** mad”.

Me: “We agreed at the start this would be at least a three-year project.”

Boss: “Well, I decided it should take less time and you’re late. I’m going to have to pull the plug on this project if you can’t have everything wrapped up within the next month.”

I politely remind the boss that there was at least another year and a half of work left to complete the project. I’ll probably be looking for a new job shortly.

  •  

FreshRSS 1.19.1

Detailed tracked changes.

Full changelog:

  • Bug fixing
    • Fix some filters for automatic article actions (e.g., !pubdate:P3d) #4092
  • Features
    • New search operator on article IDs (useful to show a single article, extensions) #4058
      • Entry (article) ID: e:1639310674957894 or multiple entry IDs (or): e:1639310674957894,1639310674957893
  • UI
    • Fix left navigation with long category names #4055
    • Show My labels menu also when empty #4065
    • Improve category titles on global view #4059
    • Disable dynamic favicon for browser / extensions blocking canvas #4098
    • Minor UI and style improvements #4061, #4067, #4085
  • SimplePie
    • Manual update to SimplePie 1.5.8 #4113
  • Code improvements

  •  

FreshRSS 1.19.0

A few highlights:

  • Drop support for PHP 5.x (require PHP 7.0+) and initial support for PHP 8.1+
  • Drop support for Microsoft Internet Explorer (IE11)
  • New thumbnail and/or summary options for the normal view #3805
    image
  • New setting to automatically mark as read a new article if there is already one with the same title in the same feed
  • New setting to keep only a maximum number of unread articles in a given feed
  • Mobile view can access the configuration menus

Detailed tracked changes.

Full changelog:

  • Features
    • New thumbnail and/or summary options for the normal view #3805
    • New setting to automatically mark as read a new article if there is already one with the same title in the same feed #3303
    • New setting to keep only a maximum number of unread articles in a given feed #3303
    • New search operator based on custom labels, or not #3709
      • Search articles with label IDs: L:12,13,14 or label names: label:something or labels:"my label,my other label,🧪"
      • Search articles with any label: L:* or no label: !L:*
    • Add support for installable progressive web app (PWA) #3890
  • Bug fixing
    • Fix marking as read a label with SQLite and PostgreSQL #3711
    • Better fallback for feeds without title #3787
    • Fix auto-load articles in anonymous mode and global view #4082
    • Fix several typos found by PHPStan, including one affecting the cache of keep max unread articles #4019
    • Fix warning in Fever API #4056
    • Show no articles alert-box also in global view #4042, #3099
    • Fix theme selection when a theme has been deleted #3874
    • Fix keyboard shortcuts in anonymous mode #3945
    • Fix show password in settings #3966
    • Fix JavaScript warnings for non-validated users #3980
    • Fix drag & drop layout for subscriptions #3949
  • Security
    • Better error handling when a user does not exist (especially for API) #3751, #4084
    • Do not show Add new feed for anonymous users #4040
    • Do not show Mark as read / unread / favourite for anonymous users #3871, #3876
    • Do not show back link on error pages if the user does not have access #3765
    • Only show Back to RSS feeds when logged-in #3790
    • Fix for special characters in keyboard shortcuts #3922
    • Remove old workarounds with white space to prevent password autocompletion #3814
  • Compatibility
    • Require PHP 7.0+ (drop support for PHP 5.x) #3666
    • Drop support for Microsoft Internet Explorer (IE11) #3666
    • Fix some warnings with PHP 8.1+ #4012, #4018
    • Fix back-compatibility with Git 2.21- for automatic updates #3669
    • Fix JavaScript caching and compression for some Apache platforms #4075
  • Deployment
    • Docker: development image :oldest is now based on alpine:3.5 with PHP 7.0.33 and Apache 2.4.35 #3666
    • Docker: default image updated to Debian 11 Bullseye with PHP 7.4.25 and Apache 2.4.51 #3782
    • Docker: alternative image updated to Alpine 3.15 with PHP 8.0.14 and Apache 2.4.52 #3996
    • Docker: fix inclusion of .htaccess for ./p/themes/ folder #4074
    • Docker: only add the crontab when CRON_MIN is set #3927
    • Docker: move logic to disable FreshRSS updates #3973
    • Docker: allow mounting a volume for the cron file #3927
    • Images on Docker Hub are automatically scanned for software vulnerabilities
  • UI
  • Themes
    • Show search box for all themes in mobile view #4025
    • Fix alternative-dark theme to avoid bright elements #3774, #3806
    • Improve the contrast of message boxes for the Origine theme #3725
    • Uniformize the size of inputand select elements for the Origine theme #3727
    • Fix style of banner text for the Origine theme #3731
  • i18n
  • Extensions
    • Add system configuration for extension #3626
  • SimplePie
    • Merge from upstream, help with PHP 8.1+ #4011
    • Fallback to file extensions for enclosures not providing a media type #3861
  • Misc.
    • Implement GitHub Actions for continuous integration / automated testing 3920
    • Use ESLint instead of JSHint #3906
    • Improve .editorconfig and .stylelintrc #3895, #3912
    • Simplify Minz code with PHP 7 ?? operator #4020
    • Upgrade PHPMailer to 6.5.1 #3977
    • Added Raindrop.io as sharing option #3717
    • Delete outdated information regarding Firefox feed reader list #3822
  •  

Nuevos 'e-books' de la ciencia panameña

El 'Compendio científico. I+D y los desafíos de la realidad' presenta los resultados de 82 proyectos de investigación y el 'Directorio Nacional de Investigadores Científicos', los perfiles de 240 investigadores en diversas áreas del conocimiento.

  •  

Futuro de la agricultura digital, en manos de jóvenes y mujeres

Una de las principales lecciones que hasta el momento ha dejado la pandemia es la relevancia de la agricultura. Manuel Otero, director general del Instituto Interamericano de Cooperación para la Agricultura (IICA), lo tiene tan presente, que pide redoblar la apuesta por el sector con un énfasis especial a favor y no a expensas del medio ambiente; para ello las tecnologías digitales constituyen un factor de eficiencia para el uso de los recursos e insumos en este sector.La digitalización de sectores productivos en América Latina es fundamental para mejorar la productividad mediante la inserción de las empresas en las cadenas globales de valor y más apoyo a las pequeñas y medianas empresas.Las Américas exportan una de cada tres toneladas en el mundo, pero el comercio intrarregional sólo alcanza al 14%, mientras que en Europa asciende al 60%. Este es uno de los mayores retos que destaca Manuel Otero, junto con la necesidad de impulsar un proceso de democratización en el sector.

Pasó más de un año de pandemia, ¿cómo se ha visto golpeada la agricultura en la región?

Hubo efectos sobre todo a nivel de los agricultores familiares en la provisión de insumos, en el funcionamiento de los circuitos cortos, en el abastecimiento de los mercados regionales, como no podía ser de otra manera. Pero la agricultura demostró que sus agricultores y los trabajadores rurales en general no saben hacer otra cosa que labrar la tierra y estar permanentemente pensando en producir. La rueda de la agricultura continuó funcionando, y se abastecieron en tiempo y forma los mercados internacionales. Es un sector resiliente, que pese a las adversidades sigue funcionando, sin desconocer que la seguridad alimentaria tuvo un retroceso, pero no es un problema atribuible a la dimensión productiva, sino a las otras dimensiones que hacen a la compleja ecuación de la seguridad alimentaria.

Después de la pandemia, ¿qué escenarios vislumbra?

En plena pandemia fue anunciada la convocatoria por parte de la ONU a la Cumbre sobre Sistemas Alimentarios, que desde el IICA entendemos que deben ser sobre sistemas agroalimentarios, y respaldamos esa visión sistémica desde la producción al consumidor, pero entendemos que es preciso seguir apoyando las transformaciones que están ocurriendo, reconociendo la centralidad de los productores agropecuarios, porque no puede haber producción de alimentos sin producción agropecuaria. También hay que destacar la importancia decisiva de la ciencia y la tecnología para aprovechar la nueva frontera del conocimiento, para tener mejores políticas y sobre todo para ahuyentar cualquier posible creación de barreras no arancelarias. Hay que redoblar la apuesta por la agricultura porque entendemos que la agricultura es parte de la solución, dado que es un sector estratégico.

La tecnología, y especialmente la necesidad de una conectividad digital adecuada fue una de las grandes lecciones que trajo la pandemia, ¿qué desafíos se han identificado desde el IICA al respecto?

Desde el IICA entendemos que estamos frente a herramientas tecnológicas que pueden impulsar un proceso de democratización, sobre todo incluyendo a los jóvenes y a las mujeres, que son dos grupos totalmente rezagados y absolutamente necesarios para impulsar una nueva ruralidad, que tienen que tener un rostro humano y ahí vemos a la agricultura digital como un vehículo fundamental para impulsar las buenas prácticas agropecuarias. Con la agricultura digital tienen que ser replanteadas las estrategias tradicionales de extensión y surge la posibilidad de modelos novedosos de extensión rural basados en el uso de la telefonía celular. Obviamente hay otras herramientas, big data, inteligencia artificial, drones, y hay cuestiones pendientes, como avanzar en la conectividad digital. Otro gran desafío se da en materia de educación, de capacitación, para que los productores agropecuarios puedan hacer un uso adecuado de estas nuevas herramientas que ofrece la agricultura digital. Es necesario una fuerte articulación público privada.

Nos puede profundizar un poco más sobre la brecha digital de género en la región y cómo puede revertirse.

Un reciente estudio realizado por la Universidad de Oxford con apoyo del IICA, el BID y el FIDA mostró que las mujeres rurales son el grupo menos conectado a las Tecnologías de Información y Comunicación (TIC) en la mayor parte de los países de América Latina y del Caribe. Tenemos que contribuir a revertir la desigualdad que enfrentan las mujeres rurales y facilitar acceso a la tecnología a quienes se dedican a la producción agrícola. Para eso necesitamos conformar coaliciones, organismos de financiamiento, de cooperación, sociedad civil, gobiernos y la academia, de modo de avanzar más rápido en la extensión de las oportunidades de empleo y de educación.

El comercio agropecuario en América Latina fue desafiado por la pandemia, ¿se han identificado desafíos? ¿Cómo reimpulsarlo?

Las Américas constituyen una parte del mundo muy exitosa en cuanto a su participación y posicionamiento en el mercado internacional. Las Américas en su conjunto explican una de cada tres toneladas que son exportadas. Sabemos que el comercio internacional es fundamental porque es lo que define las características de la seguridad alimentaria. Pero estamos en deuda es con el comercio intrarregional, en donde solamente un 14% de lo que exportamos vuelve a nuestro hemisferio, en realidad a nuestro continente, en América Latina y el Caribe, y acá yo marco una diferencia siempre con Europa, en donde más del 60% de lo que comercializa es intrabloque. El comercio intrabloque es una asignatura pendiente y el IICA manifiesta su compromiso de avanzar en esta dirección.

Si tuviese que mencionar una prioridad para impulsar el desarrollo rural en las Américas, cuál sería

Debemos avanzar más en internalizar la dimensión ambiental para que sea efectivamente una intensificación productiva sustentable. Tenemos que aumentar los niveles de productividad porque hay que aumentar la oferta de alimentos, pero no puede ser hecha a expensas del medio ambiente, sino que tiene que ser hecha a favor del medio ambiente. Y esto se logra con más tecnología, y por eso es tan importante contar con sistemas nacionales de ciencia y tecnología robustos, con agendas dinámicas para aprovechar todas las oportunidades que ofrece la nueva frontera del conocimiento.

El autor es ejecutivo principal de comunicación en CAF.

Futuro de la agricultura digital, en manos de jóvenes y mujeres
  •  

FreshRSS 1.18.1

Note: Last release before dropping support for PHP 5 and Internet Explorer 11.

Changelog:

  • Features
    • Support standard HTTP 410 Gone by disabling (muting) gone feeds #3561
    • Make advanced feed options such as SSL available to non-admins #3612
  • API
  • UI
    • Allow Unicode for shortcuts #3548
  • Bug fixing
    • Fix database lock during refresh with MariaDB #3559
    • Fix database creation from CLI #3544
    • Fix: pdo_sqlite is optional except for export/import SQLite #3545
    • Fix import of JSON and TT-RSS files, especially with PHP 8 #3553
      • Allow import of more than 999 favourites/labelled articles even with SQLite
    • Fix additional SQL limits, especially for SQLite #3586
    • Fix search param encoding in user query #3541
    • Fix undefined variable & dead code when adding feed #3546
    • Fix missing translation in feed configuration #3554
    • Fix double escaping in feed filters #3563
    • Fix bugs in migration system #3589
    • Fix regression preventing showing startup errors #3590
    • Fix form redirection after erroneous user creation #3656
    • Fix JavaScript error during navigation when no article is selected #3655
    • Fix link to add feeds from the empty homepage #3650
    • Fix git update error message #3645
  • SimplePie
    • Fix regression about media attachments #3565
    • Fix regression about forcing HTTPS for enclosures #3568
    • Catch ValueError for loadHTML with PHP 8 simplepie#673
    • Provide access to latest HTTP status code simplepie#674
    • Fix wrong SimplePie type hint simplepie#678
    • Merge details from upstream PRs #3588, #3614
  • API
    • Compatibility with Web servers providing ORIG_PATH_INFO #3560
  • i18n
  • Code improvements:
    • Friendly constant syntax for Intellisense #3577
    • Fix several comments syntaxes #3615
    • Minor uniform stricter HTML #3616
    • Removed unused variable #3587
    • Provide action name in Minz controller exception #3624
    • New convenience method to extract multiline GET parameters from e.g. <textarea> #3629
  • Deployment
    • Automatically apply latest tag in git for the latest FreshRSS release #3524
  • Misc.
    • Remove legacy data/do-install.txt for triggering install process #3555
    • If using built-in git updates, automatically change to git edge branch if using old master or dev branch names #3589
  •  

FreshRSS 1.18.0

Changelog:

  • Features
    • Allow parallel requests #3096
      • Much faster manual feeds refresh
    • Reload full article content when an article has changed #3506
    • New share article link to clipboard #3330
    • Improved OPML import of feeds with multiple categories #3286
    • Add a content action parameter to work with CSS selector #3453
    • New cURL options per feed: proxy, cookie, user-agent #3367, #3494, #3516
    • Do not import feeds causing database errors (e.g. due to conflicting HTTP redirections) ##3347
  • UI
    • New option to remember open categories #3185
    • Remember the scroll position of the sidebar #3231
    • Feedback messages are now properly attached to a request, in case multiple tabs are open #3208
    • New user query configuration page #3366
    • Allow sorting and drag & drop in the list of user queries #3346, #3355
    • Change layout to add a subscription #3289
    • Change integration configuration page #3372
    • Improve author search when clicking on an author #3315
    • Allow typing a label name instead of selecting it #3213
    • Use same behaviour for labels than the option Show all articles in favourites #3472
    • Change naming from Tag management to Label management #3446
    • Sort options alphabetically in share menu #3331
    • Case-insensitive sort order of feeds in category settings #3466
    • Better compression of the images #3184
    • Fix minor jaggy motion of the sidebar #3266
    • Remove useless reset action in sharing configuration page #3365
    • Add autofocus on subscription page #3334
    • Fix contrast issue by enforcing black text in base theme #3196
    • Adjust brightness & contrast of images and videos in dark themes #3356
    • Improve menu bar of several themes for mobile view #3480, #3491
    • Fix dropdown menu for user queries with BlueLagoon and Screwdriver themes #3485
    • Upgrade to jQuery 3.6.0 for statistics #3501
  • Bug fixing
    • Fix the reloading of full article content with SQLite #3461
    • Fix the caching of an SQL prepared statement affecting the read state of updated articles #3500
    • Better handle expected article conflicts in database #3409
    • Fix SQL syntax error/warning when deleting temporary articles #3357
    • Fix login and refresh bugs in anonymous mode #3305
    • Fix i18n init #3249
    • Fix tag management #3292
    • Fix user queries with labels #3285
    • Fix loading of default actions for shortcuts #3394
    • Fix extensions when using CLI #3443
    • Fix translation CLI #3364
    • Allow searching for + sign #3489
    • Fix cURL version detection in install script #3519
  • Compatibility
    • Support PHP 8+ #3186, #3207, #3459, #3487
      • Note: needed for MySQL 8+ with default authentication settings
      • Change ZIP-handling method #3470
  • API
    • Supported by FocusReader (Android) #3478
    • Implement OPML import/export #3424
    • Add canonical field for fluent-reader, better compatibility InoReader #3391
    • Better compatibility with BazQux API #3320
    • Fix continuation token by ensuring it is a string (for Reeder) #3247
  • CLI
    • Add requirements check in relevant CLI #3410
  • Deployment
    • Possibility to auto-install via e.g. docker-compose #3353
      • New tolerance when the database is not available / up (yet) by trying a few times to connect
    • Docker: use Apache remoteip to log the client remote IP instead of the local proxy IP #3226
    • Docker: new environment variable LISTEN to change the internal Apache port when running in host network mode #3343
    • Docker: Alpine image updated to 3.13 with PHP 8.0.3 and Apache 2.4.46 #3375
      • Note: needed for MySQL 8+ with default authentication settings #3191
    • Docker default image (Debian 10 Buster) updated to PHP 7.3.27
    • New Docker development image based on alpine:edge to test the latest PHP 8+ version #3294
    • New Docker development image based on alpine:3.4 to test oldest supported PHP 5.6.36 version with Apache 2.4.43 #3274
    • Disable built-in update mechanism for new installations using Docker #3496
    • Check that PHP session is working during install #3430
  • Security
    • Auto-renew login cookie #3287
    • Remove referer check, already replaced by CSRF token #3432
    • Increase login cookie duration to 3 months by default #3170
    • Prevent click on login button until JavaScript is fully loaded #3275
    • Add toggle password visibility button on login form UI #3205
    • Better sanitize feed description #3222
    • Allow @-sign in database username (for Azure) #3241
    • Add username hint for permissions during install #3373
  • SimplePie
    • SimplePie prevent cache pollution #3502
    • Update to SimplePie 1.5.6 with PHP8 support #3469, #3206
    • Reduce memory consumption to handle very big feeds #3416
    • Replace ceil() by intval() for edge cases with PHP8 #3404
    • Strip HTML comments in feeds #3288
    • Minor fix of return type for broken feeds #3423
    • Fix images in enclosures without MIME type #3361
  • Extensions
    • New user maintenance hooks #3440
    • New hooks js_vars and nav_menu #3342
    • Add class autoload for extensions #3350
    • Add support for extension user files #3433
    • Add user configuration in extensions #3397
    • Add a method to retrieve a configuration value #3422
    • Search files for both core and third-party extensions #3413
    • Updated base extension class #3333, #3335
    • Refactor extension file script #3399
  • i18n
  • Code improvements
    • Improve FreshRSS system initialisation #3070
    • Improve session code during install #3276
    • Enforce phpcs (PHP_CodeSniffer) line length + whitespace #3488
      • Improve settings and applies to *.phtml, *.css, *.js as well
    • Fix superfluous Minz check during install #3302
    • Extract some classes to their own files #3301, #3298, #3297
    • Explicit git declaration of .png files as binary #3211
    • Remove Minz validation #3439
    • Explicit PDO::ERRMODE_SILENT #3048
    • Add constant for minimal PHP version #3369
    • Refactor requirements check during install #3368
  • Misc.
    • Check access rights to temp folder during install #3312
    • Ensure maximum integer for a date to avoid some database issues #3259
    • Upgrade PHPMailer to 6.3.0 #3457
    • Make our Travis greener by testing only our oldest and newest supported PHP versions #3492
  •  

La práctica (palo palito)

La cara de Violeta era un poema. Los ojos dos ruedas de autobús, la boca un parking. La expresión un «no me jodas». Las ganas, de salir corriendo.

Los pétalos de papel aún revoloteaban por la habitación. Apagué el ventilador y le di la mano a la nueva. La pobre me miraba de medio lado y me sujetaba la mano con blandura. Era como darle la mano a un guante vacío, como sujetar un filete de merluza.

-Mi nombre es Wardog. Ella es Daisy y él es MKII.
-En… encantada. ¿Siempre hacéis esto para recibir a la gente?
-No, este año quería probar algo nuevo. ¿Te ha sorprendido?
-Te puedo asegurar que no me lo esperaba para nada- dijo riendo nerviosa.
-Al final te acostumbras- dijo MKII resoplando.
-Soso eres, hijomido.
-¿Y bien? ¿Eres de hierro o de humo?- le pregunto.
-¿Perdona?
-Te traduzco- intervino MKII:- Que si eres de sistemas o de gestión.
-Oh, ya, de sistemas, de sistemas…
-Bien, bien, aquí somos todos un mix. Una especie de humo pesado, supongo. Excepto Daisy. Daisy es de hierro. Totalmente.
-Ya veo, parece que se le da bien, sí.
-Y aprendió rápido. Ella estudió microinformática y desmonta y monta los servidores sin mirar. Las impresoras parece que se licuan en sus manos. Lo cables ethernet se crimpan solos en los paneles con su aliento. Es un prodigio.
-Vaya… parece que voy a aprender mucho con ella.
-Me temo que eso no va a poder ser.
-¿Por qué no?
-Daisy no te puede enseñar.
-¿Por qué no?
-Por la misma razón por la que un oso no te enseñará a coger salmones con la boca: no sabe enseñarte. No está en su naturaleza. Puedes observar y aprender de ella, pero no le pidas que te explique algo que para ella es tan natural como respirar.

Violeta se quedó mirando a Daisy con fascinación. Seguía con los cascos puestos, sacando los discos duros del servidor conectándolos uno a uno a un PC para leer los datos de S.M.A.R.T. Cuando veía uno con valores que no le gustaban lo tiraba sin contemplaciones a una caja de plástico.

-Bueno, Violeta, tu primera misión de hoy será- le digo mientas la acompaño hasta el armario donde guardamos los componentes y lo abro de par en par- montar tu ordenador.

Violeta se queda mirando el armario abierto, las placas base, los procesadores, las memorias, discos duros, fuentes de alimentación, tarjetas de red y cables, todo ordenado con el primor obseso y enfermizo de Daisy.

Se quedó absolutamente inmóvil, mirando al armario. Daisy tiró otro disco duro, tal vez un poco más fuerte que el anterior. Me retiro para que Violeta pueda pasar. No se mueve. Vamos a ver, que eres novata, te estoy enseñando un armario hasta el culo de material goloso. Mira, pero si tenemos hasta Ryzen nuevecitos. ¿No los ves? ¡Y discos NVME!

El tiempo se detiene.

Algo va mal.

Violeta se acerca tímidamente al armario y se detiene a un paso de la puerta. Acerca la cara y mira en todas direcciones. Al fin se gira hacia mi.

-No veo ningún ordenador, Wardog.

El BOFH-Zen se puede presentar de muchas maneras
-¿Cómo que no?
-Aquí no hay nada, sólo hay piezas sueltas.
-Claro, es la idea, que tú te montes tu CPU. Por practicar, y eso.
-Ah.. ¿Pero vosotros no compráis los ordenadores hechos?- pregunta incrédula.
-Según para qué. También los montamos nosotros, porque a veces…

Daisy arroja a la caja de discos muertos una ráfaga de tres discos, como si fuese un cañón de corbeta. Va al armario y sin mirar coge una placa, un Intel i3 de sexta generación, 4GB de RAM, un disco mecánico, una fuente de alimentación, un puñado de cables y una bolsita con autocierre con los tornillos justos. Va poniendo todo el material en las manos de Violeta que asiste atónita a lo que está pasando y no parece creerse siquiera que sus brazos estén sosteniendo hardware.

Daisy desaparece un momento tras unas estanterías y sale de nuevo con un chasis vacío en la mano. Lo pone en una mesa despejada, tira dentro un juego de destornilladores y se vuelve a sus servidores con un bufido. Estamos jodiéndole el BOFH shui.

-Pero… pero… ¿qué?- Violeta no acierta a adivinar lo que está pasando. Yo tampoco quiero explicárselo. Es conmovedor, es como un puto documental de National Geographic. Daisy, viendo que Violeta está más perdida que $Hyperboss en una competición de Fornite ha dejado a un lado su aislamiento social y ha ido a rescatarla. Le ha resuelto la papeleta sin que nadie se lo diga y le ha facilitado la tarea pero aún ha dejado que sea Violeta quien termine. Además, ha demostrado que aunque no le gusta nadie ande manoseando su ordenado stock, tiene confianza en que saldrá adelante. Pero ojo, tampoco demasiada, que le ha dado un i3 y 4GB de RAM. Tampoco las tiene todas consigo.
-Ve, hija mía- le digo y le señalo la mesa que Daisy ha preparado. Nuestra Daisy sigue destripando servidores concentrada en su música, como si no hubiese demostrado que tiene su corazoncito. Las dejo y me vuelvo a mi mesa.

Me pongo a redactar un email a mi mujer mientras miro de hito en hito lo que hace Violeta, no sea que se anime y le de por coger un alicate de corte. Pero creo que Violeta no es de esas.

Los minutos van pasando y aquello no avanza.Violeta no hace más que darle vueltas a la carcasa y no sabe ni por dónde empezar. Que vamos a ver, que con que sepas resolver un puzzle de 6 piezas ya medio lo tienes. Que ya no hay que configurar la frecuencia del procesador mediante jumpers en la placa base, como hacíamos en los 90. No te puedes equivocar. Es muy sencillo todo.

Me aburro. Me voy a tomar un café. Al pasar por la mesa, Violeta levanta la cabeza.

-No sé qué tengo que hacer.
-Un ordenador que funcione- le digo.
-Ya, pero no sé.
-¿Tienes móvil?
-Sí, claro.
-Pues pregúntale al Oráculo.
-¿A quién?

Sigo en dirección a la puerta. Sopesando qué hacer con esta criatura.

-¡Wardog! ¡Espera!
-Dime- le contesto desde el quicio de la puerta.
-¿Cuál es el número de Oráculo?

Me la quedo mirando. ¿De dónde has salido, criatura? ¿Qué te han hecho?

-Google. Que busques información en Google.

No espero más respuesta y me voy a por el café. Me entretengo con un par de poyaques por el camino y al final entre el café, un error de un programa, una visita a la máquina de chucherías a por un par de chocolatinas, hacer la preceptiva deposición pagada por la empresa en el cuarto de baño y dos tonterías, he echado casi 45 minutos.

Vuelvo al despacho con la esperanza de que Violeta ya tenga el ordenador montado y esté instalándose una Debian como un castillo pero en cambio sólo están MKII y Daisy trabajando como dos personas de bien. Me acerco a la mesa donde dejé a Violeta por si está escondida debajo o algo. Ni rastro.

-¿Y la nueva?- pregunto a Daisy.
-Salió- me contesta Daisy con un encogimiento de hombros.

¡Bimbambidubi, dubi! ¡Bimbambidubi, dubi! La jodimos.

-Sistemas, solucionamos problemas, perdemos personal.
-Wardog, ¿qué le habéis hecho a la pobre chica?
-¿A qué pobre chica?
-¡A la becaria!
-De momento darle la bienvenida y una tarea.
-Dice que la habéis dejado sola.
-¡Como que sola! ¡Pero si estaba con MKII y con Daisy!- Ahora caigo. Claro. La he dejado con un ficus y una terminatrix.
-Pues aquí la tengo llorando como una Magdalena, la pobre.
-Vaya por $deity. Mándamela de nuevo, que ya estoy en el despacho, por fin ha llegado el calor humano a este frío, frío páramo.
-Va para allá, y haz el favor de no asustarla.
-No te prometo nada, está en mi naturaleza.

Un minuto después aparece la pobre muchacha por el pasillo arrastrando los pies y gimoteando. La viva imagen de la desdicha y la desolación. La espero al lado de su mesa con los brazos en jarras.

-Pero criatura, ¿qué te ha pasado?- le pregunto. Me pone la cabeza en el hombro y rompe a llorar inconsolablemente, la pobre.
-¡Esguemehasdilloguememontaseyoelordenadorberoyoesonolo
hehechonungayahoramesientoinútilllomeguieroiramigasayono
valgobaraestoaaAaAaAAAAAAAAAAH!

Madre del amor hermoso. La dejo llorar hasta que se desinfla y me quito la camisa llena de lágrimas, mocos y babas, quedándome con mi camiseta de Goku. Verás ahora para ponerme serio.

-Violeta…
-Gué…
-¿Ya? Es que verás, yo pensé que te habían enseñado algo de micro, por lo menos a montar un PC. Ya sabes, la placa base, el procesador, buses, conectores… cacho. Ya sabes.
-BEROESGUESINOMELOSPLIGASYONOSÉyyyy…yyyy…!yyyy!

La paro justo cuando se va a arrancar de nuevo y tal como hago con mis hijos ignoro el llanto y me pongo a echarla una mano para que coja confianza.

-Para, para, que al final se van a pensar que es la alarma de incendios y la liamos.

Moquea un par de veces y se acerca un poco a la mesa con los brazos abrazándose a sí misma. Madre mía la criatura. Es pura sensibilidad, la pobre. Y se mete a sistemas. Y se llama Violeta. Y yo que pensaba crear un ejército de Mechas pilotados por Iron Violet y Steel Daisy. En fin. Paciencia.

-Mira, esto es bastante sencillo.
-Si es gue soy tonta…
-Yo no he dicho eso, Violeta. Que sea sencillo no implica que debas saberlo. ¿Entiendes?
-Vale.
-Mira, esto es la placa base. Aquí es donde se colocan los distintos componentes, que son estos. Verás que cada uno tiene su forma y sólo encajan de una manera, por eso digo que es sencillo. ¿Lo ves?
-Sí…
-Montarlo es bastante fácil, mira. En el chasis colocas las espigas sobre las que luego atornillarás la placa base y mientras, vas instalando los componentes aquí al lado y así trabajas más a gusto. Aunque para esto hay dos escuelas, una que dice que se monta fuera y luego se mete en la caja y otra que dice que todo a la caja desde el principio. Tú a tu bola. ¿Lo has entendido?
-Greo gue sí…
-¿Lo intentas mientras yo termino una cosa?
-Sí, sí, lo intento…

Me alejo muy despacio, para que no se asuste, mi pequeña florecilla asustadiza. Me voy de puntillas caminando de espaldas hacia mi mesa. Al pasar por la mesa de MKII me hace un disimulado gesto agitando la mano: «madre mía qué intensidad».

Me pongo a lo mío, que a veces también trabajo y tengo un servidor de bases de datos que necesita que le hagan una particioncita porque se está poniendo de un gordaco que pa qué.

Al cabo de una hora me acuerdo de que Violeta estaba montando el ordenador. Tan callada se ha quedado que sentí miedo de que se hubiese marchado de nuevo. Salgo de mi mesa y voy estirando la espalda hacia su mesa.

-Psst- le chisto a Daisy y le indico a Violeta con la barbilla. Daisy se encoge de hombros y sigue con el desguace.

Violeta está derrumbada sobre la mesa, con la cabeza sobre los brazos y durmiendo como una bendita. No me lo puedo creer. Esto lo he visto yo mil veces. El niño se pilla un disgusto, se cansa de llorar y con los ojos pegaditos en cuanto se tranquiliza, ¡PAM! dormido. Pero esta criatura ya tiene pelillos, joder

Me acerco a Daisy.

-Daisy, ¿Este servidor está bueno?
-No, placa muerta.
-¿Me lo prestas?
-Me da igual.

Cojo el servidor. Es un 4U. Daisy le ha sacado todo lo recuperable y queda tan sólo el hierro y la placa. Pesará 18 o 20 kg. Me lo llevo junto a la mesa de Violeta y lo levanto por encima de la cabeza. A continuación lo lanzo plano contra el suelo con todas mis fuerzas.

¿Alguna vez has dejado caer un servidor desde dos metros de altura? Es una maravilla. Suena como estampar un luser contra una puerta de chapa. Es delicioso. Como tren que sale de Córdoba a las 5 de la tarde con un luser atado a la máquina con un cubo de peltre a modo de casco que choca con el expreso que viene de Madrid con otro luser atado a la máquina justo cuando ambos trenes alcanzan la máxima velocidad. Calcula los decibelios y el dinero desperdiciado en cubos.

MKII grita como una colegiala y la corbata se le acelera.

Violeta grita también a la vez que salta en la silla, con la mala suerte de que las rodillas chocan contra la mesa, así que cae a la silla, pero como tiene ruedas, se va rodando hacia atrás hasta que choca con la pared. Daisy por su parte cae de culo y tan rápido se quiere levantar que sin querer casi astilla la mesa de un cabezazo.

Daisy tuerce un pelín la comisura derecha de los labios. El equivalente en su especie a descojonarse.

-Ay… ¿Qué ha pasado?
-Que se me ha caído esto- le digo señalando al suelo. He roto dos baldosas. Ha valido la pena.
-¿Me he… dormido?- dice avergonzada.
-Pues es posible, porque el ordenador sigue sin estar montado.
-Ay, es que a mi esto de los tornillos no me va mucho, ¿sabes?

Uy. Uy. Terrible sospecha.

-Discúlpame un momento, por favor- le digo mientras salgo por patas. Voy a ver a Havenocon. Entro en su despacho. Tiene sonrisa de zorra. No de puta, si no de zorra astuta.
-¡Una hora! Estás perdiendo facultades, Wardog.
-La madre que te parió. ¿De quién?
-Es la hija del abogado que ha llevado siempre los asuntos de $Hyperboss. Son muy amigos.
-¿Y puedo…?
-Como hermanos.
-Tal vez…
-Uña y carne.
-Se ha dormido.
-Pues tiene que terminar las prácticas.
-Pues le ponemos un sofá cómodo que en la silla de despacho se va a joder la espalda.
-No, no, no, búscale qué hacer, que no sienta que la aprueban por aprobarla. Es complicado. Su padre quiere que aprenda el valor del trabajo pero ella es una niña mimada.
-Pero por qué me odiáis tanto.
-We love you.
-Te has quedado sin Facebook- le digo mientras me levanto de la silla. Qué hija de puta, lo bien que se lo pasa.
-¡Eh! ¡No jodas, que tengo que investigar candidatos!
-Te jodes.

Me vuelvo al despacho y Violeta está intentando colocar el procesador en la placa.

-¡Eh, genial, Violeta! ¿Cómo vas?
-No soy capaz de encajar esto- me dice sujetando el procesador con un dedazo en todos los contactos sin ningún pudor.
-Verás, los procesadores se insertan en un zócalo ZIF y sólo hay que ponerlo en la posición correcta, no hace falta apretar y…

Miro dentro de la caja. Miro el socket del procesador. Aquello es una desgracia. Creo que ha doblado los 1150 pines. Destrucción completa. Me acerco un poco más y veo que hay pines rodando por la placa base.

La miro. Me mira. Le brillan los ojos. Se le aguan.

-¡mmmmMMmmmMMMBUAAAAAAAAAH! ¡MEVASAECHARBORGUESOYUNAINÚDIIIIIIIIIIIIIIIL! ¡BUAAAAAAAAH!
-No, mujer, es que no hemos encontrado tu lugar en este mundo.
-Daisy, ¿te importaría montarle tú el ordenador?

Daisy mete la mano debajo de la mesa y saca una CPU montada, limpia y brillante. Huele a lubricante y a perfección.

-Toma. Tiene Windows- dice, escupiendo la palabra Windows. Daisy es capaz de decir tantas cosas con tan pocas palabras.. $deity, son tan distintas… como la noche y el día. Como el bien y el mal. Como el BOFH y el luser.

Espera, creo que tengo una idea.

-Oye, Violeta, ¿tú sabes usar Excel?

  •  

FreshRSS 1.17.0

Changelog:

  • Features
    • New tag management page #3121
    • New page to add feeds and categories #3027
    • Add a way to disable/enable users #3056
  • Security
    • Add user auto-registration when using HTTP Basic authentication login method #3003
    • Fix special characters in user queries #3037
    • Hide feed credentials when adding a new feed #3099
    • Trim whitespace for feed passwords #3158
    • Updated PHPMailer library to 6.1.6 #3024
    • Add blogger.com to the default list of forced HTTPS #3088
  • UI
    • Show feed name and date inside the article (especially good on mobile) #3081
    • Add shortcut to control media elements (video, audio) #3036
    • New option to disable shortcuts #3114
    • Case-insensitive sort order of feeds in categories #3131
    • Use machine-readable <time datetime=""> for entry dates #3106
    • Add tooltips on entry icons #3115
    • Limit dropdown menus max-height #3102
    • Fix inline code tag contrast in Ansum and Mapco themes #3048, #3050
    • Fix login form in BlueLagoon and Screwdriver themes #3028
  • API
    • Supported by Fluent Reader (Windows, Linux, MacOS) #3140
    • Fix API quickadd #3051
    • Fix warning when adding a feed #3075
    • Work-around for common API address errors #3061
  • Compatibility
    • Add fall-backs for compatibility with OPMLs from The Old Reader #3071
    • Relaxed to allow underscore _ in feed addresses #3133
  • Deployment
    • Docker default image rebased on Debian 10 Buster, with Apache 2.4.38 and PHP 7.3.19 #3159
    • Docker: Alpine image updated to 3.12 with Apache/2.4.46 and PHP 7.3.21 #3025
    • Update example of Dockerfile #3108
  • CLI
    • Re-introduce --api_password option (vanished in 1.16.0) #3179
    • Modify shebang to be more portable #3038
  • Bug fixing
    • SimplePie: Fix compliance with HTTP 301 Moved Permanently #3180
  • i18n
    • Add language negotiation when the user is not logged in #3022
    • New United States English #3060
    • Improved British English #3068
    • Improved Dutch #3063
    • Improved Slovak #3020
    • Add a language reference when adding a new one #3044
    • Change how updating a key works #3072
    • Add missing translations #3034
  • Misc.
    • Return proper MIME type for favicons #3032
    • Add a migration system #2760
    • Makefile support for FreshRSS extensions #3042
    • Update rules to use Make syntax #3062
    • Refactor the export feature #3045
  •  

FreshRSS 1.16.1

Changelog:

  • Features
    • Add the possibility to filter by feed IDs #2892
      • like f:123 more-search or multiple feed IDs like f:123,234,345 more-search or an exclusion like !f:456,789 more-search
    • Show users last activity date #2936
    • Ability to follow HTML redirections when retrieving full article content #2985
  • API
    • New table of compatible clients #2942
    • Expose podcasts in API (used by e.g. FeedMe) #2898
    • Workaround for clients not sending a clean login request #2961
    • Relaxed detection of GReader short/long ID form (for Reeder) #2957
    • Fix warning with FeedReader #2947
    • Fix GReader string type for Usec fields #2935
    • Fix Fever integers type #2946
  • CLI
    • JSON output option for ./cli/user-info.php --json #2968
    • Add language and e-mail in ./cli/user-info.php #2958
    • Fix filenames for exported files #2932
  • UI
    • Access to feed configuration in mobile view #2938
    • Use standard loading="lazy" for favicons #2962
    • New option to control which categories to unfold #2888
    • Turn off autocapitalization in login fields #2907
    • Minor layout improvement of help labels #2911
    • Minor layout improvement of checkbox labels #2937
    • Fix styling of search input fields in Safari #2887
    • Fix styling of .stick elements in older Webkit browsers #2995
    • Use common CSS template for Alternative-Dark theme #3000
    • Upgrade to jQuery 3.5.1 for statistics #2982
  • Compatibility
    • Relax OPML parsing to allow importing not strictly-valid ones #2983
  • Deployment
    • Docker: Alpine image updated to PHP 7.3.17
    • Add reference documentation for using Apache as a reverse proxy #2919
    • Enforce Unix line endings when checking out via git #2879
  • Bug fixing
    • Fix regression when marking all articles as read, risking to mark newer articles as read #2909
    • Fix memory leak when using lib_phpQuery for full-content retrieval #3004
    • Fix preview of CSS selector to retrieve full article content #2993
    • Fix PostgreSQL install when user has limited connection rights #3013
    • Fix Docker make cron use FRESHRSS_ENV environment variable #2963
    • Fix e-mail validation bug for admins #2917
    • Fix some cases when WebSub-enabled feeds change address #2922
    • Fix ensuring that wrong login attempts generate HTTP 403 (e.g. for fail2ban) #2903
    • Fix archiving options layout in Edge #2906
    • Fix form in statistics for article repartition #2896
    • Fix double-HTML-encoding of category names in statistics #2897
    • Fix password reveal button during install #2999
    • Fix Makefile rules when PHP is not installed #3010
  • i18n
    • Improve Simplified Chinese #2891
    • Improve Dutch #3005
    • Reformat i18n files #2976
    • Add a Makefile rule to produce PO4A i18n files #3006
  • Misc.
    • Reduce memory consumption during feed refresh #2972, #2955
      • and improved logs containing memory consumption #2964
    • Reduce the risk of DB lock errors #2899
    • Update PHPMailer library to 6.1.5 #2980
    • Initial rules for Markdown linting #2880
    • Add a Makefile rule for linting #2996
    • Add a Makefile rule to refresh feeds #3014
  •  

FreshRSS 1.16.0

Changelog:

  • Features
    • Allow multiple users to have administration rights #2096
    • Preview the CSS rule to retrieve full article content #2778
    • Improve CSS selector ordering in the full-text retrieval (lib_phpQuery) #2874
      • Allow combining selectors with a comma such as #article .title, #article .content
    • New search option !date: allowing to exclude any date interval #2869
      • For instance !date:P1W (exlude articles newer than 1 week), !pubdate:2019, -date:2020-01-01/P5d, etc.
    • New option to show all articles in the favourites view #2434
    • Allow feed to be actualized just after being truncated #2862
    • Fallback to showing a GUID when an article title is empty #2813
  • API
    • Supported by Readrops (Android, open source) #2798
    • Improve consistency of the default category #2840
    • Return proper newestItemTimestampUsec #2853
    • Return HTTP/1.x 200 OK for an empty request, to ease discovery #2855
    • Add ability to customise dates shown in API #2773
    • Minor clearing of unused parameters #2816
  • Compatibility
    • Support PHP 7.4
  • Bug fixing
    • Fix regression causing a login bug in some situations related to e-mail login #2686
    • Fix regression in feed refresh when there are users whose e-mail is not verified #2694
    • Fix PostgreSQL install when using a username different than database name #2732
    • Fix error with advanced searches using SQLite #2777
    • Fix feed action filter when filtering on author: #2806
    • Fix warning in WebSub #2743
    • Fix environment variables COPY_LOG_TO_SYSLOG and FRESHRSS_ENV controlling logging #2745
    • Fix UI flickering when hovering over articles when authors are displayed #2701
    • Fix array error with PHP 7.4 #2780
    • Fix wrong foreach in applyFilterActions #2809
    • Fix encoding bug in lib_phpQuery when fetching the full content of HTML documents with a complex <head ...> #2864
    • Fix minor bug in “articles to display” configuration UI #2767
    • Fix sharing with Wallabag #2817
    • Fix UI background bug when hovering over a long title that overlaps the date #2755
  • UI
    • Better UI / client network performance (time to first byte) thanks to a data streaming pipeline with yield #2588
      • Improved buffering strategy accordingly, with a loading animation while waiting for the first articles to arrive (e.g. complex / slow search) #2845
      • To benefit from it, requires that the full Web stack allow efficient streaming / flushing of data. Check our reference Docker + Traefik documentation.
    • Support RTL (right-to-left) languages #2776
    • New keyboard shortcut Alt ⎇+r to mark previous articles as read #2843
    • In the statistics page, show feeds inactive for 1, 2, 3, 5 years #2827
    • Reset FreshRSS page scroll when restoring a browser session, to avoid inadvertently marking as read new articles #2842
    • Fix scrolling of labels dropdown #2727
    • Enlarge <audio> widgets to use the full width of the reading zone, to help navigation in e.g. podcasts #2875
    • Use <p> instead of <pre> to display <media:description> information #2807
    • Show language and e-mail address in the list of users #2703
    • Change logic when using shortcuts to navigate between feeds, in the case some are empty #2687
    • Option to show/hide favicons (e.g. to reduce the number of requests) #2821
    • Improve loader animation colour in the Dark theme #2753
  • SimplePie
    • Use distinct cache for feeds retrieved with #force_feed simplepie#643
      • Fix the issue of not being able to immediately try to add an invalid feed again #2524
    • Update to SimplePie 1.5.4 #2702, #2814
      • Require PHP 5.6+, and add PHP 7.4+ compatibility
      • Add Russian and German dates
      • Etc.
  • Deployment
    • Docker: Alpine image updated to 3.11 with PHP 7.3.16 and Apache 2.4.43 #2729
    • Move core extensions (shipped with FreshRSS) to their own directory, so that ./extensions/ is solely for third-party extensions #2837
      • This allows mounting ./extensions/ as a Docker volume, to ease adding third-party extensions
  • Extensions
    • New core extension to find feeds for Google Groups #2835
    • New hooks check_url_before_add and feed_before_actualize #2704
    • Execute the entry_before_display hook also through the API #2762
    • Allow extensions to change CSP (security) rules #2708
    • Expose the article ID in the share system (for a new e-mail sharing extension) #2707
  • i18n
  • Misc.
    • Improve logging of database errors #2734
    • Remove the min_posts_per_rss configuration, which made efficient buffering difficult #2588
    • Add a test target to Makefile #2725
    • Fix test suite #2721
    • Refactor request class #2373
    • Remove deprecated magic quotes logic #2698
  •  

Crisis, capítulo 11: Voy a ser sincero contigo.

Este capítulo me ha costado mucho. No sé por qué exactamente. No encontraba las palabras, de ahí la tardanza. Aunque lo cierto es que no tengo mucho tiempo para escribir, los ratos que he podido ir sacando no han sido productivos porque me quedaba volando en círculos alrededor de lo que quería escribir para, al final, irme con las manos vacías.

Sea como sea, aquí tenéis un nuevo capítulo de Crisis:
http://crisis.mundowdg.com/index.php/2019/08/20/11-voy-a-ser-sincero-contigo/

  •  

BOFH-Zen: La práctica (palito)

Cuando el cerezo comienza a perder su flor, es el protoBOFH quien acude a las empresas a recibir la llamada formación en centro de trabajo.

Me consta que en algunas empresas a los practicantes los tratan como a equipamiento de oficina: hacen fotocopias, traen café, archivan, dan masajes en las corvas con tal de agradar y aprobar las prácticas con la vana esperanza de encontrar un hueco entre la plantilla.

En cuán pocos casos se da que el practicante coincida en el tiempo con que la empresa necesite personal y que el joven esperanzado sea lo suficientemente bueno como para no iniciar un proceso de selección.

En Suprakillminds el departamento de informática no hace estas mierdas porque gracias al BOFH-Zen, aunque no hemos alcanzado la iluminación, hemos abandonado hace tiempo la oscuridad y ahora estamos en la zona umbría. Cuesta el mismo trabajo mantener a un chaval ilusionado entretenido haciendo gilipolleces que formarlo como es debido.

Me hallaba pues, en mi puesto, trabajando en cosas por las que $Hyperboss no sabe que me paga ni quiere saberlas, cuando Havenocon soltó a una chiquilla al final del pasillo convertido en nuestros dominios y que llaman despacho. La jefa de personal saludó con la mano por toda explicación.

La criatura se desplazó hacia nosotros con paso inseguro, dubitativo, como si diésemos miedo. Como si tuviese miedo de nosotros. Ya ves tú. Avanzaba por el pasillo en penumbra mirando con curiosidad las estanterías repletas de hardware retirado de los racks. La poca luz del pasillo y las estanterías atestadas de cadáveres de hierro dan a la entrada un aspecto levemente siniestro. Después de varias experiencias traumáticas con consultores de varios sabores, $Hyperboss dejó que los informáticos se ocupasen de los sistemas. Como si supiéramos de ésto. Nos dio presupuesto y nos dejó hacer.

-¡Wardog! ¿Qué haces?- me saludó una mañana $Hyperboss mientras sacaba un café de la máquina porque no le tengo miedo a nada y mi estómago digiere igual la papilla de maíz que el acero al rojo blanco. Le miré, miré el vaso que había en mi mano, miré la máquina de café que aún borboteaba y crujía sus mecanismos y le volví a mirar a él.
-Lentejas, mire. ¿Quiere un plato?
-¡Déjate de hostias! Yo es que ya no sé qué hacer en ésta empresa para que las cosas funcionen- A veces $Hyperboss saluda así. La acidez y los consultores fake.
-Las cosas funcionan- le dije.
-¡Que no fallen! ¡Si no se rompe una cosa falla otra!
-Ah. Eso.

El BOFH-Zen es la guía. El BOFH-Zen es la luz. EN el BOFH-Zen no hay bien y no hay mal. En el BOFH-Zen hay paz y no hay enfrentamiento porque el BOFH-Zen es el aceite que lubrica el alma del BOFH y la hace inalcanzable para el violento.

Cuando el violento llegue a tu puerta con un reproche en los labios no tengas sus palabras por enemigas. Las palabras salen de un cuerpo y llegan a otro. Fluyen de un alma a otra. El alma del BOFH no se ha de ver alterada. El alma del BOFH está con sus sistemas. Si sus sistemas los paga un tercero y encomienda al BOFH su cuidado, el BOFH cuidará del bienestar de los sistemas que pagó su $Boss. La continuidad de los sistemas del BOFH es prioridad. Por eso, que el negocio funcione es necesario pero no es vital porque nada es vital. Nada es importante.

Las palabras violentas no son más que el agua de una pequeña cascada en el nacimiento de un arroyo. Si el BOFH es colocado bajo la cascada, nada puede ocurrirle. Porque el BOFH-Zen es el aceite que lubrica el alma del BOFH. El BOFH-Zen es también el sol que calienta e ilumina el alma del BOFH en su interior. Por eso, cuanto más se sumerge el BOFH en el BOFH-Zen más aceite recubriá su alma y más caliente estará dicho aceite.

Así que cuando el violento ponga al BOFH bajo la cascada de sus palabras no conseguirá más que verter agua sobre aceite hirviendo. El aceite no tiene la culpa de hervir. El aceite estaba en paz. Si el violento se quema no será más que por su culpa pues el BOFH no es violento ni pacífico. Simplemente está en paz.

-¡Sí, eso! ¡Tampoco pido tanto!- insistió $Hyperboss.- ¡No quiero que haya fallos en esta puñetera empresa!
-Ciérrela.
-¡Y lo dices tan tranquilo!
-Claro. Quitando lo inorgánico, las pelusas y Daisy, todos aquí somos humanos. Vamos a fallar.
-¡Pues para eso están los ordenadores!
-No. Los ordenadores están para ayudar a organizar el trabajo. Están para controlar máquinas. Pero no trabajan ni organizan. Son herramientas.
-¿Pues entonces para qué los quiero si no me evitan errores?
-Evitan errores. Los que pueden evitar porque les hemos enseñado a hacerlo.
-O sea, que es porque no los configuráis bien. ¡Por fin lo admites!
-No es eso. Si sólo nos dedicásemos a detectar y corregir errores humanos ya haría años que tendría usted un bonito cadáver de hierro que una vez impidió muchos errores humanos pero que se echó a perder por falta de mantenimiento. Usted no va a dedicar el dinero y los recursos que hacen falta para que ambas cosas sean posibles.
-¡Cómo que no! ¿Qué necesitaríais?
-Diez programadores con experiencia, diez analistas, diez administradores de sistemas, treinta técnicos de hardware y treinta técnicos para montar un centro de asistencia a los usuarios. Necesitaríamos tres años para formar a los que tengamos que formar y que los que sepan más que nosotros entiendan el guirigay que hay aquí montado. Necesitaríamos renovar la infraestructura, aunque seguirán siendo máquinas y se romperán, mejorar las comunicaciones, comprar software que suplimos como podemos..
-¡Para, para! ¿Me estás diciendo que entre tres hacéis el trabajo de setenta… no, ochenta y pico personas?
-Qué va. Por eso el sistema no es a prueba de fallos, pero funciona y hace lo que debe hacer.

$Boss se me quedó mirando largo rato. Le di un trago a las lentejas.

-Pues tú me dirás qué puedo hacer porque estoy hasta los huevos de la informática. He traído a los mejores consultores y lo único que he conseguido ha sido disgustos y pagar facturas.
-Pues oiga, se me ocurre, así, como locura, que en vez de pagar esos pastizales por nada, los invierta en mejorar lo que ya tiene en vez de pagar a charlatanes.
-No, si aquí el caso es gastar. ¡Hasta los huevos me tenéis!- gritó mientras se marchaba hacia su despacho como una furia y se encerraba con un portazo.

A la semana siguiente se reunió con MKII en su despacho y le dijo que había pensado en mejorar los ordenadores y lo que hiciera falta para que todo funcionase un poco mejor. MKII alabó la idea como una genialidad y le preparamos un presupuesto que firmó sin respirar porque le pareció mucho menos de lo que se temía y muchísimo menos de lo que había invertido en gomina, trajes y comilonas a costa de la empresa. $Hyperboss funciona así: alguien le dice lo que no quiere escuchar, luego lo rumia y cuando termina caga la idea como si fuera suya.

Las ideas son la esencia bajo las palabras. Sólo las ideas más puras viajan con las palabras y calan en su receptor por su simpleza. Por eso los buscadores del BOFH-Zen no buscan excusas. Los buscadores del BOFH-Zen ven pasar las palabras a su lado y extraen sabiamente el dolor y el clamor ajeno, lo observan atentamente y se limpian el culo con él porque de nada les sirve porque nada es vital, nada es importante. No obstante, la naturaleza del BOFH siempre busca la mejora en todo. Por eso cuando dos BOFHs se encuentran siempre discuten qué es mejor, siempre comparan lo que uno y otro hace. Siempre defiende una herramienta sobre otra como la mejor. Porque el BOFH no busca la perfección que como entidad absoluta es aborrecible y solamente aspira a mejorar hasta el fin de su uptime. Así es el BOFH-Zen. No busca la perfección sino lo que sea mejor. Y lo mejor es cambiante y es mutable igual que el agua fresca no está en un pantano sino en el bravo arroyo que nace de la nieve y baja al valle retorciéndose y haciéndose cada vez un camino mejor.

Por eso el corredor ahora tenía una fila de estanterías repletas de maquinaria que no íbamos a tirar sino a reciclar para reforzar algunas sedes y para monitorización y pruebas.

Supongo que por eso la pobre chiquilla desfilaba temerosa en la penumbra, sola, novata y abandonada a su suerte. Un poco más adelante, estaba Daisy de pie inclinada sobre su mesa, hurgando en las tripas de un servidor 2U totalmente concentrada con los cascos puestos y de espaldas al pasillo. La chica llegó a su altura y saludó con un tímido «hola».

Daisy arrancó de cuajo un ventilador y se giró sin quitarse los cascos. Escaneó a la chica en un segundo de arriba a abajo y vuelta. Cogió un bote de aire comprimido y sin mirar a la pieza siquiera la limpió con precisión. Cogió un bote de lubricante blanco y engrasó el rodamiento sin verter una gota sin dejar de mirar a la chica. Esperó a que la nube de polvo fuese aspirada por el extractor. Se quitó la mascarilla y la dejó colgando del cuello.

-¿Quieres algo?- le preguntó a la chica con tan poca inflexión en la voz como una calculadora mecánica.
-Ven… vengo a hacer las prácticas… me llamo…
-Pregunta ahí- dijo Daisy señalando en nuestra dirección con el bote de aceite. Se puso la mascarilla, se giró y siguió arrancando ventiladores al servidor en silencio.

La muchacha llegó hasta nuestras mesas. MKII tecleaba como un histérico en su puesto documentando todo lo que estaba haciendo con una exhaustividad digna de admiración. De verdad. La documentación que estaba preparando era tan completa y detallada que hasta la mitad de un luser podría entenderla si fuera capaz de leerla. Si es que un luser puede leer más de dos párrafos antes de que les dé estrabismo y una bajada de azúcar.

Yo estaba generando e intercambiando claves SSH entre los servidores de producción y los de backup con los pies en la mesa y el teclado en los muslos. MKII iba por detrás documentando los nombres de los ficheros de claves, las rutas…

-Ho… hola, buenas, me.. me llamo Violeta y… y vengo a hacer las prácticas de…- la pobre temblaba y se manoseaba un mechón de pelo rizado que se le iba constantemente a la cara.
-¡Ostras! ¡Espera!- le grité a la muchacha más alto de lo que pretendía. Solté el teclado sobre la mesa y salté por encima apoyando la mano izquierda. Salí corriendo hacia la salida. Al llegar al final del pasillo MKII y la chica de prácticas me miraban con los ojos como platos. Daisy siguió descuartizando el servidor con evidente satisfacción.

Corrí todo lo que pude y cogí una bolsa de basura llena de papeles cortados por la destructora y después un ventilador del armario de los trastos. Volví a toda velocidad a mi puesto. Daisy arrancó otro ventilador. MKII y Violeta me miraban aún con cara de tarjeta de sorpresa del Monopoly.

Puse el ventilador en marcha detrás de mi silla mirando al techo y me senté de nuevo.

-Perdona, ¿decías?- la pobre chica no daba crédito.
-Soy… me llamo Violeta y… bueno, vengo, mi instituto me manda para hacer las prácticas de… de un ciclo formativ…

Cogí la enorme bolsa de basura y la vacié detrás de mi sobre el ventilador. Una nube de confeti inundó la sala y descendía suavemente revoloteando en las turbulencias del ventilador. MKII y Violeta me miraban con cara de besugos.

Junté las manos ante mi pecho y la miré muy serio.

-Hija mía. Jamás vuelvas a titubear ante mi ni ante nadie. El camino que has elegido es arduo y sin guía puede ser doloroso. Pero no has de temer si tu guía es el BOFH-Zen.

MKII meneaba la cabeza y escupió un trozo de papel que le había entrado en la boca. Violeta había dejado de temblar porque no acertaba ni a pestañear.

Los papelitos seguían cayendo como nieve ligera. No eran pétalos de cerezo, pero el efecto era casi el mismo.

  •  
❌