LaTeX-cursus Deel 5 in de praktijk: een eigen inleveropgaveklasse

\LaTeX kan veel beter overweg met formules dan Word of LibreOffice. Desalniettemin kan het veel werk zijn om lange uitwerkingen van inleveropgaven te \TeX-en. Het loont daarom om een eigen klasse te schrijven met daarin jouw meest gebruikte commando’s.

Om een eigen klasse te maken maak je een nieuw document met de extensie .cls. Bovenaan zet je welke versie van \LaTeX wordt gebruikt wordt. Dit doe je met \NeedsTeXFormat{LaTeX2e}, omdat je waarschijnlijk geen versie van voor 1994 wilt gebruiken. Om de computer te vertellen welke klasse je eigenlijk aan het maken bent, zet je daaronder ProvidesClass{opgave}. Deze twee commando’s zijn al genoeg voor een \LaTeX-klasse, maar we hebben er nog niet zoveel aan. Dit kunnen we verbeteren door de functionaliteit van een andere klasse te importeren. Sommige inleveropgaven zijn zo lang, dat het lijkt alsof ik een heel artikel moet schrijven, dus laten we de \article-klasse laden met \LoadClass[a4paper, 11pt]{article}. We zijn nu klaar om onze eigen inleveropgaveklasse te hekken.

In de mathmode maakt \LaTeX alle letters cursief en haalt alle spaties weg. Dit is meestal wat je wilt, maar dit betekent ook dat de ‘d’ in een differentiaal ($\text{d}x$) wat hulp nodig heeft om een mooie rechte ‘d’ te worden. Dit kan vervelend zijn met een tekst met veel integralen. Dit kan sneller met een eenvoudig nieuw commando: \newcommand{\dd}{\textbackslash,\text{d}}. Iedere keer als er \dd in een wiskundeomgeving staat, wordt er een korte spatie geplaatst: \, en en rechte ‘d’: \text{d}.

Met \newcommand kunnen ook parameters worden toegevoegd. Om snel een gemiddelde of een verwachtingswaarde in de tekst te zetten kun je het volgende definiëren:

\newcommand{\mean}[1]{\ensuremath{\left< #1 \right>}}

Hierin geeft [1] het aantal inputvelden van het nieuwe commando aan. Dat wil zeggen het aantal keer dat we iets achter het commando tussen accolades kunnen zetten. #1 is de parameter van het eerste inputveld. Dat is in dit geval makkelijk, want er is er maar één. Zo wordt \mean{x}: ⟨x⟩. Als je een commando definieert, weet je niet zeker of de gebruiker in mathmode is. Daarom is \ensuremath handig voor het maken van eigen commando’s, omdat \ensuremath een wiskundeomgeving start vanuit een tekstomgeving en in de wiskundeomgeving blijft als het wordt aangeroepen vanuit een wiskundeomgeving.

Een voorbeeld van wat ik vaak in \LaTeX schrijf, zijn afgeleiden. Het vervelende aan afgeleiden is dat er steeds breuken moeten worden geschreven en superscripten voor de hogere afgeleiden. Ik wil een commando \afg maken, waarmee ik:

  • De differentiatieoperator $\tfrac{\partial}{\partial t}$ krijg, als ik één parameter invul: \afg{t}
  • De afgeleide $\tfrac{\partial f}{\partial x}$ krijg als ik twee parameters invul: \afg{f}{x}
  • De ne afgeleide kan instellen met een optionele parameter tussen blokhaken: \afg{f}{x}[2]

Dit commando is makkelijker te maken met \NewDocumentCommand dan met \newcommand, omdat ik mijn commando wil ‘overloaden’. Dat wil zeggen dat ik andere dingen wil doen afhankelijk van het aantal opgegeven parameters. \NewDocumentCommand is onderdeel van de xparse-package. De xparse-package maakt het mogelijk om commando’s te maken met \LaTeX\ 3 in \LaTeX\ 2. Packages in een .cls-bestand laad je met \RequirePackage. Op deze manier kun je ook de preamble een stuk korter maken door je standaardpackages op deze manier in te laden, omdat je deze packages ook kunt gebruiken in jouw inleveropgave. \NewDocumentCommand ziet er als volgt uit:

\NewDocumentCommand{\mijnCommando}{opties voor parameters}{body}

De body werkt net zoals in \newcommand, maar voor de parameters zijn andere opties dan in \newcommand. Met de laatste kan men alleen tussen blokhaken het aantal parameters aangeven dat in het nieuwe commando gebruikt wordt, maar in \NewDocumentCommand is het een verplicht veld. Hierin wordt op volgorde van parameters #1 t/m #n met een letter aangegeven of het een optionele of verplichte parameter is[1]:

  • m van ‘mandatory’: geeft een verplicht veld aan, dus tussen accolades.
  • o van ‘optional’: geeft een optioneel veld aan, dus tussen blokhaken.
  • g van ‘overloaded’: geeft een optioneel veld aan, maar tussen accolades.

Het gebruik van g maakt het de gebruiker duidelijker dat de output van het commando anders kan reageren op het gebruiken van dit commando. Je ziet bij mijn eisenlijst dat de betekenis van het eerste inputveld verandert bij het toevoegen van een tweede parameter. Eerst staat de eerste parameter #1 onder de deelstreep en na het toevoegen van een tweede parameter staat #1 boven de deelstreep:
\afg{t} wordt:   \tfrac{\partial}{\partial t}
en   \afg{f}{x} wordt:   \tfrac{\partial f}{\partial x}
Het definiëren van afg ziet er als volgt uit:

\NewDocumentCommand{\afg}{mgo}{body}

Het aanroepen wordt dan:

\afg{#1 mandatory}{#2 overloaded}[#3 optional]

Ik mis nu slechts nog één detail: \LaTeX weet nog niet wat te doen met al onze mooie parameters. In de body kunnen we gebruik maken van IfValueTF. Wat dit doet is eenvoudig:

\IfValueTF{#n}{voer uit als #n bestaat}{voer uit als #n niet bestaat}

Dit kunnen we gebruiken voor zowel onze ‘overloaded’ als voor onze optionele parameter gebruiken. Voor de liefhebbers staat hieronder het commando voor de partiële afgeleide.

\NewDocumentCommand{\afg}{mgo}{
    \ensuremath{
        \IfValueTF{#3}{
            \IfValueTF{#2}{
                \frac{\partial^{#3} #1}{\partial #2^{#3}}
                }
                {
                \frac{\partial^{#3}}{\partial #1^{#3}}
                }
        }
        {
            \IfValueTF{#2}{
                \frac{\partial #1}{\partial #2}
            }
            {
                \frac{\partial}{\partial #1}
            }
        }
    }
}

Met de hierboven beschreven methoden kun je al ver komen met een eigen klasse, maar het zou leuk zijn, als je de nieuwe klasse ook met parameters kunt aanroepen. Dit kun je doen met DeclareOption:

\DeclareOption{parameter}{voer uit als 'parameter' is gegeven}

Je kunt op deze manier ook booleans uit of aan zetten, zodat je in het hele document deze parameter kunt gebruiken. Een voorbeeld waarmee je dit misschien wil doen, is de taal van het document. Als deze klasse wordt aangeroepen met \documentclass[english]{opgave} wil je de optie ‘english’ meegeven aan babel, maar ook, als je een kop- of voettekst hebt gedefinieerd, ‘Aantal pagina’s’ veranderen in ‘Number of pages’. Booleans kun je maken met het ietwat vreemde \newif[2]. Een voorbeeld van \newif is:

\newif\ifengels\engelsfalse

\DeclareOption{english}{\engelstrue}

Dit maakt een boolean \ifengels aan. Door daarna \engelsfalse te gebruiken wordt deze op ‘false’ gezet. \newif\ifengels maakt namelijk zelf \engelsfalse en \engelstrue aan. \DeclareOption{\engelstrue} zet \ifengels alleen op ‘true’, als deze klasse wordt aangeroepen met \documentclass}[english]{opgave}. Deze boolean kunnen we vervolgens gebruiken in een if-blok dat de taaloptie in babel stopt. Dit if-blok wordt afgesloten met \fi.

\ifengels\RequirePackage[english]{babel}
\else\RequirePackage[dutch]{babel}
\fi

Om te controleren of alle pagina’s compleet zijn, kan het handig zijn om op de eerste pagina te zetten hoeveel pagina’s er in totaal zijn. Dit kan met de packages fancyhdr en lastpage. Omdat we dit ook af en toe niet willen, is het handig dit alleen te doen, als er een optie ‘totpag’ in de klassenaanroep is meegegeven. Voor een tweede optie in documentclass gaat dit op dezelfde manier als in het vorige voorbeeld:

\newif\iftotpag\totpagfalse
\DeclareOption{totpag}{\totpagtrue}

Als iftotpag ‘true’ is, wordt de header weergegeven. Dit kan misschien het beste door de ‘fancypagestyle‘ van \maketitle aan te passen. Als \maketitle wordt aangeroepen, gebruikt de titelpagina de \fancypagestyle{plain}. Door deze aan te passen, kunnen we een header krijgen rechtsboven op de titelpagina.

\iftotpag
\fancypagestyle{plain}{
    \ifengels
    \fancyhead[R]{Number of pages: \pageref{LastPage}}
    \else
    \fancyhead[R]{Aantal pagina's: \pageref{LastPage}} 
    \fi
}
\fi

Tot slot wil ik nog code geven om de overgebleven opties van de klassenaanroep aan de article}-klasse te geven:

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions

Dit zet je voor \LoadClass[a4paper,11pt]{article}.

Veel plezier met \TeX-en en een gezegend 2016.

\end{document}

[1]  Er zijn veel meer opties dan deze drie. Zie de documentatie van xparse op CTAN.
[2]  Meer TeX-commando’s, die ook worden gebruikt in de A–Eskwadraat-packages kun je vinden op https://en.wikibooks.org/wiki/LaTeX/Plain\_TeX

IBA Verklaart ssh

Al sinds de beginjaren van het internet werden er applicaties gemaakt om in te kunnen loggen op andere computers vanaf je eigen computer. Neem bijvoorbeeld programma’s zoals telnet en rsh (als deze programma’s je niks zeggen, wees gerust, we zullen ze niet behandelen). Echter, de bestaande programma’s hadden niet genoeg beveiliging en waren vatbaar voor bijvoorbeeld wachtwoordsniffers. Daarom besloot Tatu Ylönen in 1995 om een beter programma te maken voor het inloggen op andere computers en hij doopte het programma ‘ssh’ (secure shell). Al vanaf het begin bleek ssh populair en tegenwoordig is het niet meer weg te denken in de wereld van Linux en Macs en wordt het gebruikt om veilig bestanden over te sturen, applicaties op een andere computer te draaien en nog veel meer. Windowsgebruikers moeten zich nog wenden tot andere applicaties om hetzelfde doel te bereiken (denk bijvoorbeeld aan PuTTY) maar Microsoft heeft in 2015 aangekondigd dat het ssh in toekomstige generaties van Windows gaat integreren.

Hoe werkt ssh dan precies, vraag je je misschien af. Laten we eens gaan kijken wat er allemaal gebeurt als je een ssh-connectie probeert op te zetten. Het eerste wat je doet is verbinding maken met de ssh-poort op de ssh-server (meestal poort 22). Op dit moment krijgt de client (dat is de computer vanaf waar je connectie maakt) twee dingen toegestuurd: de protocolversie en de ssh-versie van de server. Als de client het protocol ondersteunt, kunnen ze verder. Op dit moment gaan zowel de client als de server over op een Binair Package Protocol, dat betekent dat de pakketjes die overgestuurd worden nu 32 bits groot zijn. De server stuurt nu zijn publieke sleutel (het publieke deel van de asymmetrische versleuteling, maar dat is weer een verhaal voor een andere keer), 8 willekeurige bits die de client moet terugsturen als antwoord en tenslotte alle soorten encryptie die ondersteund worden. Nu maakt de client een symmetrische sleutel aan en stuurt deze sleutel ook naar de server. Deze sleutel wordt gebruikt om de data die over de ssh gestuurd wordt te versleutelen. Merk natuurlijk wel op dat deze sleutel eerst versleuteld wordt met de publieke sleutel van de server. Ook geeft de client op dit moment aan welke versleutelingsmethode hij gebruikt voor het versleutelen van de data. Als laatste stap wacht de client op een bevestiging van de server. Deze bevestiging is uiteraard versleuteld met de symmetrische sleutel die de client heeft aangemaakt en is belangrijk voor de client; dit is namelijk nu de enige manier om te weten of de client met dezelfde server praat als waar hij net mee heeft gecommuniceerd, dit om zeker te zijn dat er niet iemand is die met alles loopt te rommelen om zo je geheime data te achterhalen. Als dit allemaal goed is gegaan kunnen de client en de server versleuteld en veilig met elkaar babbelen en kan je gaan inloggen op de server.

Dit is natuurlijk een hoop informatie om in 1 keer te bevatten, dus we gaan nu kijken wat er gebeurt als je vanaf thuis bij \aesnaam gaat inloggen. Je probeert dan dus vanaf thuis met poort 22 op de A-Eskwadraatserver te verbinden. Het eerste wat je tegenkomt is de router. De router zorgt voor poortforwarding. Dat houdt in dat de router een lijstje heeft staan met welke poortverbinding hij moet doorsturen naar welke poort op welke machine. Daar staat bijvoorbeeld dat als je op poort 22 probeert te verbinden, de router je doorstuurt naar poort 22 op de ssh-extern-machine van A-Eskwadraat, paul. Vervolgens maak je dus verbinding met poort 22 op paul en treedt het standaard ssh-protocol in werking. In de router staan echter nog meer regels, zo kan je bijvoorbeeld verbinding maken met poort 32022 om op de workstation dennis uit te komen. Probeer het zelf ook eens uit, Linux- en Mac-gebruikers kunnen het commando ssh gebruiken:

ssh [username]@a-eskwadraat.nl -p 32022

Windowsgebruikers kunnen als ze putty gebruiken in putty selecteren met welke poort ze verbinding willen maken.
Natuurlijk wordt de poortforwarding voor veel meer gebruikt dan alleen ssh, denk aan mail of een http-request, maar dat is een verhaal voor een andere keer!

IBA Verklaart POST Requests

Zo rond het begin van de jaren negentig kwam Tim Berners-Lee op het idee van het WereldWijde Web. Alle informatie op de wereld wordt daarmee aan elkaar gekoppeld met behulp van pagina’s die links bevatten naar andere pagina’s. Met een browserprogramma dat HTTP (Hypertext Transfer Protocol) spreekt, kan iedereen deze pagina’s ophalen van servercomputers die over de hele wereld verspreid zijn. Meer dan twintig jaar later is het principe van het web nog ongeveer hetzelfde gebleven, maar dan compleet anders opgevat. Pagina’s zijn geen statische documenten meer die ergens op een harde schijf staan, maar interactieve programma’s die doen alsof ze statische documenten zijn die ergens op een harde schijf staan. Daarbij komt nog aardig wat kijken.

Lees verder IBA Verklaart POST Requests

IBA Verklaart Achievements

Zoals velen van jullie al is opgevallen heeft de A–Eskwadraatwebsite sinds kort achievements voor alle ingelogde leden. Natuurlijk is het leuk om zoveel mogelijk achievements te verzamelen maar sommigen zijn misschien wel benieuwd hoe dat nou allemaal in z’n werk gaat, al die achievements.

Achievements kunnen we opdelen in twee categorieën, eenmalige achievements en de zogenaamde ‘medaille’-achievements. Voor eenmalige achievements hoeft 1 bepaalde actie 1 keer uitgevoerd te worden en bij medaille-achievements wordt je voortgang in een teller bijgehouden en er zijn oplopende drempelwaarden voor het halen van elk level van de achievement.

Voor elke eenmalige achievement houden we in een functie bij hoe de achievement gehaald kan worden. Op het moment dat een pagina geladen wordt kijken we of er een achievement gehaald is. Al onze pagina’s op de website worden met een speciale end-functie afgesloten. Aan deze end-functie is nu toegevoegd dat voor het lid dat ingelogd is de achievements gechecked worden. Als er nieuwe achievements zijn, worden deze met javascript bovenaan de pagina weergegeven. De achievementschecker wordt pas bij het afsluiten van de pagina aangeroepen, omdat als de functie bij het begin de pagina zou staan, zou het langer duren voordat de gebruiker een pagina te zien krijgt.

De check voor de medaille-achievements werkt net iets anders. Die functie ziet er als volgt uit:

static public function checkBSGPBadge($badgeNaam, Persoon $pers, $setlast = true)
{
    global $BADGES;

    $badgesBSGP = $BADGES['bsgp'];

    if(array_key_exists($badgeNaam, $badgesBSGP)) {
        $badge = $badgesBSGP[$badgeNaam];

        if($badge['multi'] == 'long') {
            $multiplier = array(1, 2, 5, 10);
        } elseif($badge['multi'] == 'short') {
            $multiplier = array(1, 2, 3, 4);
        }

        foreach($multiplier as $multi) {
            $res = PersoonBadge::badgeBSGPCount($badgeNaam, $pers);
            if($res &gt;= $badge['value'] * $multi) {
                $persoonBadges = $pers-&gt;getBadges();
                $persoonBadges-&gt;addBadge($badgeNaam . '_' . ($badge['value'] * $multi), $setlast);
            }
        }
    } else {
        user_error("Badge " . $badgeNaam . " bestaat niet!");
    }
}

Eerst wordt er gekeken of de achievement die je wilt controleren (variabele $badgeNaam) wel bestaat in de lijst met bestaande achievements. Dan zijn er twee soorten medailleachievements: short en long. De long-achievements hebben als vermenigvuldigingsfactor 1, 2, 5 en 10 voor brons, zilver, goud en A–Eskwadraat respectivelijk en de short hebben als vermenigvuldigingsfactor 1, 2, 3 en 4. Dan wordt er voor iedere vermenigvuldigingsfactor gekeken of het resulterende getal de drempelwaarde overschrijdt.

Om een zo breed mogelijk aanbod aan achievements te kunnen doen en makkelijk nieuwe achievements te kunnen toevoegen worden de achievements in een json-string opgeslagen. Hier kan je zien wat er gebeurt als er een nieuwe achievement wordt toegevoegd bij een gebruiker:

public function addBadge($badge, $setlast = true)
{
    $badges_json_string = $this-&gt;getBadges();
    $last_json_string = $this-&gt;getLast();
    
    $badges = json_decode($badges_json_string);
    $last = json_decode($last_json_string);
    
    if(sizeof($badges) != 0 &amp;&amp; in_array($badge, $badges)) {
        return;
    }   
    
    $badges[] = $badge;
    
    if($setlast) {
        if(sizeof($last) == 0 || (sizeof($last) != 0 &amp;&amp; !in_array($badge, $last))) {
            $last[] = $badge;
        }   
    }   
    
    $badges_json_string = json_encode($badges);
    $this-&gt;setBadges($badges_json_string);
    
    if(sizeof($last) != 0) {
        $last_json_string = json_encode($last);
        $this-&gt;setLast($last_json_string);
    }   
    
    $this-&gt;opslaan();
}

Je kan zien dat eerst de huidige json-string met achievements opgehaald wordt uit het $this-object. Als de achievement al bij de gebruiker staat doen we natuurlijk niets. Dan wordt aan de gedecodeerde json-string (die nu een array is) de nieuwe achievement toegevoegd. Dit wordt dan vervolgens weer als een json-string opgeslagen. Alles met $last in de bovenstaande functie wordt gebruikt om op te slaan wat de nieuwe achievements van de gebruiker zijn sinds de gebruiker voor het laatst is ingelogd.

Dit geeft je een klein beetje een idee hoe de achievements op de A–Eskwadraatsite werken. Heb je zelf nog goede ideeën voor leuke achievements, voel je vrij om ze te melden in de IBA-chat of op Bugweb!

IBA Verklaart Eigen Commando’s in de Notulen class

Vandaag zullen we het hebben over het toevoegen van nieuwe commando’s in \text{\LaTeX} en hoe je deze handig in de notulen class, waarschijnlijk het meest gebruikte A-Eskwadraat package, kan gebruiken.

De meesten van jullie zullen wel eens notulen hebben moeten uitwerken en hebben dat dan ook hopelijk met ons notulen package gedaan. Voor een volledige documentatie over de notulen klas kijk je op de site van de TeXniCie: https://www.a-eskwadraat.nl/Vereniging/Commissies/hektex/packages, hier staat alle documentatie voor packages die door actieve leden vaak worden gebruikt.

Een van de commando’s die in de notulen class staat is het commando naam. Dit zorgt er simpelweg voor dat een naam wat duidelijker (schuin) wordt weergegeven. Dit kan handig zijn als je de notulen wilt doorzoeken op personen. Nu wil je natuurlijk niet de hele tijd \naam{persoon} gaan typen, dat zou veel te veel werk zijn, dus daar gaan we mooi een commando voor aanmaken.

Schrik niet als je nog nooit zelf commando’s hebt gemaakt, dit keer zullen we het heel simpel houden. Als je wat verder wilt gaan kun je op onze site kijken bij de cursus. Commando’s maak je met het commando \newcommand{}{}. Dit zet je in de preambule (het stuk voor je \begin{document}) van je document. Dan zet je in het eerste hokje het naam van je command en in het tweede wat het command doet.

Om snel een naam te kunnen typen kun je bijvoorbeeld de eerste twee letters van de persoon nemen en dit dan een commando maken. Een voorbeeldje stel je wilt Kaj-Ivar noemen, dan maken we daar het commando \ka voor aan: \newcommand{\ka}{\naam{Kaj-Ivar}}. Als we dit uitvoeren krijgen we het volgende:

\text{Kaj-Ivarwas niet helemaal nuchter tijdens het maken van de notulen.}

Dit lijkt al aardig te werken, maar in de tekst staan Kaj-Ivar en was nu aan elkaar geplakt omdat latex geen spatie ziet. Dit zou je kunnen oplossen door \newcommand{\ka}{\naam{Kaj-Ivar} \ } te gebruiken en dat werkt al heel aardig:

\text{Kaj-Ivar was niet helemaal nuchter tijdens het uitwerken van de notulen.}

Er is echter nog een klein probleempje, namelijk als een naam een zin eindigt, dan komt er gewoon een spatie tussen de naam en de punt:

\text{Ja dat is Kaj-Ivar .}

Daarvoor hebben we het mooie commando \xspace. Dit commando zorgt ervoor dat er een spatie komt te staan, maar alleen als je hem wilt. Dus als na je woord een leesteken zet komt er geen spatie. De laatste versie van ons mooie commando is dus \newcommand{\ka}{\naam{Kaj-Ivar}\xspace}, wat precies doet wat je wilt. Merk op dat dit commando prima samenwerkt met \ap{}, dus je kan het ook prima gebruiken in actiepunten.

Dit idee kun je natuurlijk ook toepassen op andere dingen als een naam. Wil je bijvoorbeeld een inleveropgave kwantummechanica uitwerken dan zul je vast 100 keer het woord Schrödingervergelijking typen. Dan lijkt het handig om het commando \newcommand{\sch}{Schr\"odingervergelijking\xspace} aanmaken. Dat kan veel schrijfwerk schelen. Of wat dacht je van \newcommand{\R}{\mathbb{R}\xspace}. De mogelijkheden om te experimenteren zijn eindeloos…

IBA Verklaart Router

Naast de verschillende servers en workstations die A-Eskwadraat heeft is er nog een cruciaal onderdeel binnen het netwerk, de router. De router is de spin in ons netwerk. Hij bepaalt welke diensten beschikbaar zijn en hoe je die kunt benaderen.

Besturingssysteem

Tot voor kort draaide de router binnen ons netwerk op OpenBSD. Hoewel er voordelen zijn om OpenBSD te draaien op een router, te noemen makkelijke firewall configuratie en veiligheid, zijn er ook nadelen. De nadelen zijn onder andere de lastige manier van updaten, wat voor een router van zeer groot belang is. Doordat updaten zeer lastig is komt de veiligheid in het geding, vooral met de vele beveiligingslekken in onder andere SSL de laatste tijd. Daarom zijn we als sysop al langere tijd bezig met een vervangend systeem, dat goed aansluit bij de andere systemen die we gebruiken en dus ook CentOS draait.

Firewall

Binnen besturingssystemen zitten firewalls, deze zijn er om de veiligheid van een netwerk te bewaren. Daarbij is de router de eerste beveiliging tussen de grote boze buitenwereld en het interne netwerk van A-Eskwadraat. OpenBSD heeft een zeer mooie manier om een firewall te configureren, waarbij de configuratie leesbaar is voor de beheerders (pf). Iedere regel beschrijft zeer duidelijk wat er gebeurt. Bij andere systemen is dit over het algemeen lastiger te lezen. Zo ook bij een GNU/Linux systeem, daarbij zijn er vele mogelijkheden om je firewall te configureren. Deze vertalen echter altijd naar regels in iptables die het systeem uitleggen wat er wel en niet door mag naar het interne netwerk. Met het nieuwe systeem maken we gebruik van shorewall (wat voor de oud-sysoppers bekend zou moeten zijn, omdat deze ook op de oude server max gebruikt werd).

Reverse Webproxy

Naast dat het besturingssysteem een probleem begon te worden, waren er ook al langer problemen met enkele van de programma’s die we gebruikten op de router. Een van de belangrijke programma’s op de router is een zogenaamde ‘Reverse Webproxy’, dit is te vergelijken met een webserver die webpagina’s beschikbaar maakt. Hierbij worden de webpagina’s echter niet op de router gemaakt, maar wordt het werk uitbesteed naar andere webservers. Dit heeft als voordeel dat er gebruik gemaakt kan worden van veel verschillende webservers die allemaal hun eigen afgezonderde taak hebben. Bij OpenBSD hadden we voor de Reverse Webproxy een programma genaamd squid. Squid is speciaal ontwikkeld voor gebruik als proxy en heeft als extra optie de mogelijkheid tot reverse proxy. Deze heeft nagenoeg altijd zijn functie goed gedaan, maar door de grote en ingewikkelde configuratie die we gebruikten werd het steeds ingewikkelder om aanpassingen aan de configuratie te doen. Aanpassingen zijn nodig als er een nieuwe website of feature toegevoegd moest worden. Daarnaast begon de beveiliging ook een steeds groter probleem te worden. Hierdoor zijn we voor het nieuwe systeem overgegaan op Nginx, dit is een volwaardige webserver die zeer geschikt is voor gebruik als reverse webproxy. De configuratie heeft ook voordelen, doordat iedere site in zijn eigen bestand opgeslagen kan worden.

15 april 2015

Binnen sysop hadden we besloten dat het tijd werd om het router-migratie-project, wat al langere tijd nagenoeg klaar was, tot een einde te brengen. De router stond al langere tijd klaar om operationeel te gaan, en de voorganger te vervangen. 15 april was het dan eindelijk zo ver en zou de router overgezet worden. Echter zoals vele projecten gaat er wel eens wat mis. Naast de grote hoeveelheid testen die we hebben gedraaid waren er toch nog enkele grote problemen toen we daadwerkelijk het systeem gingen overzetten. Enkele cruciale functies van de firewall werkten niet naar behoren terwijl die tijdens het testen wel werkten. Daardoor is op het laatste moment besloten om alle wijzigingen terug te draaien en de problemen op een later tijdstip op te lossen.

The day after

Een dag later zijn er testen gedaan met een andere manier van firewall configureren. Deze werkte naar behoren waarop besloten werd om nogmaals (vanaf thuis) de router over te zetten. Naast dat dit vanaf thuis een riskante bezigheid is, je zit namelijk van buiten het netwerk het netwerk aan te passen, verliep de overzetting zeer goed. Er waren nog enkele problemen die binnen zeer korte tijd op te lossen waren. Daardoor draait nu het A-Eskwadraat netwerk met de nieuwe router-configuratie en zijn de voordelen zeer duidelijk zichtbaar. Een van de belangrijkere voordelen zijn de betere https-veiligheid (zie bug #5577) en de integratie met de andere sysop-systemen.

*update Technische uitleg te vinden op de A-Eskwadraat wiki

IBA Verklaart extra LaTeX meukbestanden

Menigeen persoon die weleens een TeX bestand heeft omgezet naar een PDF bestand zal zich verwonderd hebben over allerlei extra bestanden die ontstaan bij het generen van de PDF. Bestand.log? Bestand.aux? Hier heb ik toch niet om gevraagd? Klopt. Maar LaTeX heeft ze beiden nodig om zijn werk te doen!

.tex bestand.

Dit is je standaard bestand waar je in werkt. Als je niet weet wat bestand op je computer doet raad ik je aan de LaTeXcursus te volgen.

.pdf bestand.

Het gegenereerde PDF bestand is het bestand wat je uiteindelijk wil hebben. Deze wordt dus niet geklassificereerd onder “Extra meukbestanden.”

.log bestand.

LaTeX werkt met een compiler. Al je .tex code wordt gecompileerd en de output hiervan wordt in de PDF gezet. Tijdens het compileren kan er van alles misgaan. Bij de meeste LaTeX editors krijg je een waarschuwing te zien als er iets misgaat, en een foutmelding als het helemaal niet meer te redden valt. Bij de meeste problemen is de foutmelding die je gelijk te zien krijgt al genoeg om het probleem op te lossen. Bij ingewikkeldere fouten bied het .log bestand uitkomst. Hier wordt alles opgeslagen wat de compiler tegenkomt aan fouten bij het compileren. (Het vergt nog enige kunst om de .log bestanden te kunnen begrijpen, maar dat is een ander verhaal 😉 )

.aux bestand.

Aaah het infameuze .aux bestand. De LaTeX compiler kan een .tex file maar één keer lezen, van boven naar beneden. Hierdoor kunnen echter problemen ontstaan met bijvoorbeeld refereren naar tabellen. Wat nou als als je een referentie in je tekst neerzet, naar een plaatje wat later komt? LaTeX snapt er geen toeter van en begint te gillen. (Gillen is een groot woord, in de praktijk komt er gewoon een vraagteken te staan.) Gelukkig is daar het .aux bestand! Zodra LaTeX een label tegenkomt, waarnaar referenties verwijzen, wordt het label weggeschreven in het .aux bestand. Bij elke referentie die LaTeX tegenkomt zal het in het .aux bestand kijken of het label bestaat. Hierdoor is het vaak nodig om LaTeX twee keer te compileren voor al je referenties goed staan. Tip van Rik: Gooi je .aux bestanden pas weg als je helemaal klaar bent met het bestand! Dat scheelt je een hoop hoofdpijn.

.toc bestand.

Table of Contents bestand. Werkt een beetje hetzelfde als een .aux bestand; maar dan voor je table of contents. Simpel. Makkelijk. Bam.

.tol en .tof bestand

Table of Lists en Table of Figures. Zie .toc.

.bbl (haha leuk) en .bib

Deze files worden gebruikt voor de bibliography. In de .bib file kan een gebruiker in (redelijke) voor mensen begrijpbare taal al zijn boeken en gebruikte artikelen kwijt. Vervolgens wordt in LaTeX voor de actuele referenties een .bbl gebruikt, net zoals het .aux file voor de gewone referenties.

Als er andere bestanden verschijnen bij het gebruik van LaTeX die hier niet boven staan, doe je of iets heel fout, of je bent zodanig ver gevorderd in LaTeX dat je het waarschijnlijk zelf op kunt lossen 😉 .

Rik

1 April

welkom1aprilDe opmerkzamere leden onder ons hebben afgelopen 1 april (sommigen al 3 minuten na het begin!) opgemerkt dat onze homepagina plots achterstevoren vertoond werd. Het leuke is dat de hele pagina nog precies hetzelfde werkte, alleen zat alles links wat voorheen rechts was en vice versa. Het is nog verrassend eenvoudig om dit voor elkaar te krijgen ook!

Om deze grap uit te voeren hebben we twee kleine dingetjes moeten toevoegen aan de webpagina’s. Als je niet precies weet wat er gebeurt, hoef je je geen zorgen te maken. Het is gewoon om een indruk te geven wat je allemaal met een webpagina aankan. Dit stukje code voeren wij uit als je een pagina opvraagt, nog voordat we hem naar je opsturen.

if(date('d-m') == '01-04' && substr($uriRef['request'], 0, 5) == '/Home') {
echo '<link rel="stylesheet" href="'.$this->scriptFileTime('/Layout/CSS/1april.css').'" type="text/css" media="screen">'."\r\n";
}

Ten eerste controleren we of het daadwerkelijk 1 april is. Zo konden we de spiegeling van tevoren installeren en gebeurde het automatisch op de dag zelf. De website is toch wat minder bruikbaar dus we hadden later op de dag ingesteld dat alleen de homepagina gespiegeld werd. Dit doet de code door te kijken of de opgevraagde pagina begint met ‘/Home’. Alleen als allebei de eisen waar zijn, voeren we de grap echt uit. Om dat te doen, voegen we een stukje toe aan de pagina, waarin staat dat de opmaak (stylesheet) van 1april.css uitgevoerd moet worden:

body {
-moz-transform: scaleX(-1) !important;
-o-transform: scaleX(-1) !important;
-webkit-transform: scaleX(-1) !important;
transform: scaleX(-1) !important;
}

In het bestand 1april.css vertellen we wat er precies moet gebeuren: we passen een transformatie toe waarbij we in de hele inhoud (body) de x-coordinaat met -1 vermenigvuldigen, oftewel een spiegeling. Verder zorgt !important er nog voor dat deze regel belangrijker is dan andere transformatieregels, zodat je vrijwel zeker daadwerkelijk de spiegeling zult zien.

Helaas is de wereld niet perfect. We moeten we de regel een aantal keer met kleine variates herhalen voor het geval dat het niet duidelijk is. We willen natuurlijk niet dat iemand onze geweldige grap kan missen. Alle populaire browsers ondersteunen net weer een andere editie van de nieuwere en geavanceerdere opmaak, zoals bijvoorbeeld transformaties (dat is geen wonder, als je precies wilt doen zoals het hoort, ben je ook een tijdje bezig). Gecko (de drijvende kracht achter Mozilla Firefox) verwacht dat je voor dergelijke fancy dingetjes altijd -moz- zegt, Opera eist een -o- en WebKit (waar bijvoorbeeld Google Chrome en Safari op gebaseerd zijn) wil juist weer -webkit-. Later bleek dat we voor Internet Explorer compleet vergeten waren om -ms-transform toe te voegen. Gelukkig worden na verloop van tijd steeds meer dingen gewoon standaard geaccepteerd, en kun je steeds meer van die voorvoegsels weglaten.

webcie1aprilDoe-Tip: als je zelf wilt spelen met transformaties en rotaties, kun je in de betere browsers dit heel eenvoudig doen, zonder eerst een hele website te hoeven bouwen.  Rechtsklik op wat je wil spiegelen en kies ‘Inspect Element’. Rechts zie je een heleboel opmaakregels, en die kun je zelf bewerken. Voeg een regel met transform: scaleX(-1); toe en bewonder de resultaten. Probeer ook eens andere transformaties zoals die uit dit lijstje.

Ben je na deze uitleg benieuwd geworden naar websites of heb je altijd zelf al een site willen maken? De WebCie geeft een reeks websitecursussen op 8, 15 en 22 april in BBL 109. Voor informatie kun je gaan naar de site van de WebCie.

IBA Verklaart IBA-chat

Naast Bugweb (en email, natuurlijk) is er nog een manier om in contact te komen met de technische commissies: de IBA-chat. In het onwaarschijnlijke geval dat er niemand van IBA aanwezig is in de werkkamer is dit de manier om in contact te komen met iemand die verstand van zaken heeft.

IBA-chat
IBA-chat in Pidgin

Om deel te nemen aan de chat moet je gebruik maken van een XMPP-client die Multi-User Chat (muc) ondersteunt. Op de A-Werkplekken is Pidgin geïnstalleerd (te vinden onder Applications -> Internet -> Pidgin). Hier is een lijstje te vinden met andere geschikte en minder geschikte clients.

Account toevoegen
Account toevoegen

Inloggen op de IBA-chat is met Pidgin (of een andere client) vrij eenvoudig. Als je Pidgin voor het eerst opstart wordt er gevraagd of je een account wil toevoegen. Doe dat en kies bij Protocol voor XMPP en vul bij Domain a-eskwadraat.nl in. Gebruikersnaam en wachtwoord zijn (uiteraard) gelijk aan de gegevens waarmee je inlogt op IBA Verklaart en/of een werkplek.

Als alles volgens plan verloopt verschijnt er een leeg venster (Buddy List) met onderin een groene stip en de tekst ‘Available’. Nu kun je via het menu een nieuwe chat toevoegen (Buddies -> Add Chat). Vul bij Room IBA in en klik op Add. Om, ten slotte, daadwerkelijk aan de chat deel te nemen hoef je alleen nog maar op IBA te dubbelklikken.

IBA Verklaart Bugweb

Ondanks alle inspanningen van de technische commissies zijn er weleens problemen met bijvoorbeeld de website of een \text{\LaTeX}-package. Om deze problemen en de oplossingen op een gestructureerde manier bij te houden is Bugweb in het leven geroepen.

In principe mag iedereen die is ingelogd op de website nieuwe bugs invoeren en reeds bestaande bugs aanpassen. Bij aanmaken of aanpassen wordt automatisch een notificatie gestuurd naar de betrokken commissie. Heel fijn allemaal maar hoe moet je nou een bug invoeren waar een commissie iets aan heeft?

Bugweb
Voorpagina Bugweb

Allereerst is het belangrijk om je probleem zo duidelijk mogelijk samen te vatten in het onderwerp van de bug. Verder is het goed om een zo specifiek mogelijke categorie aan de bug te koppelen. Dus kies bijvoorbeeld “I Owe You” in plaats van “Website”. De keuze voor de status van een bug is redelijk makkelijk: “Open” als er iets kapot is, “Feature request” als er functionaliteit ontbreekt.

Dan volgen de twee leukste onderdelen van een nieuwe bug: de prioriteit en het daadwerkelijke bugrapport. Hou bij het inschatten van de prioriteit van de bug in je achterhoofd dat “Urgent” ook echt urgent is (als in: problemen waar je iemand midden in de nacht voor wakker zou bellen) en dat problemen met prioriteit “Onbenullig” ook gewoon opgelost worden. Stap nummer laatst is dus het invullen van je bericht. Zorg dat je zo helder mogelijk omschrijft wat je probleem is en dat je foutmeldingen zorgvuldig kopieert.

Ten slotte nog een aantal tips met betrekking tot bugs voor specifieke commissies:
Sysop: Zorg dat je de naam van de machine waar het probleem is opgetreden in je bugrapport opneemt.
Webcie: Plak de URL van de pagina die kapot is in je bugrapport.
TeXniCie: Geef een minimal working example.