De afgelopen dagen ben ik wat aan het knutselen geraakt met de programmeertaal NodeJS. Bij Olisto wordt vrijwel alles in deze taal geschreven en recent had ik de behoefte om een intern hulpmiddel voor onze helpdesk wat te verbeteren. Omdat al onze ontwikkelaars druk bezig zijn met de app zelf, besloot ik de mouwen op te stropen en zelf aan de slag te gaan. Met een doorklik-abonnement op Stack Overflow ben ik behoorlijk ver gekomen wat er weer toe leidde dat ik een lang gekoesterde wens voor deze blog toch eens aan wil pakken…
Waarschuwing vooraf: In het vervolg van deze blogpost komen veel afkortingen, programmeertermen en jargon voorbij. Mocht je het niet allemaal snappen, Duck Duck Go is je vriend!
Linkdump al de links!
Vanaf de begindagen van mijn blogcarrière heb ik de (eigenwijze?) behoefte om allerlei sites, artikelen en andere links te delen op mijn blog. Op mijn eerste blog Punkey.com waren de blogposts vaak niet langer dan een gemiddelde tweet en door de jaren heen heb ik altijd wel een blog gehad waar ik vanalles deelde. In plaats van het schrijven van langere blogposts zoals deze, deelde ik liever wat ik zoal tegenkwam.
Je bent wat je deelt.
Echter, met dit huidige blog doemde er nieuwe uitdagingen. Ik kom op allerlei plaatsen boeiende links tegen en dat zorgt voor het probleem waar ik het centraal kan opslaan. Daar zou deze blog natuurlijk ideaal voor zijn, volgens de Indieweb-gedachte. Ik heb al sinds jaren een Pinboard account, daar moet ik toch een koppeling kunnen maken met dit blog? De dienst komt met een uitgebreid systeem van RSS feeds, zodat ik behoorlijk nauwkeurig kan kiezen wat ik hier wil delen en met welke tekst. Maar tegelijk kom ik in mijn RSS reader zoveel boeiends tegen. Nu heeft Inoreader de mogelijkheid om iets te broadcasten waarmee ik zelf een korte tekst kan toevoegen aan een item wat ik wil delen. Dat heeft eveneens een eigen RSS feed.
Er is echter een klein probleem. Dit blog heeft geen ingebouwde mogelijkheid om relatief eenvoudig dit soort links te delen. Zeker al niet via mobiel. Dus ik moet een omweg bedenken. Nu is dat geen probleem, het is zo’n vraagstuk waar je je eigen oplossing voor kunt bedenken, ontwikkelen en uitvoeren. Ik heb nu het volgende in gedachte:
- Ik deel iets op Pinboard of Inoreader met een speciale tag en tekst
- Op een eigen server hou ik deze RSS feeds bij
- Als er een nieuw item verschijnt in de feeds, zorg ik dat deze omgezet wordt in een artikel voor dit blog
- Op gezette tijden publiceer ik automatisch een nieuw link-item op dit blog.
Wat betekenen deze stappen? En hoever ben ik?
Stap voor stap
Stap 1 is niet zo lastig. Zowel op Pinboard als Inoreader kan ik eenvoudig nieuwe items opslaan en delen. Dit kan ik mobiel en op de desktop. Voor Pinboard heb ik een fijn script gemaakt met de app Workflow, zodat ik uit vrijwel elke andere app een link kan opslaan op Pinboard. Daarmee is het direct beschikbaar via de RSS feed. Inoreader heeft recent de mobiele app geupdate en het is nu nog eenvoudiger om blogposts te taggen en te delen.
Stap 2 is al spannender. En daar ben ik deze dagen mee bezig geweest. Ik ben inmiddels zover dat ik lokaal een script heb draaien wat (nu nog handmatig) de RSS feeds van Pinboard en Inoreader leest en de individuele items opslaat. Ik heb hiervoor veel gebruik gemaakt van scripts die Dave Winer al heeft gemaakt rondom RSS, OPML en NodeJS. Het is voor mij enorm leerzaam om te begrijpen hoe dit soort zaken werken. En ik vind het gewoon leuk.
Stap 3 en 4, daar moet ik nog aan beginnen. Dit blog is opgebouwd in de taal Jekyll. Ik schrijf Markdown bestanden, een soort versimpelde Word bestanden, en daarmee kan ik dit blog voorzien van nieuwe artikelen. Het mooie is dat de opmaak vrij eenvoudig is én dat alle blogposts als statische bestanden zijn weggeschreven. Dit gebeurt allemaal met templates die relatief eenvoudig zijn te maken. Dat betekent dat ik bij een nieuw gedeeld item, zo’n template bestand moet vullen met informatie uit die RSS feed en zo een nieuw artikel samenstel. Klinkt ingewikkeld, om het te maken is het ook niet makkelijk, maar als het eenmaal werkt zal ik me hoogstwaarschijnlijk afvragen waarom ik zo lang bezig was met zo’n relatief simpele oplossing. De vierde stap is een voorzorgsmaatregel van mezelf. Ik lees veel in de ochtenden en avonden en dat zou betekenen dat er op die momenten vrij veel ineens wordt gedeeld op dit blog. Ik spreid het liever wat uit over de dag, dus ga ik er nog voor zorgen dat al die vooraf samengestelde posts netjes klaar staan om op bepaalde tijdstippen te worden gepubliceerd.
De wegen naar Rome
Maar klinkt dat niet erg als een wiel opnieuw uitvinden? In blogservices als WordPress zit dit allemaal ingebakken en heb je het vrij eenvoudig werkend. Dat klopt en het klinkt wat stupide om dit allemaal zelf te gaan doen. Maar het is een hobby. En hobbies zijn soms wat stupide. Ik heb niet de ambitie om WordPress na te maken, evenmin dat ik mijn uiteindelijke oplossing schaalbaar wil maken voor anderen. Ik probeer het wel zo te ontwikkelen dat anderen er eventueel op kunnen voortborduren. Tegelijk weet ik dat bij het zien van mijn code er al tientallen andere manieren zijn om doen wat ik wil doen.
Zo kwam ik er vanavond al achter dat Dave Winer een Github-repository heeft genaamd DaveReader, wat voor een groot deel al de onderdelen heeft die ik nodig heb. Zoals het beheer van bron-feeds, het periodiek uitlezen van deze feeds en er acties op ondernemen. Tegelijkertijd heeft het veel overhead zoals een interface om de feeds te lezen en een uitgebreide opslagstructuur voor alle feeds. Dat is weer iets wat ik niet nodig heb. Dus ga ik dan toch overstag en hack ik mijn eigen ideeën in de DaveReader of ga ik nog even door met mijn eigen oplossing?
Ik probeer nog even wat door te knutselen met mijn eigen oplossing. Je kunt al een beetje meekijken via Github, waar ik de code heb geplaatst. Veel werkt echter nog niet echt goed en is nog uitzoekwerk voor me. Maar het begin is er.
Hoofdbrekens
Waar ik nu over pieker zijn de volgende stappen:
- Hoe sla ik zo handig mogelijk in een lokaal bestand de opgehaalde items op? Ik wil liever niet met databases gaan werken vanwege de extra overhead voor iets relatief simpels als dit.
- Sla ik het op als Array, als Object of als JSON file? Welk formaat past het beste bij wat ik uiteindelijk voor ogen heb?
- Hoe zorg ik dat ik nieuwe te delen items netjes aan dit bestand toevoeg zonder oude items er dubbel in te zetten?
- Hoe word de logica om op gezette tijden (via een cronjob?) het oudste item uit de lijst te halen en om te zetten in een draft post voor mijn blog?
- Hoe publiceer ik het op mijn blog? Ik schijn bij Github met webhooks te kunnen werken. Nog nooit gedaan, dus hoe zit dat?
- Als ik dit allemaal voor elkaar heb, kan ik het dan nog eenvoudiger maken en toch alles in eigen beheer hebben in plaats van gebruik te maken van een andere dienst?
En waarom deed ik al weer? O ja, om mezelf wat NodeJS te leren, om te snappen hoe ik mijn eigen scripts kan maken en met name om boeiende artikelen en links hier te delen. Eigenlijk wil ik de aloude Leesmap weer wat liefde geven, zonder dat het een verplichting wordt elke week.
Al met al is het een leuk project voor mezelf. Ik leer er wat mee programmeren, ik begrijp iets beter hoe een moderne taal als NodeJS in elkaar zit en het geeft me de voldoening dat ik niet compleet afhankelijk ben van een andere dienst als ik iets wil maken voor mijn eigen gebruik.
Punkrock Publishing dus!