Een liefdesbrief aan de Super Dimension Fortress
Maar wat is SDF? Om dat te beantwoorden moeten we vier decennia teruggaan en praten over het BBS-tijdperk.
Bulletin Board Systems
Het is 16 juni 1987. Ted Uhlemann ("iczer") sluit het 300-baud[1] modem van een Apple IIe aan op een telefoonlijn die zijn moeder hem net voor zijn verjaardag had gegeven. Hij draait Magic City Micro-BBS (geschreven in Applesoft BASIC). Hij noemt het SDF-1, naar zijn favoriete anime, in de hoop fans van "anime, industriële muziek en de Church of the SubGenius" aan te trekken, aldus een retrospectief ter gelegenheid van het 30-jarig bestaan door Stephen Jones. De oorspronkelijke hardware bestond uit één 1200bps modem en twee diskettestations van elk 280 kilobyte.
Dit was het prille begin van SDF.
SDF omschrijft zichzelf als "een community-platform voor het inspireren, faciliteren en implementeren van nieuwe ideeën". Het is een multi-user NetBSD-machine, uitsluitend gefinancierd door zijn leden als een 501(c)(7) non-profit organisatie, waar tienduizenden mensen een account hebben. De naam is afgeleid van de anime Super Dimension Fortress Macross (in het Westen bekend als onderdeel van Robotech), en het systeem begon als een BBS voor fans van Japanse anime. Het BBS-tijdperk van SDF is te zien in de achtdelige documentaire uit 2004 op YouTube getiteld BBS: The Documentary, waarin onder andere een interview is opgenomen met Stephen Jones, de langdurige sysadmin van SDF.
Bulletin Board Systems gingen vooraf aan het moderne internet en maakten persoonlijke computers waarschijnlijk van dure curiositeiten tot veel populairdere machines. BBS-systemen waren degene die pc's in de jaren 80 en begin jaren 90 veranderden in essentiële poorten voor wereldwijde en lokale communicatie. Ze waren het bewijs dat de computer bedoeld was om contact te leggen met andere mensen.
Er bestonden destijds geen zoekmachines, dus je moest in computertijdschriften of tekstbestanden van andere boards zoeken om een BBS te vinden. Een "website-adres" was een lokaal telefoonnummer met zeven cijfers. Je opende een terminalprogramma op je computer en typte een commando om je modem naar het telefoonnummer van de BBS te laten bellen. Omdat het je vaste telefoonlijn gebruikte, kon niemand in huis bellen terwijl je online was. Je hoorde de computer fysiek het nummer draaien, gevolgd door het iconische, harde gekrijs en de statische ruis van twee modems die met elkaar communiceerden.
Op het hoogtepunt van de populariteit waren er meer dan 150.000 BBS-systemen actief in Noord-Amerika. Tegen 2005 waren er nog maar een paar honderd over.
In een interview met bsdtalk uit 2006 vatte een langdurig lid samen wat de plek zo bestendig maakt: "SDF is meer dan een shell-account; het is een gemeenschap van mensen die met elkaar communiceren via de verschillende methoden die SDF biedt... Wat SDF speciaal maakt, is dat het wordt beheerd als een computeromgeving uit de begindagen van het internet. Het is totaal niet corporate."
Een onderzoek uit 2019 van een universiteitsonderzoeker naar publiek toegankelijke UNIX-systemen, History, Evolution and Future of Public Access UNIX (gehost op SDF zelf), beschrijft het moderne systeem als "een volledig uitgebouwde sociale gemeenschap". De auteur voegt toe dat SDF speciale interessegroepen ondersteunt voor hamradio (SDFARC), Python, Gopher-enthousiastelingen en Minecraft-spelers, naast "digitale kunstenaars, computerhistorici, webontwikkelaars, gamers en natuurlijk zeer veel programmeurs." De eigen picturale tour van SDF documenteert de hardware jaar na jaar terug tot 1985, inclusief een periode in een telefoonmuseum en de machines die vandaag de dag draaien.
Tegenwoordig omvat het netwerk NetBSD-servers op DEC Alpha- en AMD Opteron-hardware, plus live retrocomputing-omgevingen: een TOPS-20 systeem (twenex.org, draaiend op Panda Distribution TOPS-20 op twee XKL TOAD-2's), een Symbolics Genera-machine en een ITS-systeem. Gratis accounts zijn beschikbaar op al deze systemen.
In de afgelopen vier decennia heeft SDF hardwarestoringen, talloze DDoS-aanvallen, beëindiging door de eigen ISP en meerdere verhuizingen binnen de Verenigde Staten overleefd. Het is nooit commercieel geworden, noch is het in die tijd zijn gebruikersbestand verloren. Jones, die SDF na decennia nog steeds beheert, schreef in zijn brief ter gelegenheid van het 30-jarig bestaan: "Sommige mensen zullen ons vandaag de dag misschien als verouderd en 'retro' beschouwen. Maar als je betrokken raakt, zul je zien dat het zeer levendig is met nieuwe ideeën."
Diensten aangeboden door SDF
SDF is een lange weg afgelegd sinds de BBS-dagen, hoewel het nog steeds een van de weinige plekken is die gratis dial-up toegang biedt. Wanneer je lid wordt van SDF, krijg je toegang tot veel diensten—vergelijkbaar met een Tildeverse- of omg.lol-account, maar SDF ging aan beide vooraf.
Je begint in de shell. Met het commando ssh you@tty.sdf.org kom je terecht in NetBSD met standaardhulpmiddelen zoals bash, ksh, tcsh, rc en zsh; editors van ed tot emacs; en tools zoals ping, traceroute, dig, whois en finger.
Je krijgt je eigen webpagina. Het uitvoeren van mkhomepg in de shell maakt een ~/html map aan en vraagt welke URL je wilt. Je voegt je bestanden toe in ~/html en de site is onmiddellijk live op you.sdf.org. ARPA-leden kunnen een vanity-domein kiezen uit ongeveer 60 opties (pdp10.org, twenex.org, chaosnet.org, freak.net, multics.org...). Zie wiki.sdf.org voor de lijst. CGI werkt direct uit de doos. Shell/awk/sed is voor iedereen beschikbaar, en volledige php/perl/python/ruby voor ARPA-leden.
De Gopher- en Gemini-protocollen worden door SDF-gebruikers doorgaans vaker gebruikt. Voer mkgopher uit in de shell en kies setup. Er wordt een ~/gopher map aangemaakt (een symlink naar /ftp/pub/users/you) die wordt geserveerd als zowel gopher://sdf.org/1/users/you als gemini://sdf.org/users/you. Eén directory, twee protocollen! Je kunt een gophermap schrijven of .gmi-bestanden toevoegen.
En dat is slechts het topje van de ijsberg:
| Dienst | Locatie |
|---|---|
| IRC | irc.sdf.org:6667 |
| Jabber/XMPP | jabber.sdf.org |
| Matrix | matrix.sdf.org |
| Gitea | git.sdf.org |
| Mastodon | mastodon.sdf.org |
| PixelFed | pixelfed.sdf.org |
| PeerTube | toobnix.org |
| TT-RSS | ttrss.sdf.org |
| Lemmy | lemmy.sdf.org |
| Gallery | sdf.org/g |
| Deskshots | deskshots.org |
| Jitsi | jitsi.sdf.org |
| aNONradio | anonradio.net |
| Minecraft | mc.sdf.org |
| BZFlag | sdf.org:5154 |
| SDFMud | sdf.org/mud |
| TOPS-20 | twenex.org |
Hoe lid te worden
Oorspronkelijk was de enige manier om lid te worden van SDF en geverifieerd te worden, het fysiek versturen van één dollar naar hun postbus in Seattle, samen met je gebruikersnaam. Dit was een slimme manier om spam en misbruik te voorkomen. Tegenwoordig kun je gelukkig gewoon doneren via Paypal, wat het hele proces een stuk gemakkelijker maakt.
Een van de coolste dingen aan SDF is volgens mij het levenslange ARPA-lidmaatschap. Voor een eenmalige vergoeding van $36 USD krijg je:
- Uitgaande tools: telnet, ssh, sftp, ftp, snarf, wget, ytalk, externe IRC. Gratis accounts zijn alleen inkomend; ARPA opent het netwerk in beide richtingen.
- Bestandsoverdracht: scp/sftp en niet-interactieve SSH:
ssh-copy-idis ingeschakeld. - Ontwikkeling: gcc, perl, php, python, ruby, elisp op de box.
- Volledige CGI: php/perl/python/ruby op je site.
- VoIP: internetbellen, voicemail, conferenties (PSTN-bellen is een add-on van $15 per kwartaal met een optie voor een echt DID-nummer).
- UUCP + ClariNET: mail en nieuwsfeeds via TCP of dial-up.
- Stemrecht: over systeemfuncties en beleid.
- Quota: ca. 150 MB / 5000 bestanden per stuk voor home, mail, webspace en gopherspace.
Niet alleen krijg je dit alles voor het leven, maar je ondersteunt ook een genetwerkte gemeenschap die al langer bestaat dan ikzelf!
Bonus: Een Perl CGI-gastenboek maken op SDF
Vroeger schreef je, om functionaliteit aan je website toe te voegen, scripts die via het Common Gateway Interface (CGI) protocol communiceerden met een webserver. In de late jaren 90 en vroege jaren 2000 was dit de primaire technologie om het World Wide Web te transformeren van statische HTML-pagina's naar dynamische, interactieve websites.
Helaas worden ze in de moderne webontwikkeling niet veel meer gebruikt en worden ze als verouderd beschouwd. Traditionele CGI start namelijk een volledig nieuw besturingssysteemproces voor elke klik van een bezoeker. Op drukke websites verbruikten ze enorme hoeveelheden servergeheugen en vertraagden ze de prestaties aanzienlijk.
Maar wanneer je een kleine persoonlijke website maakt, kunnen zaken als "schaalbaarheid" en "efficiënt gebruik van resources" overboord worden gegooid! Omdat ik als ARPA-lid toegang heb tot Perl CGI, besloot ik een simpel gastenboek te maken op mijn kleine SDF-webpagina. Zo heb ik het aangepakt:
1. SDF-directories begrijpen
In SDF is de root van je webpagina de ~/html directory, maar dat is niet je home-directory. Het is een symlink naar /www/<a>/<b>/<username> (de bovenliggende directories zijn afgeleid van je gebruikersnaam, dus die van mij is /www/af/b/bren). Je echte home-directory bevindt zich op een plek als /sdf/arpa/af/b/bren. Je wilt je databestand niet in de publiek toegankelijke ~/html map plaatsen, waar een bezoeker het direct kan opvragen. Houd het één niveau hoger, buiten de web-root:
/sdf/arpa/af/b/bren/guestbook.dat$\leftarrow$ databestand, NIET web-toegankelijk/www/af/b/bren/guestbook.cgi$\leftarrow$ het script zelf, bevindt zich in~/html
Daarnaast is $ENV{HOME} niet ingesteld wanneer je CGI-script draait onder suexec, dus je kunt niet vertrouwen op relatieve paden zoals ~ binnen het script. Ik heb daarom het absolute pad naar het databestand hardcoded.
2. Het script schrijven
Hiervoor gebruik ik core Perl en Fcntl voor file locking (voor het geval twee bezoekers tegelijk tekenen). Het script leest $ENV{REQUEST_METHOD}, parseert de POSTed form body handmatig (geen CGI.pm, dat is deprecated), valideert de lengte van de naam/bericht en voegt een regel toe aan het bestand:
#!/usr/pkg/bin/perl
use strict;
use warnings;
use Fcntl qw(:flock);
my $DATA_FILE = "/sdf/arpa/af/b/bren/guestbook.dat";
sub add_entry {
my ($name, $message, $url) = @_;
my $ts = scalar localtime;
my $enc_message = $message;
$enc_message =~ s/\\/\\\\/g;
$enc_message =~ s/\n/\\n/g;
open(my $fh, '>>', $DATA_FILE) or return;
flock($fh, LOCK_EX);
print $fh join("\x01", $ts, $name, $enc_message, $url) . "\n";
flock($fh, LOCK_UN);
close($fh);
}
Elke vermelding is een enkele regel: tijdstempel $\x01$ naam $\x01$ bericht $\x01$ url. Hierbij wordt het ongebruikte $\x01$ controlekarakter gebruikt als scheidingsteken, wat ervoor zorgt dat namen of berichten met normale leestekens de parsing niet verstoren. Nieuwe regels in een bericht worden bij het wegschrijven ontsnapt met een letterlijke \n en bij het lezen weer ontsnapt, waardoor meerregelige berichten ook als enkele regels worden opgeslagen.
Er is ook een honeypot-veld, website, dat met CSS voor bezoekers verborgen is. Als dit is ingevuld, wordt de inzending genegeerd, maar de robot ziet nog steeds een "Bedankt voor het tekenen!".
3. Het databestand beveiligen
Omdat het databestand op een plek moet staan waar Apache toegang tot heeft, voeg ik een .htaccess toe in ~/html:
<Files "guestbook.dat">
Order allow,deny
Deny from all
</Files>
4. Uploaden en uitvoerbaar maken
SDF vereist dat CGI-scripts (1) eindigen op .cgi en (2) uitvoerbaar zijn. Er is geen vereiste voor een cgi-bin directory, dus het kan overal in ~/html worden geplaatst:
scp guestbook.cgi bren.sdf.org:html/
ssh bren.sdf.org
chmod 755 html/guestbook.cgi
mkhomepg -p
mkhomepg -p zal de rechten van je homepage correct resetten naar de door SDF verwachte veilige standaardwaarden.
5. Bezoeken
Dat is alles! guestbook.cgi rendert dezelfde pagina voor zowel GET (het tonen van het formulier en de laatste 50 vermeldingen) als POST (het valideren en opslaan van een nieuwe vermelding). Er is geen database, framework of build-proces. Het is een beetje krakkemikkig naar 2026-standaarden, en ik hou ervan.
Bonus: Een Dillo-compatibele website maken
Tot slot werd ik geïnspireerd door een blogpost van Sunny over positieve, door mensen gemaakte software, waarin de internetbrowser Dillo werd genoemd.
Vroeger, toen mijn enige computer een pijnlijk trage Intel Core 2 Duo was, herinner ik me dat ik zocht naar lichtgewicht browsers om websurfen minder pijnlijk te maken. Dillo is er zeker een van! De codebase is momenteel 0,2% van de grootte van die van Chromium en het geheugengebruik is belachelijk laag.
Onverwacht gaat dat gepaard met een prijs. Veel van het web wordt niet correct weergegeven of functioneert niet in Dillo vanwege de beperkingen. Maar voor mij is dat juist een feature. Een van de beste manieren om ervoor te zorgen dat onze webpagina's de "smol web"-principes respecteren en dat de broncode gemakkelijk leesbaar is voor beginners, is door onze sites Dillo-compatibel te maken.
Wat betekent dit concreet?
Dillo ondersteunt een subset van HTML 4.01 met enkele HTML5-elementen, en een subset van CSS 2.1 met enkele CSS3-elementen. JavaScript wordt helemaal niet ondersteund.
<script>en alle inline event handlers (onclick, etc.) worden genegeerd.frameset/frame/iframehebben geen rendering-ondersteuning.- Er is geen ondersteuning voor
<canvas>, video, audio, source, embed of object playback. - Wat betreft CSS en stijlen: er is geen ondersteuning voor CSS-variabelen (
var()). Er is ook geen flexbox en geen CSS grid; grid-regels worden simpelweg genegeerd. Je zult je layouts moeten maken met (help) tabellen enfloat. - Er zijn geen aangepaste webfonts via
@font-face, aangezien lettertypen worden opgelost naar de vijf generieke CSS-families: serif, sans-serif, monospace, cursive en fantasy. Deze worden ingesteld in dedillorcconfiguratie van de gebruiker. Dillo kan geen specifieke webfont-bestanden laden.
Neem dit met een korreltje zout, aangezien ik geen canonieke compatibiliteitstabel kon vinden. De Dillo-ontwikkelaars communiceren via de handleiding, de changelog en de bugtracker.
Conclusie
Het is grappig: hoe meer ik leer over webontwikkeling, hoe simpeler en meer "terug in de tijd" ik ga. Ik denk dat dit logisch is—goede code is onopgeblazen code. Hoe dichter je bij "geen interface" kunt komen, hoe beter de interface. Het is een wonderlijk paradoxaal aspect van programmeren en werken met computers. Dit zullen altijd machines zijn met eindige limieten—net als wij—en we moeten ons daar niet alleen bewust van zijn, maar er juist op inspelen.
***
[1] De baudrate van een terminal is de snelheid waarmee een hardwareterminal of seriële console communiceert, gemeten in het aantal signaalwijzigingen (symbolen) dat per seconde wordt verzonden. Bij 300 baud toont een terminal 30 tekens per seconde. Dit is ongeveer de snelheid van een snelle typist. In plaats van dat tekst onmiddellijk verschijnt, kun je de letters één voor één, regel voor regel, op het scherm zien verschijnen.
Groetjes,