The bypass paywalls on a phone

Bypassing paywalls is a sport for some. And it ain’t hard for Desktop Browsers. Just install a addon in your favorite Desktop Browser.

Unfortunately this didn’t work on a Android or iPhone phone. Nor on Sailfish OS with its Android emulation. Because over there browsers like Chrome and Chromium don’t allow extensions to be installed. Firefox does have some limited support for addons, but it can’t open local XPI files. Its addon menu doesn’t contain the addon and the addon website for it sees the running browser as incompatible.

Luckily you have Kiwi Browser, which is a Chrome based browser that did not disable extensions to be installed.

Once Kiwi is installed you can go to either chrome://extensions or kiwi://extensions, enable Developer mode and then open the zip file as explained in the Readme.md.

ps. For Sailfish I had to install an older version of Kiwi Browser, as the most recent version doesn’t seem to work.

Descaling a Lay-Z-Spa water pump unit with my own contraption

The Bestway hottub’s water pump must regularly be descaled. It’s not easy to add huge amounts of chemicals to your pool water to have a meaningful effect when you have serious calcium buildup in your water pump unit. So I made myself a contraption.

I remember that somebody made something for this himself too. His contraption inspired me a little bit of course.

I used the tubes from a old Bestway hottub. I just cut them out of the inflatable pool before I disposed myself of the rest. Then I made two holes in a cheap water bucket and I attached the tubes with some rubber and other things to seal them to the holes.

Now I can descale my Bestway water pump unit like how the professionals do it!

Bestway Lay-Z-Spa motor #58113 fix

A lot of people have or are buying those cheap inflatable Bestway hottubs.

A lot of people have in the past realized after about half a year of continuous running that the water pump unit is of very low quality.

I have been running my Bestway hottub for about five or six years now. Because of this low quality I had to enroll myself into the world of Bestway parts and repairs. I regularly had and have to repair various things about my Bestway hottub. Usually something about the water pump unit.

Last time, in 2019, it was the water flow sensor. Being a good engineer, I of course hacked it. I have also bought one time a second hand infamous #58113 motor (the number is already infamous and known in the Bestway parts community).

Today I had the ER02 error back. No water flow. But after some testing I knew that it was not the water flow sensor this time. Then it’s probably the motor itself. These #58113 motors often have it that their impeller comes loose inside of the motor.

Instead of ordering either a new impeller or a new motor, I decided to investigate it this time. And try to figure out what the engineering mistake is that the person who designed this motor made.

Getting the motor out is probably already plenty challenging for most owners of a Lay-Z-Spa. It’s not too complicated though: turn the motor pump upside down. Take off the bottom panel. Loosen two screws of the motor. Disconnect the electric cable. Pull the motor out. For the motor you don’t need to open the top of the water pump unit. If your problem is the water flow sensor, then you do need to open the top instead.

I found out what is wrong about the motor (the rubber bearings are just cheap) and I will now present a hack that you can do to salvage your Bestway #58113 motor with four cheap washers that will keep the impeller better in place.

Here you have the impeller (or/plus commutator) and the rubber “bearing” for it (in background the disassembled stator):

And this is the shaft and again that rubber “bearing”. The shaft will go through the middle of the impeller (plus commutator) and at the ends two of those rubber bearings go to keep the shaft nicely centered. All this is plastic. Super low quality. Almost guaranteed to fail after a few months of operation.

This is the stator. One of those rubber bearings must go in the middle of it. And then the shaft in the bearing. Keep the rubber seal good. Else when reassembling the motor water will splash all over the place. This is not good.

This picture illustrates how the shaft goes in the rubber bearing and then in the front cap

This picture shows the normal assembly of shaft, impeller (plus commutator) and bearing. Normally there is a by the factory added washer too. But mine was completely gone. Debris of it was found in the commutator. This shows how low quality this piece of shit is. This of course should never happen.

This will be the hack. We will place three simple washers on the shaft between the impeller and the bearing.

Update: After a first inspection after two days of running with the washers I noticed that although the washers claim to be stainless steel, I saw and I realized that all steel eventually rusts. I made a little plastic washer instead and I greased it with silicone grease that I once bought to grease the seal of my Scuba dry suite.

This is the plastic washer I made to replace the metallic ones, with that grease applied:

This is that silicone grease. I greased the entire shaft with it too:

This will once reassembled keep the entire assembly (bearings, shaft, commutator) tighter together with the stator. Without these three washers the plastic washer, the whole thing starts wiggling and eventually comes loose. Impeller will become erratic and destroys the washer (in my case) and likely also one of the two rubber bearings. After that it’s pretty much game over and you’ll see the ER02 error.

We will also place a washer on the back of the impeller (or commutator) on/over the shaft (update: use the factory provided one). That will look like this (so I’m holding the impeller upside down now). It will fall off if you assemble it upfront. So this is just to show how it will be like once inside of the stator (that or I just made too much pictures, and now I have to write more blog content around it). Front cap, some more washers and stator in the background.

Let’s start assembling it all together. First the shaft with bearing that goes into the hole of the stator. With the factory provided washer. Don’t try to fiddle the impeller together with the shaft into the stator. You’ll just miserably fail due to it all being a bit magnetic of course (it’s an electric motor, remember). Do the shaft with bearing and washer first.

That looks like this (OMG I made too many pictures)

Now we will put the impeller (commutator) over the shaft. Do this gently so that the shaft does not go out of the rubber bearing.

Now place the front cap back. Ensure that the other rubber bearing is in the front cap’s middle center hole. Make sure that the little piece of shaft you have left after the three washers goes into that front cap’s bearing.

When closed that will look (when looking through the water entrance hole) like this. Look carefully and you’ll see the three washers the plastic washer. They will keep everything in place from now on. Note that since the update mentioned earlier I’m using a white plastic washer instead of three metallic ones.

Now you just close the motor by screwing the front cap tight

If this doesn’t work (I’ve had motors with the commutator magnet broken into pieces) then you can fairly easily find these motors on the second hand market. The replacement is not very hard so you don’t need to buy an entire new water pump unit.

Ons Westers oorlogsmateriaal

Voor een deel komt dit doordat Westerse hoogtechnologische wapens nog niet volledig toegezegd worden aan de oorlog in Oekraïne. Voor een ander deel niet.

Ongeacht de fantagtische mega whoo ideeën van Westerlingen en hun oorlogsmateriaalproducerende nageslacht, blijkt een echte oorlog met een echte tegenstander (dus niet één zoals in bijna alle Westerse oorlogen tegen zandmannen met refurbished Kalashnikovs) een oorlog te zijn zoals de Tweede Wereldoorlog was:

Het belangrijkste is en blijft de aanvoerlijn.

Daar is nagenoeg niet in geïnvesteerd. Want dat kon tijdens Rambo III en Terminator niet verkocht worden aan de filmindustrie van Hollywood.

De aanvoerlijn is nog steeds voor zowel Oekraïne als Rusland zoals het tijdens de Tweede Wereldoorlog was. En omdat Rusland momenteel een veel beter georganiseerde aanvoerlijn heeft als Oekraïne, zullen zij deze oorlog voorlopig gezien dan ook winnen.

De filmindustrie van Hollywood is daar niet de schuldige van. Maar wel de propagandaindustrie van het Westen. Zij hebben gekozen voor deze richting van kartonnen huizen zonder de diepte van een echte investering. Zij holden ons uit. Want enkel de buitenkant doet er toe.

JDAMs zijn zo’n voorbeeld daarvan: goed tegen zandmannen die geen GPS signaal kunnen jammen. De Russen kunnen dat wel. Maar daar gingen we niet tegen vechten. Dus investeren in bv. inertial navigation systems was geen doel. Kartonnen huizen. Geen diepte. De definitie van het Westen.

De dag van vandaag moet modern militair materiaal er vooral mat zwart en koel uitzien. Zoals de lak van een macho-auto of iPhone. De buitenkant doet er toe. De man die met het spuitpistool komt is belangrijker. Vooral als die met idiote maar wel modieuze camouflagepatronen afkomt (die vooral onbewezen waren, en soldatenlevens hebben gekost). Het is de karton dat er toe doet. Dat is modern. Het moet er goed uitzien. Goed voelen. Mooi zijn. Het moet niet goed zijn. Het moet goed voelen.

Wij Westerlingen zijn zwakke prutsers geworden. Prutsers die een miljoen keer teveel geld uitgeven aan zaken die er gewoon niet toe doen en die zelfs gevaarlijk slecht zijn.

ps. Ik plaatste geen links. Maar ga er maar van uit dat ik “modieuze camouflage”, “JDAMs wiens GPS signaal gejammed kan worden”, “Rambo III” en “Terminator” en “zandmannen met refurbished Kalashnikovs” had kunnen linken. Je zou ook versteld staan van waar ik naar zou linken. Hoe debiel het allemaal is. Zelfs fundamenteel en vooral ook ontegensprekelijk debiel.

Ons materiaal is slecht. Omdat het niet werkt in een echte oorlogssituatie.

Hoe één en ander verbeteren

Ik denk dat een paar van de hedendaagse problemen kunnen opgelost worden als volgt:

Een tweet of een mening die gepost wordt zal pas overmorgen gepubliceerd worden. Alle media nemen dit aan.

Wanneer men een mening of post wil plaatsen die onmiddellijk gepubliceerd moet worden, dan kost dit 500 Euro of meer (een vijfde of meer van een maandloon).

Wanneer men een mening of post plaatst die pas overmorgen hoeft gepubliceerd zal worden, dan kan men die gedurende die tijd kosteloos aanpassen en verwijderen. De prijs is een Euro of minder (een duizendste of een honderste van een maandloon).

Krasjes uit brilglazen

De buren weten het waarschijnlijk al, maar ik was pas bezig met mijn auto mat zwart te spuiten. Daarbij hoort clearcoat of blanke lak en het opschuren en polieren er van. Het is mat zwart geworden ook omdat die blanke lak (clearcoat) met spuitbusjes me net iets te moeilijk was om echt goed te krijgen. Ik zou daar m.a.w. eerst een verfspuitpistool voor moeten hebben.

Met die nieuw opgedane handigheid en de schuurmaterialen in de hand, dacht ik: hmm. Ik heb hier nog een oude bril met krassen op liggen …

Dus ik probeerde de kras(sen) eruit te halen met het schuurpapier dat ik voor de wagen had gekocht. Eerst droog P600 voor de kras zelf. Waarna de bril er totaal onbruikbaar uitziet, natuurlijk. Daarna het P600 geschuurde gedeelde met nat P1000 en dan dat met nat P3000. En dan het hele brilglas nat met zo’n P5000 van M3. En dan met polish waarmee je normaal je auto dus poliert.

En jawel hoor. De kras is eruit en het glas is helder genoeg opdat mijn ogen het niet merken. Perfect is het niet, want er is lokaal wat vervorming (zoals te verwachten). Maar de oude bril is ‘bruikbaar’. Hoewel de vraag is of die vervorming al niet even erg is als de kras was.

ps. Probeer dit enkel met een oude bril. Het glas zal nadien een beetje vervormen en je moet best wel ver gaan met je brilglas te schuren. Als je in paniek stopt met het fijner opschuren met steeds fijner schuurpapier dan is je brilglas nadien onbruikbaar volledig kapot. Het wordt eerst véél slechter (ondoorzichtbaar dof) om daarna na het polieren terug goed te worden. Net zoals bij je auto dus.

ps. Als het een echte kras is, dan gaan de online trukjes zoals tandpasta dus echt wel niet werken. Het principe is: of je schuurt de kras weg (waardoor er vervorming zal zijn) en dan schuur je met steeds fijner schuurmiddelen tot het geheel terug glanst. Of je vult de kras op met iets (wat ik denk dat de tandpasta truk doet).

Veal good, bericht aan VanLommel

Beste,


Toen ik jonger was, was ik vegetariër. Ik was dit omdat er onvoldoende wetgeving in Vlaanderen was voor het algemeen dierenwelzijn.


Naarmate ik opgroeide werd ik milder in allerlei mijn meningen. Maar het was pas op mijn 30ste dat ik terug vlees begon te eten: vooral omdat er wetgeving kwam die mij verzekerde dat vleesverwerkende bedrijven in België zich aan bepaalde voorschriften zouden gaan moeten houden.


Ik acht het volstrekt onnodig dat men in deze tijden dieren leed aandoet opdat men ons vlees kan produceren.


Indien U in uw bedrijf dat toch nodig acht, dan hoop ik dat andere bedrijven en andere bedrijfsleiders, die dit anders kunnen organiseren, uw kansen en uw middelen krijgen. Dat U van de markt verdreven wordt. Zodat ik als consument me geen zorgen meer om mensen zoals U hoef te maken.


Ik zeg m.a.w. dat indien U geen vlees kan produceren zonder dieren leed aan te doen, dat U dan niet welkom bent in onze vrije markt. Die is dan nog steeds vrij. Net zoals onze markt vrij is hoewel we geen slaven meer verhandelen. Ik zeg m.a.w. dat zelfs indien U dan geen winst kan maken, of dat indien U dan uw bedrijf niet levensvatbaar kan houden, U nog steeds niet welkom bent. Dat U dus moet weggaan.


Want als U verdreven wordt (oh ironie van de taal), dan komt er ruimte voor bedrijfsleiders die een bedrijf zoals het uwe wel zonder dierenleed kunnen organiseren.


Ik wil inderdaad ook dat er geen enkel vlees binnen de Europese Unie komt dat geproduceerd werd door dieren te martelen. Zodat er een gelijk speelveld is. Ik hoop dat U en uw bedrijf zal lobbyen voor dat gelijke speelveld. M.a.w. kan U door te investeren in goede infrastructuur waardoor dierenleed niet meer noodzakelijk is, een competitief voordeel verkrijgen.


Ik hoop ook dat uw klanten tot zolang U kan bewijzen dat er geen dierenleed in uw bedrijf is, U contractloos houden.

Dat is helaas de enige manier waarop U werk zal maken van de nodige veranderingen.


Dat is de enige manier waarop ik opnieuw klant zal worden van uw producten.

Met vriendelijke groeten,
Philip

ps. Veal Good is de slogan van VanLommel.

Vanzelfsprekende geostrategie

De tachtigduizend soldaten die momenteel door Oekraïne op Bakhmut ingezet worden zijn een boodschap aan Rusland alvorens China haar poging tot vredesonderhandelingen inzet.

Omgekeerd is Avdiivka Rusland’s zet om duidelijk te maken aan Oekraïne dat Rusland dit zal innemen moesten zulke onderhandelingen falen.

Met andere woorden, de standpunten zijn uitgezet. En Rusland zal Avdiivka innemen terwijl Ukraïne Bakhmut zal proberen terug te nemen.

Een spa bad warm houden met zonnepanelen

Het uitgangspunt is het volgende:

  • Een SPA bad dat je ~ 40 °C warm wil houden met een electrische pomp die het water opwarmt. Een SPA bad is niet heel duur.
  • Zonnepanelen die (veel) meer dan voldoende energie leveren voor je huishouden. Dit is duur, maar je hebt dit voor ook andere reden.
  • Een thuisbatterij. Dit is duur, maar je hebt dit voor ook andere reden.
  • Véél isolatie voor je bad (gelukkig niet duur)
  • Teruggeven aan het net brengt maar weinig op en je kan niet terugdraaien met een oude meter (je hebt dus al zo’n digitale meter)
    • Dus we kunnen de energie maar beter zelf gebruiken

Allereerst moet je je SPA bad zoveel mogelijk isoleren. Kies ook een SPA bad met donkere kleuren. Zodat wanneer de zon schijnt, zoveel mogelijk warmte opgenomen wordt.

De bodem moet geïsoleerd zijn door bv. puzzelmatten onder je bad te leggen en eventueel ook andere isolatiematerialen. Het dun laagje isolatiemateriaal dat bij de goedkope SPA badjes zit is niet genoeg.

Je hebt bv. isolatiematten die onder parketvloeren gebruikt worden. Je kan niet teveel isoleren. Meer is altijd beter. De matten zullen het bad ook een zachtere bodem geven. Zonder de matten zal je zo’n 10% verliezen aan het opwarmen van de grond.

Je wil zeker ook een energiebesparende cover voor je SPA bad. Zonder die cover zal je zo’n 30% verliezen aan het opwarmen van de lucht. Zet je je bad binnen, dan heb je meteen een stevige electrische verwarming voor die kamer.

Het initieel vullen van je bad doe je best met warm water uit de kraan. Tenzij je dat water toch electrisch opwarmt natuurlijk. Dan maakt het weinig uit of je de pomp van het bad het laat doen of niet. 

Anders is de totale energie die daarvoor nodig is vrijwel niet of nooit haalbaar met de gehele dagopbrengst van je zonnepanelen. Denk eraan dat het water opwarmen een constant vermogen van 2 a 3 kW vraagt en dat je op die manier ongeveer één graad opwarmt per uur wanneer het bad vol is.

Dus een 8tal uren zon op je zonnepanelen warmt je bad ongeveer 8 °C op, misschien 10 °C. Misschien een beetje meer wanneer alles heel erg goed geïsoleerd is of wanneer je bad binnen staat? M.a.w. heb je dan meerdere dagen nodig of zal je s’nachts moeten doorverwarmen en zal je thuisbatterij niet opgeladen zijn. Dus koop je dan electriciteit van het net. Dat willen we niet.

De startup kostprijs is dus een volledig bad met warm water. Dat is niet weinig, dus je wil dat vermijden. Daarom ook moet je je filters goed proper houden (minimaal iedere drie dagen). Je gebruikt ook best chloortabletten en zorg ervoor dat de pH op 7,6 blijft. Je wil niet in vuil water zitten, toch?

De bedoeling is dat je het bad als een batterij bekijkt. Fysica vertelt ons dat het opgewarmde water ook net zo traag afkoelt als dat het opwarmt. Water houdt warmte goed vast. Daarom dus dat we zoveel aandacht schenken aan het isoleren van het bad. Zo wordt het een batterij.

Je wil waarschijnlijk rond 9 a 10 uur s’avonds je bad in. Tegen dan moet het dus 40 °C zijn. Het is een SPA. Dat moet goed warm zijn he.

Je wil het bad niet helemaal terug naar de omgevingstemperatuur laten vallen (tenzij het zomer en 40 °C is, maar dan wil je waarschijnlijk net kouder water). Dus heb je s’nachts je thuisbatterij nodig. Je houdt het bad na je gebruik s’avonds op ongeveer 35 °C. Door de isolatie zal je bad nu van ongeveer 40 °C terugvallen naar 35 °C rond 6 uur s’morgens. Dit hangt natuurlijk ook van de omgevingstemperatuur s’nachts af. Zonder isolatie is dat al rond 2 a 3 uur s’nachts en zal je thuisbatterij volledig opgebruikt worden.

Rond 9 uur s’morgens heb je (soms) terug zon. Dus kan je je zonnepanelen gebruiken om die 5 °C terug te winnen. Je wil ook wat van je thuisbatterij weer kunnen opladen zodat die thuisbatterij je SPA bad op temperatuur houdt gedurende de volgende nacht en s’avonds wanneer je er gebruik van wil maken.

Zonder thuisbatterij is het volgens mij niet mogelijk een SPA bad warm te houden zonder electriciteit van het net aan te kopen.

M.a.w. Gebruik best je wasmachine en droogkast wanneer het regent en de dag ervoor je thuisbatterij volgeladen werd en je in de regen toch geen gebruik van je bad wil maken.

ps. Witte wolken wil zeggen beetje energieopbrengst (nipt genoeg zelfs, hier in maart zo’n 1,5 kW). Donkere wolken is niks. Zonnig is uiteraard veel energieopbrengst (hier in maart soms 4 kW – 6 kW en meer).

ps. Een electrische wagen opladen en zo’n SPA bad warm houden beiden met zonnepanelen? Ik denk dat je dat kan vergeten. Tenzij je een heel groot dak hebt plus nog voetbalveld vol panelen en een thuisbatterij die meer dan een dure luxewagen kost.

Bankencrisis? Nee hoor

De oplossing voor Silicon Valley Bank is dat de FED eenvoudigweg die bank failliet laat gaan. Maar dat het alles van die bank één op één overneemt. Bij om het even wat: Decreet? Sure. Wet? Nog beter. Politiek akkoord? Ook goed. Het leger die de zaak overneemt met het geweer tegen de slaap? Desnoods wel ja.

Daarna verkoopt ze die papieren aan wie er interesse in heeft, of niet. Want de FED kan alles ook gewoon houden zoals het is. Zonder zich ook maar iets van de markt aan te trekken. Die markt denkt te vaak dat ze er echt toe doet. Ze doet dat niet zo veel. Veel minder dan ze zelf denkt.

Wat wel moet gebeuren, is dat Silicon Valley Bank failliet gaat. Dat al haar aandeelhouders alles kwijt zijn.

Dat reset de zaak. Dat is goed.

Strategische blunders

Ik denk nu niet dat het er toe doet dat ik het zeg of niet.

Maar het strategische belang is Avdiivka en niet Bakhmut.

Rusland neemt Bakhmut nog niet in voor een drietal Sun Tzu redenen:

  • Het houdt Oekraïne bezig met het sturen van reservetroepen en andere middelen die het daarom niet elders kan inzetten
  • Het houdt onze Westerse media als konijnen op een lichtdoos gefocust op dat wat er vooral niet toe doet
  • Het maakt het voor het Russische commando mogelijk om Wagner leeg te laten bloeden. Dat is nodig omdat Prigozjin bezig is met zijn reputatie.

Het boek Sun Tzu legt dit thans helder uit: What the ancients called a clever fighter is one who not only wins, but excels in winning with ease. Hence his victories bring him neither reputation for wisdom nor credit for courage.

Wat er strategisch wel toe doet is Avdiivka:

  • Het ligt vlak bij een grote hoofdstad van de Donbas, Donetsk
  • Meer in het Zuiden, waar duidelijk alle belangen en focus van Rusland liggen in dit conflict
  • Het is de start van de Noordflank voor dat Zuiden (want zulke flanken hoeven niet enkel West en Oost gemaakt te worden)

Maar wij Westerlingen zuigen onszelf leeg met onze eigen nonsense propaganda en beterweterigheid. Laten we nog wat naar Ursla haar rethoriek luisteren. Zij zal vast wel wat militaire inzichten hebben. Toch?

We zouden beter wat Sun Tzu lezen en begrijpen. Rusland kijkt meer en meer naar China, toch? Ik denk dat hun militair commando ook de Chinese oorlogsliteratuur goed gelezen heeft.

Ik denk dat ons Westers militair commando dat te weinig gelezen heeft. Of dat het vooral bezig is met zichzelf te verrijken door voor de oorlogindustrie opdrachten te verzilveren. Wat nu trouwens reeds nodig is. Uiteraard. Massaal zelfs.

Gecancelled

Bon, ik kan dus nu gecancelled worden omdat ik iets heb geschreven dat onze eigen strategie in vraag stelt en niet volledig alles wat Rusland doet probeert af te breken. Want dit moet tegenwoordig he. Introspectie gaat er volledig uit. Wij zijn heilig en goed. In alles wat we doen. Ook wanneer dat totale blunders zijn. Want de vijand is slecht. En zo. Want. Ja ja.

Die hele cancel-culture daarrond is trouwens ook een gigantisch strategische blunder van onszelf.

Meer haar op onze EU tanden

Op dit moment pleit ik er voor dat de EU lidstaten militariseren in gedachtegoed: dat we niet meer streven naar Europese vrede maar wel naar een positie waar we actief bereid zijn voor het fysiek uitvechten van een eventueel conflict. Met de daarbij horende militaire uitgaven en ontwikkelingen.

Bijvoorbeeld in Kosovo moeten we Servië duidelijk te maken dat we bereid zijn om ernstig in te grijpen, tot over de grens in hun land, en desnoods ook Belgrado zullen innemen.

Het is waarschijnlijk dat het Rusland’s strategie is om de VS haar militaire capaciteit uit te dunnen door dat conflict op de spits te drijven. Daarom moeten we als EU lidstaten Servië duidelijk maken dat wij dat zullen doen. Niet de VS. Daarom moeten wij daar onze EU soldaten stationeren. Zodat Servië klaar en duidelijk weet dat het tegen de rest van heel de Europese Unie zal vechten en dat dit tot en met de inname van hun hoofdstad zal zijn.

Uiteraard moeten we ook opnieuw al hun leiders die om het even welke oorlogsmisdaad plegen veroordelen in onze rechtbanken. Zonder meer maar ook vooral hun eerste minister en militaire leidinggevenden.

Ik zou het liever anders zien, maar het conflict in Oekraïne dwingt de EU lidstaten er toe om meer haar op hun tanden te hebben en dat haar nu ook echt te gebruiken.

OCR for your old scanner/printer’s E-mails

Yesterday I explained how to make a scrap computer do OCR on your scanner/printer’s scanned PDFs in case you have a SMB file share (a Windows file share) where the printer will write to.

I also promised I would make the E-Mail feature of the printer send E-mails with the PDFs in that E-mail being OCR scanned.

I had earlier explained how you can make your old scanner/printer support modern SMTP servers that have TLS, by introducing a scrap computer running Postfix to forward the E-mails for you. This article depends on that, of course. As we will let the scrap computer now do the OCR part. If you have not yet done that, first do it before continuing here.

I looked at Xavier Merten‘s CockooMX, and decided to massacre it until it would do what I want it to do. Namely call ocrmypdf on the application/pdf attachments and then add the resulting PDF/A (which will have OCR text) to the E-mail.

First install some extra software: apt-get install libmime-tools-perl . It will provide you with MIME::Tools, we will use MIME::Parser and MIME::Entity.

Create a Perl script called /usr/local/bin/ocrpdf.pl (chmod 755 it) that looks like this (which is Xavier’s CockooMX massacred and reduced to what I need – Sorry Xavier. Maybe we could try to make CockooMX have a plugin like infrastructure? But writing what looks suspicious to a database ain’t what I’m aiming for here):


#!/usr/bin/perl

# Copyright note

use Digest::MD5;
use File::Path qw(make_path remove_tree);
use File::Temp;
use MIME::Parser;
use Sys::Syslog;
use strict;
use warnings;

use constant EX_TEMPFAIL => 75; # Mail sent to the deferred queue (retry)
use constant EX_UNAVAILABLE => 69; # Mail bounced to the sender (undeliverable)

my $syslogProgram	= "ocrpdf";
my $sendmailPath	= "/usr/sbin/sendmail";
my $syslogFacility	= "mail";
my $outputDir		= "/var/ocrpdf";
my $ocrmypdf		= "/usr/bin/ocrmypdf";

# Create our working directory
$outputDir = $outputDir . '/' . $$;
if (! -d $outputDir && !make_path("$outputDir", { mode => 0700 })) {
  syslogOutput("mkdir($outputDir) failed: $!");
  exit EX_TEMPFAIL;
}

# Save the mail from STDIN
if (!open(OUT, ">$outputDir/content.tmp")) {
  syslogOutput("Write to \"$outputDir/content.tmp\" failed: $!");
  exit EX_TEMPFAIL;
}
while() {
  print OUT $_;
}
close(OUT);

# Save the sender & recipients passed by Postfix
if (!open(OUT, ">$outputDir/args.tmp")) {
  syslogOutput("Write to \"$outputDir/args.tmp\" failed: $!");
  exit EX_TEMPFAIL;
}
foreach my $arg (@ARGV) {
  print OUT $arg . " ";
}
close(OUT);

# Extract MIME types from the message
my $parser = new MIME::Parser;
$parser->output_dir($outputDir);
my $entity = $parser->parse_open("$outputDir/content.tmp");

# Extract sender and recipient(s)
my $headers = $entity->head;
my $from = $headers->get('From');
my $to = $headers->get('To');
my $subject = $headers->get('Subject');
chomp($from);
chomp($subject);

syslogOutput("Processing mail from: $from ($subject)");

processMIMEParts($entity);
deliverMail($entity);
remove_tree($outputDir) or syslogOuput("Cannot delete \"$outputDir\": $!");

exit 0;

sub processMIMEParts
{
  my $entity = shift || return;
  for my $part ($entity->parts) {
    if($part->mime_type eq 'multipart/alternative' ||
       $part->mime_type eq 'multipart/related' ||
       $part->mime_type eq 'multipart/mixed' ||
       $part->mime_type eq 'multipart/signed' ||
       $part->mime_type eq 'multipart/report' ||
       $part->mime_type eq 'message/rfc822' ) {
         # Recursively process the message
         processMIMEParts($part);
     } else {
       if( $part->mime_type eq 'application/pdf' ) {
         my $type = lc  $part->mime_type;
         my $bh = $part->bodyhandle;
         syslogOutput("OCR for: \"" . $bh->{MB_Path} . "\" (" . $type . ") to \"" . $bh->{MB_Path} . ".ocr.pdf" . "\"" );
         # Perform the OCR scan, output to a new file
         system($ocrmypdf, $bh->{MB_Path}, $bh->{MB_Path} . ".ocr.pdf");
         # Add the new file as attachment
         $entity->attach(Path   => $bh->{MB_Path} . ".ocr.pdf",
                         Type   => "application/pdf",
                         Encoding => "base64");
      }
     }
   }
   return;
}

#
# deliverMail - Send the mail back
#
sub deliverMail {
  my $entity = shift || return;

  # Write the changed entity to a temporary file
  if (! open(FH, '>', "$outputDir/outfile.tmp")) {
    syslogOutput("deliverMail: cannot write $outputDir/outfile.tmp: $!");
    exit EX_UNAVAILABLE;
  }
  $entity->print(\*FH);
  close(FH);

  # Read saved arguments
  if (! open(IN, "<$outputDir/args.tmp")) {
    syslogOutput("deliverMail: Cannot read $outputDir/args.tmp: $!");
    exit EX_TEMPFAIL;
  }
  my $sendmailArgs = ;
  close(IN);
	
  # Read mail content from temporary file of changed entity
  if (! open(IN, "<$outputDir/outfile.tmp")) {
    syslogOutput("deliverMail: Cannot read $outputDir/content.txt: $!");
    exit EX_UNAVAILABLE;
  }
	
  # Spawn a sendmail process
  syslogOutput("Spawn=$sendmailPath -G -i $sendmailArgs");
  if (! open(SENDMAIL, "|$sendmailPath -G -i $sendmailArgs")) {
    syslogOutput("deliverMail: Cannot spawn: $sendmailPath $sendmailArgs: $!");
    exit EX_TEMPFAIL;
  }
  while() {
    print SENDMAIL $_;
  }
  close(IN);
  close(SENDMAIL);
}

#
# Send Syslog message using the defined facility
#
sub syslogOutput {
  my $msg = shift or return(0);
  openlog($syslogProgram, 'pid', $syslogFacility);
  syslog('info', '%s', $msg);
  closelog();
}

Now we just do what Xavier’s CockooMX documentation also tells you to do: add it to master.cf:

Create a UNIX user: adduser ocrpdf

Change the smtp service:

smtp      inet  n       -       -       -       -       smtpd
-o content_filter=ocrpdf

Create a new service

ocrpdf  unix  -       n       n       -       -       pipe
user=ocrpdf argv=/usr/local/bin/ocrpdf.pl -f ${sender} ${recipient}

OCR for your old printer/scanner

Modern printers can do OCR on your scans. But as we talked about last time, aren’t all printers or scanners modern.

We have a scrap computer that is (already) catching all E-mails on a badly configured local SMTP server, to then forward it to a well configured SMTP server that has TLS. Now we also want to do OCR on the scanned PDFs.

My printer has a so called Network Scan function that scans to a SMB file share (that’s a Windows share). The scrap computer is configured to share /var/scan using Samba as ‘share’, of course. The printer is configured to use that share. Note that you might need in smb.conf this for very old printers:

client min protocol = LANMAN1
server min protocol = LANMAN1
client lanman auth = yes
client ntlmv2 auth = no
client plaintext auth = yes
ntlm auth = yes
security = share

And of course also something like this:

[scan]
path = /var/scan
writable = yes
browsable = yes
guest ok = yes
public = yes
create mask = 0777

First install software: apt-get install ocrmypdf inotify-tools screen bash

We need a script to perform OCR scan on a PDF. We’ll here use it in another script that monitors /var/scan for changes. Later in another post I’ll explain how to use it from Postfix’s master.cf on the attachments of an E-mail. Here is /usr/local/bin/fixpdf.sh:

! /bin/sh
a=$1
TMP=`mktemp -d -t XXXXX`
DIR=/var/scan
mkdir -p $DIR/ocr
cd $DIR
TIMESTAMP=`stat -c %Y "$a"`
ocrmypdf --force-ocr "$a" "$TMP/OCR-$a"
mv -f "$TMP/OCR-$a" "$DIR/ocr/$TIMESTAMP-$a"
chmod 777 "$DIR/ocr/$TIMESTAMP-$a"
cd /tmp
rm -rf $TMP

Note that I prepend the filename with a timestamp. That’s because my printer has no way to give the scanned files a good filename that I can use for my archiving purposes. You can of course do this different.

Now we want a script that monitors /var/scan and launches that fixpdf.sh script in the background each time a file is created.

My Xerox WorkCentre 7232 uses a directory called SCANFILE.LCK/ for its own file locking. When it is finished with a SCANFILE.PDF it deletes that LCK directory.

Being bad software developers the Xerox people didn’t use a POSIX rename for SCANFILE.PDF to do an atomic write operation at the end.

It looks like this:

inotifywait -r -m  /var/scan | 
while read file_path file_event file_name; do
echo ${file_path}${file_name} event: ${file_event}
done
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/XEROXSCAN003.LCK event: CREATE,ISDIR
/var/scan/XEROXSCAN003.LCK event: OPEN,ISDIR
/var/scan/XEROXSCAN003.LCK event: ACCESS,ISDIR
/var/scan/XEROXSCAN003.LCK event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/XEROXSCAN003.PDF event: CREATE
/var/scan/XEROXSCAN003.PDF event: OPEN
/var/scan/XEROXSCAN003.PDF event: MODIFY
/var/scan/XEROXSCAN003.PDF event: MODIFY
...
/var/scan/XEROXSCAN003.PDF event: MODIFY
/var/scan/XEROXSCAN003.PDF event: MODIFY
/var/scan/XEROXSCAN003.PDF event: CLOSE_WRITE,CLOSE
/var/scan/XEROXSCAN003.PDF event: ATTRIB
/var/scan/XEROXSCAN003.LCK event: OPEN,ISDIR
/var/scan/XEROXSCAN003.LCK/ event: OPEN,ISDIR
/var/scan/XEROXSCAN003.LCK event: ACCESS,ISDIR
/var/scan/XEROXSCAN003.LCK/ event: ACCESS,ISDIR
/var/scan/XEROXSCAN003.LCK event: ACCESS,ISDIR
/var/scan/XEROXSCAN003.LCK/ event: ACCESS,ISDIR
/var/scan/XEROXSCAN003.LCK event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/XEROXSCAN003.LCK/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/XEROXSCAN003.LCK/ event: DELETE_SELF
/var/scan/XEROXSCAN003.LCK event: DELETE,ISDIR

The printer deleting that SCANFILE.LCK/ directory is a good moment to start our OCR script (call it for example /usr/local/bin/monitorscan.sh):

! /bin/bash
inotifywait -r -m -e DELETE,ISDIR /var/scan |
while read file_path file_event file_name; do
if [ ${file_event} = "DELETE,ISDIR" ]; then
if [[ ${file_name} == *"LCK" ]]; then
suffix=".LCK"
filename=`echo ${file_name} | sed -e "s/$suffix$//"`.PDF
/usr/local/bin/fixpdf.sh $filename &
fi
fi
done

Give both scripts 755 permissions with chmod and now you just run screen /usr/local/bin/monitorscan.sh

When your printer was written by good software developers, it will do POSIX rename. That looks like this (yes, also when done over a SMB network share):

inotifywait -r -m  /var/scan | 
while read file_path file_event file_name; do
echo ${file_path}${file_name} event: ${file_event}
done
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/ event: OPEN,ISDIR
/var/scan/ event: ACCESS,ISDIR
/var/scan/ event: CLOSE_NOWRITE,CLOSE,ISDIR
/var/scan/.tmp123.GOODBRANDSCAN-123.PDF event: CREATE
/var/scan/.tmp123.GOODBRANDSCAN-123.PDF event: OPEN
/var/scan/.tmp123.GOODBRANDSCAN-123.PDF event: MODIFY
...
/var/scan/.tmp123.GOODBRANDSCAN-123.PDF event: MOVED_FROM
/var/scan/GOODBRANDSCAN-123.PDF event: MOVED_TO

That means that your parameters for inotifywait could be -r -m -e MOVED_TO and in ${file_name} you’ll have that GOODBRANDSCAN-123.PDF. This is of course better than Xerox’s way with their not invented here LCK things that probably also wouldn’t be necessary with a POSIX rename call.

I will document how to do this to the E-mail feature of the printer with Postfix later.

I first need a moment in my life where I actually need this hard enough that I will start figuring out how to extract certain attachment MIME parts from an E-mail with Posix’s master.cf. I guess I will have to look into CockooMX by Xavier Mertens for that. Update: that article is available now.

.

Aankondigingspolitiek en dan daarna

Na meer dan een half jaar geshockeerd toe te kijken hoe onze Europese leiders de éne na de andere aankondigingspolitiek deden zonder wat dan ook substantiëels te doen, lijkt de politieke klasse in de Europese wijk in Brussel eindelijk te zijn wakker geschoten.

Dat Rusland tegensancties zou doen nadat wij letterlijk hun nationale reserves afnamen, was verdomd voorspelbaar en kei hard al vanaf half februari een gegeven dat zeker was.

Dat het Russisch gas uiteindelijk zou afgesloten worden was klaar en duidelijk. Hoeveel gas het was was klaar en duidelijk. Dat de godganse Europese economie dan op haar gat zou gaan, was klaar en duidelijk.

We vinden het allemaal heel erg prettig om nu een beetje met Duitsland te staan lachen. Maar heel erg binnenkort zal jouw baan, die afhankelijk is van de Duitse industrie (denk er maar eens twee keer over na), verdwijnen. Het zal gedaan zijn met lachen terwijl je gigantisch hoge energiefacturen mag betalen.

Allemaal klaar en duidelijk. Crystal helder.

Maar wat deden de jongens en meisjes in de Europese wijk te Brussel daar aan? Helemaal niets.

Aankondigingspolitiek. Populistisch zijn. Dissidenten verketteren: was je tegen sancties, dan was je voor Putin. Alsof dit enkel Putin is en niet de gehele elite in Het Kremlin. Enkelen werden zelfs afgedreigd. Ja toch wel ja. WIJ zijn aan het afglijden naar fascisme en censuur. Heel erg duidelijk.

Maar als je je economie in oorlog zet tegen Rusland, dan hoor je ook voorbereid te zijn. Dat zijn en dat waren wij niet. Totaal niet.

De populistische aankondigingspolitiek van het afgelopen jaar zal er voor zorgen dat onze Europese economie gewoon de grond ingeboord zal worden.

We hadden intelligente sancties kunnen bedenken. Maar dat was niet straf genoeg. We hadden kunnen gaan onderhandelen met Rusland. Maar dan werd je verketterd.

Of is dat niet waar? Zie dan naar Macron die probeerde en telkens door de roeptoeters verketterd werd.

Maar zie hoe Erdogan het wel doet en daarmee zijn Turkije helemaal op de kaart heeft gezet. Hoe de hele West-Europese wereld in het conflict van Oekraïne er letterlijk gewoon niet toe doet. Maar Turkije helemaal wel.

Onze Westerse leiders zijn een bende populistische Twitter-accounts maar dan zonder eigen leger. Ze zijn dus niets. Niets dat er toe doet.

Wij hebben géén strategie. Dat zijn wij helemaal verleerd. We schipperen rond op populisme en het om ter hardst roepen. Ik bedoel, tweeten.

En dat, dat werkt niet in oorlogstijden.

Belgian blue stone with white stains.

Here’s a scenario: ten years ago, you renovated your bathroom. As a shower, you chose a walk-in shower with a Belgian blue stone which is porous and is a limestone.

That’s why you have to be careful with products like Antikal. Because they will react with the lime in your limestone. In other words, you have to rinse away the excess Antikal quickly.

But you’re a computer geek and because you have a piece of software that you programmed and are already thinking about, you sometimes forget this.

Thus, a drop of Antikal remains on your blue stone.

A few hours later, that drop became a white stain. Which now really seems to be inside your stone.

Unfortunately, it really is. No matter what you try, it cannot be scrubbed off. Unless you let a professional come and polish a layer off of your stone (which costs about 800 euros, by the way).

Unfortunately, not much later the stains come back. Because the stains are deep in your stone and the reaction ‘continues’. That was 800 euros for a few weeks’ peace of mind.

Now what?

Of course you buy a whole gang of HG products such as HG blauwesteen reiniger, HG grafsteenreiniger and HG natuursteen kleurvlekkenverwijderaar.

You spray it on, let it soak in for half an hour; a little of the stains are now indeed better. But not really.

What actually worked better was the Mr. Proper Magic sponge. That sanded the top layer of that white stain away a bit.

But what worked best after that was a coat of Moeller Stone Care HMK P333 Hardsteenolie.

Your Belgian Blue stone will become a Belgian dark blue stone. But the stains (which I had first rubbed out with the Mr. Proper Magic sponge) are less visible and seem to belong to the stone’s natural life.

Then, after two full days letting the stuff get impregnated, a sticky top layer appeared. I had probably used a little too much of that stuff.

But another heavy treatment with the whole gang of HG products, such as HG blauwesteen reiniger, HG grafsteenreiniger and HG natuursteen kleurvlekkenverwijderaar (all at the same time and soak for half an hour) followed by rubbing hard with an iron sponge, and the sticky top layer is gone.

The stone is actually quite beautiful now. Dark blue.

De helaasheid der dingen

Zoals altijd zijn we als EU of Europa achtergesteld omdat we geen enkel militair antwoord hebben op de zaken die geostrategisch gaande zijn.

Voor Ukraine kunnen we weinig tot niets doen omdat we geen enkel antwoord hebben op de vraag ‘vanwaar komt het gas dan wel?’

Deze vraag is te belachelijk simpel en toch kan geen enkel EU politicus ze beantwoorden.

Nochtans was het antwoord hierop haalbaar: men had werk kunnen maken van alternatieve energiebronnen. Maar dat vonden de heren en dames EU-politici niet nodig. Overbodig. En zo verder.

M.a.w. zijn ze volstrekt incompetent. Ik schrijf ze effectief volledig af. Want ze hadden daar wel een antwoord op moeten kunnen formuleren. De idioten die er nu nog zitten kunnen dat niet. Daarom zijn het losers en daarom horen we ze te ontslaan uit hun functie. Helaas zijn het ook populisten en daarom zal hun ontslag vele jaren duren (zie Brexit).

Richting Taiwan doen de EU politici alweer hun belachelijke best om wat dan ook te betekenen. Maar iets betekenen doen ze helemaal niet. Ze doen niets dat er toe doet.

Omdat ze collectief besloten hebben geen EU-leger te hebben.

Daarom zijn ze onbelangrijk. Insignificant. Incompetent. Onbelangrijk.

We moeten

Een eigen Europees leger starten. Waarbij ieder Europees land haar eigen expertise in de groep werpt.

Afspraken maken met Rusland over de energievoorziening van Europa.

Een nieuw veiligheidspakt met Rusland maken opdat er zo weinig mogelijk conflicten in Europa zullen zijn.

Machtsprojectie doen vanuit Europa, met het Europees leger. We moeten opnieuw leren wat het is om aan geostrategie te doen. We moeten dat Europees leger durven inzetten om onze strategische doelen te behalen. We moeten niet verlegen zijn om de wereld duidelijk te maken dat wij zulke strategische doelen hebben.

Het conflict in Oekraïne beïndigen. Want het dient ons (Europeanen) en Russen niet. We zijn beiden benadeeld door dit conflict. We hebben er beiden baad bij om dit te beïndigen.

Durven praten over Europa en niet enkel over de Europese Unie.

Going around media bans

For the people who want to know how to get around the ongoing media bans:

Do a Google search and type in ‘free ssh country‘. Use as ‘country‘ the country where the media is that you want to reach. Take the first hit. Create the SSH tunnel account that is freely available.

In a console (if you don’t have SSH, you can install it with for example Git Bash, Cygwin, etc on Windows. You can also use Putty of course – make a SOCKS tunnel). Note that the username and hostname will be different (the website will tell you).

ssh -D 1337 -q -C -N user-vpnthathost.com@countryNr.thathost.com

For Firefox: Settings->Network Settings [Settings]->Manual Proxy configuration. Type next to SOCKS Host: localhost, and next to Port: 1337. Next check ‘Proxy DNS when using SOCKS v5’. You have equivalent settings in Chrome and Chromium among other browsers.

There are many options as VPN service. You can also search with Tor-browser if you think the secret services want to kill you or something. It’s not very likely, though. But if you are paranoid, then I guess sure.

Tor-browser itself might by the way also work just fine.

How to make a movie from the history of wikipedia images

Install some software

apt-get install imagej wget imagemagick bash

Get a JSON with all the versions of a image on Wikipedia

Let’s assume you want to watch how the invasion in Ukraine took place. That’s this one:

https://en.wikipedia.org/w/api.php?action=query&titles=File%3A2022_Russian_invasion_of_Ukraine.svg&prop=imageinfo&iilimit=999&iiprop=%7Curl&format=json

We only need the URL, so iiprop=|url. If you need the timestamp (when was the image file made) then use iiprop=|url|timestamp. A list of them you can find here.

You can use wget or in your browser just do save file as (use RAW data at the top then, for example in Firefox).

Fetch the images

#! /bin/bash

mkdir svg
cd svg
ITEMS=`cat api-result.json | jq '.query.pages."-1".imageinfo | .[] | .url'`
for a in $ITEMS
do
wget "$a"
sleep 1
done

Convert them to PNGs:

Normally they are already in the right order. So no renaming should be needed. Else you have to add to the iiprop of the query ‘timestamp’ and then with jg you extract that from the JSON to for example add it somehow to the filenames.

Or just use touch to change the file’s last modification date after wget fetched it and then here you use UNIX find to loop in the right order, and write PNG files like 0001.png, 0002.png, etc.

#! /bin/bash
cd ..
mkdir png
for a in svg/*
do
# You can come up with a better translation for the filename
b=`echo $a | sed s/svg//g`
convert -density 250 -size 1546x1038 $a png/$b.png
done

Convert PNGs to a movie

  • Start imagej
  • File > Import > Image Sequence
  • Select the png directory where the images where converted to
  • File -> Save As -> AVI -> fill in 2 frames per second -> movie.avi

Convert into fake-news, propaganda, etc

  • Use another software to insert dramatic background music
  • Upload to youtube for fame and fortune or whatever
  • Buy likes, become a hipster, convert from hipster to influencer

Nobody moves, nobody gets hurt

Maar toch. Start dat EU-leger nu maar.

Het volgende conflict, in Oekraïne, staat voor de deur. De West-Europese landen gaan zich weer volstrekt belachelijk maken, en hebben zich reeds volstrekt belachelijk gemaakt.

Het is tijd dat we stoppen met de schoothond van de VS en NAVO te zijn, en dat we als de EU een eigen leger hebben dat deel uit maakt van NAVO en dat op termijn de noodzaak van het bestaan van NAVO opheft.