Author Archives: Rob

Counting annotations in a PDF

Suppose that you wrote a book, and your publisher sent you a PDF of the final proof to review and correct, before the book is printed. Then you may want to know how many notes you’ve added to the document when you’re done.

$ env LC_CTYPE=C tr -d '\000-\011\013\014\016-\037' < FILENAME.pdf | grep -E '^<</Type /Annot /Rect \[[0-9\. ]+\] /Subtype /Text' | wc -l

It’s that simple…

And if you’d like to know how many terms you highlighted, all you have to do is replace /Text with /Highlight.

$ env LC_CTYPE=C tr -d '\000-\011\013\014\016-\037' < FILENAME.pdf | grep -E '^<</Type /Annot /Rect \[[0-9\. ]+\] /Subtype /Highlight' | wc -l

Inline notes are of subtype /FreeText.

And to count all your annotations, regardless of type, just delete the subtype altogether.

$ env LC_CTYPE=C tr -d '\000-\011\013\014\016-\037' < FILENAME.pdf | grep -E '^<</Type /Annot' | wc -l

Open your PDF in less to see what other interesting things you could do with grep; pipe the file through tr to get rid of the control characters.

$ env LC_CTYPE=C tr -d '\000-\011\013\014\016-\037' < FILENAME.pdf | less

Warme chocolademelk

Een beker melk met een paar scheppen Nesquik een minuutje in de magnetron, dacht je?
Ik denk het niet. Dit is een recept voor lekkere warme chocolademelk.

Voor wie even genoeg heeft van vin chaud en Jägertee.

Nodig:

  • melk
  • instant chocolademelk (Nesquik, Benco, …)
  • een reep donkere chocola; minstens 65% cacao
  • cayennepeper
  • cognac

Probeer een instant chocolademelk te vinden die meer naar chocola smaakt dan naar suiker (dat valt niet mee, want dat spul wordt gemaakt voor kinderen, en kinderen willen suiker).

Meet een niet helemaal volle beker melk af, doe dat in een steelpannetje, en zet het op half vuur.
Schep dan de instant chocolademelk in de beker; voor de beker die ik gebruik, heb ik 3-4 volle theelepels nodig.
Brokkel wat van de reep chocola in het pannetje met melk. Voor mijn beker gebruik ik 3 blokjes. Je kunt er natuurlijk gewoon de hele reep in mikken, maar dan lost niet alles op, maar slaat het neer op de bodem van je pannetje; experimenteer om de lekkerste chocolademelk te krijgen, en zo min mogelijk chocola weg te gooien.
Giet de melk, als die warm is en de chocola gesmolten, in de beker, en roer tot het poeder is opgelost.
Roer er dan een kwart tot een halve theelepel cayennepeper en een scheut cognac doorheen. Gebruik niet teveel cognac: balans is belangrijk, en als het je alleen om de cognac gaat, had je beter al dat werk achterwege kunnen laten, en gewoon een glas cognac nemen.

Tip:
Deze chocolademelk is erg lekker als je vanuit de kou thuis komt; het is een warmte-bommetje. Als je een beker maakt voor het slapen gaan, is het misschien lekkerder om de peper achterwege te laten.

En alsjeblieft: geen slagroom!
Het is echt heel raar om eerst werk te steken in de bereiding van een hele lekkere drank, om die vervolgens te vermoorden met een berg vet en suiker.

Smakelijk!

FreeBSD jails: a complete example

FreeBSD jails are a great way to separate and compartmentalize processes, which enhances the security of your system. A jail is an enhanced chroot: it prevents an attacker who manages to compromise a service from gaining access to the rest of the system.

This post documents the setup of 2 jails that serve data to the outside world, and communicate between each other (through a Unix Domain Socket, not a TCP socket).

Read More

FreeBSD: which ports/packages did I update today?

A FreeBSD oneliner this time.
This won’t work on Linux!

Tools like portmaster and portupgrade allow you to update all installed ports/packages in a single run, which is great.
But these tools do not list the ports and packages that have been upgraded, leaving you to guess which daemons and services must be restarted…

Luckily, all installed packages are registered in an SQLite database, together with a timestamp for their last upgrade (or installation). Add the following alias to your ~/.bashrc:

alias puptd='sqlite3 /var/db/pkg/local.sqlite "select origin from packages where time > $(date -v-2d +%s) order by origin" | less'

Clearly, if you don’t use the Bash shell, you should figure out how to add aliases in your shell. The alias will be active after you re-login; invoke it like any other command.

$ puptd

This alias will list all ports/packages that were updated (or installed) in the last 2 days (an update of all ports can run for quite some time). Obviously you should feel free to change the -v-2d to any other period (-v-3H for the last 3 hours, -v-1w for the last week, …). You can then check the list to see if any services must be restarted, configurations must be verified, etc.

Remember that some services may depend on other packages. E.g. if you updated Python, you may have to restart Radicale and Fail2ban, and if you updated PHP and you use mod_php, you may want to restart Apache.

If you’re going to play around with that database to see what other info you can extract from it, you should probably make a copy of it, to make sure you don’t accidentally write to the original; you don’t want to mess up your package database.

P.s.: the name for the alias comes from ‘Ports UPdated ToDay’; change it to anything you like.

Hobo-gado

Als je op zoek bent naar een mooi authentiek gado-gado recept, zoek dan alsjeblieft verder. Dit recept staat in de rubriek Hobo food, en dat betekent snel, goedkoop, makkelijk, en meestal niet helemaal volgens bestaande tradities.

De enige overeenkomst tussen dit recept en gado-gado is eigenlijk dat ze allebei groenten en pindasaus bevatten. Verder treed ik alles met voeten.

Nodig:

  • een blik sperziebonen (goed uit laten lekken)
  • eventueel een blikje taugé (goed uit laten lekken)
  • kipfilet, in kleine stukjes
  • pindakaas
  • ketjap
  • sambal
  • melk
  • knoflook

Bak de kip met wat knoflook in een wok (of een hapjespan, ofzo) met een beetje olie. Schep, wanneer de kip gaar is, de groente erbij.

Schep een paar lepels pindakaas in een steelpan op half vuur, en schenk er wat melk bij. Begin met een beetje melk, en voeg steeds scheutje toe totdat je de gewenste sausdikte hebt; de saus mag wat dun zijn, zodat hij makkelijk mengt met de groenten. Voeg naar smaak ketjap, sambal en knoflook toe.
(Pindasaus uit een potje kan natuurlijk ook, maar dat hebben we hier in Frankrijk niet. En zelf maken is natuurlijk altijd leuker en lekkerder.)

Als de groenten en de saus allebei warm zijn, kan de saus bij de groenten; let een beetje op de verhoudingen: het moet geen soep worden. Laat het geheel nog even samen pruttelen.

Serveer met rijst en kroepoek.

Tip:
Normaal gesproken is gado-gado zonder vlees, maar omdat ik het nu maak als hoofdgerecht, en niet als 1 van de 134 bijgerechten van een rijsttafel, heb ik er wat kip doorheen gedaan. Het kan dus ook prima zonder vlees, of met klein gesneden plakjes kipfilet (beleg). Doe in dat laatste geval het vlees wel na de groente in de pan, in plaats van ervoor.

Tip:
In plaats van, of als aanvulling op de ketjap en de sambal kun je ook chilisaus gebruiken.

Smakelijk!

Multigrep

I am an author. And even though the actual books are well-organized, the writing process isn’t always. For a single book I have many mega-bytes of PDFs, ODTs and text files full of notes, drafts, documentation, etc.
So I needed a simple tool to find that one note I once wrote, in that huge pile of data.
Now, if those files were all text-based, I could use grep. But they aren’t. So I wrote a wrapper around grep, that allows me to also search PDFs and OpenDocument files.

Read More

Installation et configuration d’un serveur internet

Et voilà mon nouveau livre !

Ce livre guide le lecteur ou la lectrice à travers l’installation et la configuration d’un serveur internet.

Ce livre s’adresse aux administrateurs système, débutants comme plus expérimentés, qui souhaitent, à partir d’un serveur sur lequel seul le système d’exploitation est installé, configurer un serveur internet d’entreprise fonctionnel, prêt à être mis en production.

Pour bien appréhender la lecture, un minimum de connaissances sur Unix/Linux, sur le fonctionnement de l’interface en ligne de commande et la configuration à l’aide des fichiers texte est conseillée. La connaissance de commandes de base telles que cd, ls, cat, less, tar et gzip est également un plus.

Après un chapitre sur les bases d’un système Unix/Linux, l’auteur amène rapidement le lecteur au cœur de la mission d’administration système avec la mise en œuvre de la configuration d’un serveur, illustrée avec plusieurs systèmes d’exploitation tels que FreeBSD, Debian et CentOS.

A l’aide d’exemples de configuration et de commandes, l’auteur explique étape par étape l’installation et la configuration d’un pare-feu, d’un serveur DNS, d’un serveur web (Apache ou Nginx) et d’un serveur mail.

Il détaille également le chiffrement par SSL/TLS des connexions (web et courriels) ainsi que la gestion dans un annuaire LDAP des utilisateurs n’ayant pas besoin de l’accès shell. Ce livre propose également des pistes pour l’analyse de problèmes éventuels, pour la maintenance quotidienne et les sauvegardes, ainsi que pour donner la possibilité à l’administrateur système de faire évoluer le serveur.

Des éléments complémentaires sont en téléchargement sur le site de l’éditeur et sur le site de l’auteur.

→ Plus d’informations sur www.librobert.net, ou commandez-le directement dans la boutique en ligne de mon éditeur Éditions ENI.

Ce livre est également disponible en néerlandais.
La version anglaise sortira début 2021.

Cleaning up the web server logs

I am between 2 books currently, author-wise. So I’m using this time to do the server-housekeeping I’ve been putting of in the past months. Today, I had a look at my web server logs. And I almost regretted it instantly.

The logs were full of requests clearly made by script kiddies. Half of the error-triggering requests were for the file wp-login.php, even for my non-WordPress sites, and what’s worse: even for non-PHP sites. And then there were requests for the usual 1337w0rm, indoxploit, adminer, etcetera. I could have left it, of course, since it doesn’t really hurt to have all these idle requests, but all this noise makes it difficult to distil the log messages that really do need my attention.

In this post, I’ll share what I did to have cleaner Apache log files in the future.
And at the same time, these instructions help protect the web server against known vulnerabilities and exploits.

Read More