<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://mediawiki.a-eskwadraat.nl/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://mediawiki.a-eskwadraat.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ludop</id>
		<title>A-Eskwiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://mediawiki.a-eskwadraat.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ludop"/>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Special:Contributions/Ludop"/>
		<updated>2026-08-10T11:20:27Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.2</generator>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Ouderdag_mogelijk_maken</id>
		<title>Ouderdag mogelijk maken</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Ouderdag_mogelijk_maken"/>
				<updated>2018-06-26T16:09:03Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: kwerrie code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
Vele jaren wordt er een ouderdag georganiseerd. Waarschijnlijk lees je dit omdat de ouderdag commissie heeft gevraagd voor de contact gegevens van 1e en 2e jaars. Dit gaat als volgt:&lt;br /&gt;
&lt;br /&gt;
* Bekijk de kwerrie die hieronder staat.&lt;br /&gt;
* Kopieer de kwerrie naar je plakbord.&lt;br /&gt;
* Ga naar [admin.a-eskwadraat.nl] en log in&lt;br /&gt;
* Voer de kwerrie uit&lt;br /&gt;
* Exporteer de kwerrie naar CSV en klaar is kees.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouderdag CSV kwerrie ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT Persoon.contactID, Persoon.voornaam, Persoon.bijnaam,&lt;br /&gt;
	Persoon.voorletters, Persoon.geboortenamen, Persoon.tussenvoegsels,&lt;br /&gt;
	Persoon.achternaam, Persoon.titelsPrefix, Persoon.titelsPostfix,&lt;br /&gt;
	Persoon.geslacht, Contact.email, ContactAdres.*&lt;br /&gt;
FROM Lid&lt;br /&gt;
JOIN Persoon ON Lid.contactID = Persoon.contactID&lt;br /&gt;
JOIN Contact ON Contact.contactID = Lid.contactID&lt;br /&gt;
LEFT JOIN ContactAdres ON ContactAdres.contact_contactID = Lid.contactID&lt;br /&gt;
WHERE Persoon.overleden = 0&lt;br /&gt;
	AND (&lt;br /&gt;
		SELECT MIN(datumBegin)&lt;br /&gt;
		FROM LidStudie&lt;br /&gt;
		JOIN Studie ON Studie.studieID = LidStudie.studie_studieID&lt;br /&gt;
		WHERE&lt;br /&gt;
		LidStudie.lid_contactID = Lid.contactID&lt;br /&gt;
		AND fase = 'BA'&lt;br /&gt;
	) &amp;gt;= '2016-09-01'&lt;br /&gt;
ORDER BY `Lid`.`contactID` ASC;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In 2017/2018 waren de ouders van een overleden persoon gemaild. Voorkom dit!&lt;br /&gt;
--[[User:Ludop|Ludop]] ([[User talk:Ludop|talk]]) 18:09, 26 June 2018 (CEST)&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten</id>
		<title>Kaartjes bij activiteiten</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten"/>
				<updated>2018-05-29T19:58:33Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: qr-codes scannen handleiding&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== QR-codes scannen ==&lt;br /&gt;
&lt;br /&gt;
Om een QR-code van kaartjes bij een activiteit te scannen, moet eerst de kaartsoort op &amp;quot;PERSOONLIJK&amp;quot; staan.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moet je naar de activiteit pagina gaan.&lt;br /&gt;
Hier is een knop te vinden met &amp;quot;Scanbare kaartjes activeren&amp;quot;. Klik dit.&lt;br /&gt;
&lt;br /&gt;
Dit bevat de &amp;quot;master qr-code&amp;quot;, die belangrijk is om qr-codes te gaan scannen. Print deze dus 2x uit voor een activiteit begint en neem deze mee want deze is nodig om die van andere te scannen!&lt;br /&gt;
&lt;br /&gt;
--[[User:Ludop|Ludop]] ([[User talk:Ludop|talk]]) 21:58, 29 May 2018 (CEST) momenteel lijkt het alsof deze niet nodig is, en dat je gewoon qr-codes direct kunt gaan scannen.&lt;br /&gt;
&lt;br /&gt;
Daarna, moet je de scan-app gebruiken. Dit is een speciale app, die [https://home.a-eskwadraat.nl/~floriann/kaartjesscanner.apk hier] te downloaden is.&lt;br /&gt;
Als je hem niet kan installeren, verwijder de &amp;quot;A-Appkwadraat&amp;quot;, deze gebruikt hetzelfde certificaat. Als het nog niet werkt, moet je toestaan apps te installeren uit onbetrouwbare bron (zoek op internet, iets met USB debugging?).&lt;br /&gt;
&lt;br /&gt;
In de app, ga je naar de activiteit en in het menu ga je naar &amp;quot;Scan tickets&amp;quot;. Hier kun je nu kaartjes scannen.&lt;br /&gt;
&lt;br /&gt;
Op de site worden van kaartjes ook aangegeven of ze ooit gescant zijn.&lt;br /&gt;
Succes ermee!&lt;br /&gt;
&lt;br /&gt;
Vraag webcie dingen als iets in de fik vliegt.&lt;br /&gt;
&lt;br /&gt;
== QRCode opnieuw mailen ==&lt;br /&gt;
&lt;br /&gt;
Om de zoveel tijd krijgt de WebCie een mailtje van iemand dat de iDEAL-betaling voor een activiteitkaartje geslaagd was maar dat ze de aparte mail met kaartje niet hebben ontvangen. We weten nog niet precies waarom dit komt, maar we vermoeden dat een spamfilter te agressief de kaartjesmails opeet (al is het voorgekomen dat redelijk capabele gebruikers ze niet in de spamfolder tegenkwamen, dus het mysterie gaat door...)&lt;br /&gt;
&lt;br /&gt;
Wat je dan kunt doen is checken of de IDEALTransactie inderdaad succesvol was, zo ja de code(s) opzoeken tussen de iDealKaartjeCode &amp;lt;!-- Is dit alleen mogelijk in de database? Zo ja, is dit meteen een feature request. --&amp;gt; en een mailtje sturen naar de arme kaartjesloze persoon. Probeer zoiets te schrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Beste [PERSOON],&lt;br /&gt;
&lt;br /&gt;
Ik zie inderdaad een transactie op [DATUM], maar&lt;br /&gt;
[ die lijkt succesvol verstuurd te zijn | de mail is naar een ander e-mailadres verstuurd | de mail is compleet foutgegaan ]&lt;br /&gt;
(heb je al tussen de spam gekeken?).&lt;br /&gt;
De kaartjes die bij deze transactie horen, heb ik als attachment toegevoegd.&lt;br /&gt;
De geheime codes, voor het geval de plaatjes niet werken, zijn [B4N44N] en [W4TL3UKS].&lt;br /&gt;
Laat het ons weten als je nog problemen hebt.&lt;br /&gt;
&lt;br /&gt;
Met vriendelijke groeten,&lt;br /&gt;
&lt;br /&gt;
[AFZENDER]&lt;br /&gt;
namens de WebCie&lt;br /&gt;
[ATTACHMENTS MET QR-CODE VOOR KAARTJES]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De qr-codes kun je genereren met het scriptje &amp;lt;code&amp;gt;scripts/create-qr-kaartje.php&amp;lt;/code&amp;gt;, die je op de &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; kunt draaien. Het neemt twee command-line argumenten: geheime code van een ontbrekend kaartje en activiteitnummer. Op stdout verschijnt een PNG-bestand met je kaartje. Voorbeeldaanroep:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/wwwdebug/scripts$ ./create-qr-kaartje.php B4N44N 1337 &amp;gt; ~/troep/qr-kaartje-1.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zie ook [https://www.a-eskwadraat.nl/Service/Bugweb/6956/ bug #6956]&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten</id>
		<title>Kaartjes bij activiteiten</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten"/>
				<updated>2018-05-29T19:49:01Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Ludop moved page Activiteitkaartje mailen to Kaartjes bij activiteiten: Behalve mailen wordt ook scannen uitgelegd.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om de zoveel tijd krijgt de WebCie een mailtje van iemand dat de iDEAL-betaling voor een activiteitkaartje geslaagd was maar dat ze de aparte mail met kaartje niet hebben ontvangen. We weten nog niet precies waarom dit komt, maar we vermoeden dat een spamfilter te agressief de kaartjesmails opeet (al is het voorgekomen dat redelijk capabele gebruikers ze niet in de spamfolder tegenkwamen, dus het mysterie gaat door...)&lt;br /&gt;
&lt;br /&gt;
Wat je dan kunt doen is checken of de IDEALTransactie inderdaad succesvol was, zo ja de code(s) opzoeken tussen de iDealKaartjeCode &amp;lt;!-- Is dit alleen mogelijk in de database? Zo ja, is dit meteen een feature request. --&amp;gt; en een mailtje sturen naar de arme kaartjesloze persoon. Probeer zoiets te schrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Beste [PERSOON],&lt;br /&gt;
&lt;br /&gt;
Ik zie inderdaad een transactie op [DATUM], maar&lt;br /&gt;
[ die lijkt succesvol verstuurd te zijn | de mail is naar een ander e-mailadres verstuurd | de mail is compleet foutgegaan ]&lt;br /&gt;
(heb je al tussen de spam gekeken?).&lt;br /&gt;
De kaartjes die bij deze transactie horen, heb ik als attachment toegevoegd.&lt;br /&gt;
De geheime codes, voor het geval de plaatjes niet werken, zijn [B4N44N] en [W4TL3UKS].&lt;br /&gt;
Laat het ons weten als je nog problemen hebt.&lt;br /&gt;
&lt;br /&gt;
Met vriendelijke groeten,&lt;br /&gt;
&lt;br /&gt;
[AFZENDER]&lt;br /&gt;
namens de WebCie&lt;br /&gt;
[ATTACHMENTS MET QR-CODE VOOR KAARTJES]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De qr-codes kun je genereren met het scriptje &amp;lt;code&amp;gt;scripts/create-qr-kaartje.php&amp;lt;/code&amp;gt;, die je op de &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; kunt draaien. Het neemt twee command-line argumenten: geheime code van een ontbrekend kaartje en activiteitnummer. Op stdout verschijnt een PNG-bestand met je kaartje. Voorbeeldaanroep:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/wwwdebug/scripts$ ./create-qr-kaartje.php B4N44N 1337 &amp;gt; ~/troep/qr-kaartje-1.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zie ook [https://www.a-eskwadraat.nl/Service/Bugweb/6956/ bug #6956]&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Activiteitkaartje_mailen</id>
		<title>Activiteitkaartje mailen</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Activiteitkaartje_mailen"/>
				<updated>2018-05-29T19:49:01Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Ludop moved page Activiteitkaartje mailen to Kaartjes bij activiteiten: Behalve mailen wordt ook scannen uitgelegd.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Kaartjes bij activiteiten]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Ouderdag_mogelijk_maken</id>
		<title>Ouderdag mogelijk maken</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Ouderdag_mogelijk_maken"/>
				<updated>2018-04-23T17:05:15Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
Vele jaren wordt er een ouderdag georganiseerd. Waarschijnlijk lees je dit omdat de ouderdag commissie heeft gevraagd voor de contact gegevens van 1e en 2e jaars. Dit gaat als volgt:&lt;br /&gt;
&lt;br /&gt;
* Bekijk de kwerrie in het bestand &amp;lt;code&amp;gt;ouderdag-leden.sql&amp;lt;/code&amp;gt; onder de webcie homedir.&lt;br /&gt;
* Kopieer de kwerrie naar je plakbord.&lt;br /&gt;
* Ga naar [admin.a-eskwadraat.nl] en log in&lt;br /&gt;
* Voer de kwerrie uit&lt;br /&gt;
* Exporteer de kwerrie naar CSV en klaar is kees.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Ouderdag_mogelijk_maken</id>
		<title>Ouderdag mogelijk maken</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Ouderdag_mogelijk_maken"/>
				<updated>2018-04-23T17:04:38Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Beschrijving voor faciliteren ouderdag.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vele jaren wordt er een ouderdag georganiseerd. Waarschijnlijk lees je dit omdat de ouderdag commissie heeft gevraagd voor de contact gegevens van 1e en 2e jaars. Dit gaat als volgt:&lt;br /&gt;
&lt;br /&gt;
* Bekijk de kwerrie in het bestand &amp;lt;code&amp;gt;ouderdag-leden.sql&amp;lt;/code&amp;gt; onder de webcie homedir.&lt;br /&gt;
* Kopieer de kwerrie naar je plakbord.&lt;br /&gt;
* Ga naar [admin.a-eskwadraat.nl] en log in&lt;br /&gt;
* Voer de kwerrie uit&lt;br /&gt;
* Exporteer de kwerrie naar CSV en klaar is kees.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel</id>
		<title>Bestuurswissel</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel"/>
				<updated>2018-04-06T12:49:31Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Kandidaatbestuur procedure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
Dit is het stappenplan wat elk jaar bij een bestuurswissel uitgevoerd moet worden. Dit is zo snel mogelijk na de Wissel-AV die in het begin van een nieuw collegejaar plaatsvindt.&lt;br /&gt;
&lt;br /&gt;
Er moeten zowel dingen op de site gedaan worden als in de code.&lt;br /&gt;
Natuurlijk moet de sysop ook dingen op het systeem regelen maar dat is hun probleem.&lt;br /&gt;
&lt;br /&gt;
=== Website frontside ===&lt;br /&gt;
&lt;br /&gt;
# Maak een nieuwe commissie aan met login &amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Voeg alle mensen die daar in horen toe aan deze commissie.&lt;br /&gt;
# Maak een publisher pagina aan voor het huidige bestuur (&amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Update de redirects in benamite (&amp;lt;code&amp;gt;/Vereniging/Bestuur&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/Vereniging/Commissies/Bestuur&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Dubbelcheck even of alles nog werkt.&lt;br /&gt;
&lt;br /&gt;
===Backside===&lt;br /&gt;
# Check of onderstaande dingen al meteen moeten worden aangepast, het kan best zijn dat een (oud)bestuurslid nog tijdelijk bestuursrechten nodig heeft voor de laatste inwerking of afronding van werkzaamheden.&lt;br /&gt;
# Ga naar het BESTUUR DATA deel in &amp;lt;code&amp;gt;space/specialconstants.php&amp;lt;/code&amp;gt; en verander alle data hier aan.&lt;br /&gt;
#:* Vul bij &amp;lt;code&amp;gt;BESTUURLOGINNAAM&amp;lt;/code&amp;gt; wederom &amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt; in.&lt;br /&gt;
#:* Bij mails van de boekencommissaris en de secretaris (gegenereerd door de website) moet natuurlijk de naam staan van het verantwoordelijke bestuurslid. Daarom moet je deze namen invullen in respectievelijk &amp;lt;code&amp;gt;Willem Hulst&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;Tara Fokker&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* Vervang de BESTUUR array. Zie &amp;lt;code&amp;gt;/space/classes/BestuursLid.php&amp;lt;/code&amp;gt; voor de parameters van de constructor.&lt;br /&gt;
# Verander de regel met &amp;lt;code&amp;gt;KANDIDAATBESTUURLOGINNAAM&amp;lt;/code&amp;gt; (onder het bestuurdata-blok) in commentaar door &amp;quot;//&amp;quot; voor de regel te proppen.&lt;br /&gt;
&lt;br /&gt;
== Kandidaatbestuur aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Het kandidaatbestuur kan aangemaakt worden door een commissie te maken op de site op dezelfde manier als de website frontside. Alle afgelopen jaren is de conventie &amp;lt;code&amp;gt;kbjjjj&amp;lt;/code&amp;gt; gebruikt. Doe dit ook, en vul dit in bij &amp;lt;code&amp;gt;KANDIDAATBESTUURLOGINNAAM&amp;lt;/code&amp;gt; en zorg ervoor dat het geen commentaar-regel is.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/User:Ludop</id>
		<title>User:Ludop</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/User:Ludop"/>
				<updated>2018-04-06T12:42:10Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Created page with &amp;quot;Zie https://www.a-eskwadraat.nl/Leden/11158/. Zo kun je genoeg stalken!&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie https://www.a-eskwadraat.nl/Leden/11158/. Zo kun je genoeg stalken!&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Wishlist</id>
		<title>Wishlist</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Wishlist"/>
				<updated>2018-04-06T12:41:27Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: mijn wishlist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier kan je dingen neerzetten die je graag zou zien in, of doen met, de code of website. Dit kunnen dan een soort persoonlijke TODO's of ideëen zijn, of iets wat meer is van het niveau &amp;quot;herschrijf alles in Idris&amp;quot;, i.e. lulz.&lt;br /&gt;
&lt;br /&gt;
= [[User:Daanr|Daan]] =&lt;br /&gt;
&lt;br /&gt;
Ongeveer op lexicografische volgorde van 'realistisch, belangrijk' naar 'P = NP, niet zo belangrijk'.&lt;br /&gt;
&lt;br /&gt;
* Test meer dingen. (Wordt aan gewerkt.)&lt;br /&gt;
* Zorg dat de PromoCie weer toegang heeft tot de vertaalstrings op de een of andere manier&lt;br /&gt;
* Upgrade naar PHP 7.&lt;br /&gt;
* Upgrade naar PostgreSQL.&lt;br /&gt;
* Maak de dia2php netter, i.e. minder met teringlange strings met allemaal tabs erin. Iets met een expliciete AST en quasiquoting ofzo.&lt;br /&gt;
* Gebruik Dia niet meer als model-definitie format, want het is echt niet chill voor version control.&lt;br /&gt;
* Gooi FotoWeb weg ofzo.&lt;br /&gt;
* Maak Benamite/WhosWho4 chiller om te gebruiken. Vooral op het gebied van routing. Bijvoorbeeld dat je expliciet in een controllerfunctie kan zeggen wat voor parameters erin je parameters moeten. Zie: Flask.&lt;br /&gt;
* Test controllerfuncties á la QuickCheck. Dus dan moet je een manier vinden om URL parameters te... parameteriseren. En geen idee of een QuickCheck-achtige library voor PHP bestaat, en zo nee, hoe die eruit zou moeten zien.&lt;br /&gt;
* Meer DevOps dingen, makkelijker je eigen developer env en de production env draaien.&lt;br /&gt;
* Maak alles een tikje meer microservice-achtig, door ledenbeheer e.d. in een kern-API te stoppen, en dan 'apps' op basis van die (REST) API te implementeren. Gevolg hiervan is dat je dan ook andere talen dan PHP kan gebruiken, zonder dat je alles hoeft te herschrijven!&lt;br /&gt;
* Waarschijnlijk samen met bovenstaand item: doe leuke &amp;amp; fijne frontend dingen met Elm/PureScript/TypeScript/WebAssembly.&lt;br /&gt;
* C O N T A I N E R I Z A T I O N want dat is ''web scale''&lt;br /&gt;
* Herschrijf de website in de toffe Haskell-en-Python-hadden-een-baby taal die [[User:Timb|Tim]] ooit gaat maken.&lt;br /&gt;
* Bewijs dat P = NP.&lt;br /&gt;
* Verander PHP in een goede taal.&lt;br /&gt;
&lt;br /&gt;
= [[User:Timb|Timb]] =&lt;br /&gt;
&lt;br /&gt;
* Een fijn (unit)testsysteem. (werk ik aan!)&lt;br /&gt;
* HTML-objecten maar dan voor allerlei HTML/XML die in Page-objecten geproduceerd wordt.&lt;br /&gt;
* Upgrade naar PHP 7.&lt;br /&gt;
* Upgrade naar PostgreSQL.&lt;br /&gt;
* Continuous integration.&lt;br /&gt;
* De meeste functies zijn zo goed als puur, en de functies die niet puur zijn komen niet in een View voor.&lt;br /&gt;
* 100 % code coverage.&lt;br /&gt;
* Decorator-achtige constructies voor requireAuth enzo.&lt;br /&gt;
* dia2php poept volautomatisch een hele CRUD-app uit.&lt;br /&gt;
* Herschrijf de website in Swail, de toffe Haskell-en-Python-hadden-een-baby programmeertaal die je helpt te zeggen wat je bedoelt (en die syntactische whitespace heeft!).&lt;br /&gt;
* Volledig automatisch je testomgeving maken.&lt;br /&gt;
* Een formeel bewijs dat de website featurecompleet is.&lt;br /&gt;
* Onze eis is niets meer, maar kan ook niets minder zijn, dan het Goede Leven voor elk persoon.&lt;br /&gt;
* Bewijs dat P =/= NP.&lt;br /&gt;
&lt;br /&gt;
= [[User:Ludop|Ludop]] =&lt;br /&gt;
&lt;br /&gt;
* Een huisje op de bahama's.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Fotocache</id>
		<title>Fotocache</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Fotocache"/>
				<updated>2018-04-06T12:37:52Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
Hoewel de map staat in &amp;lt;code&amp;gt;/srv/cache&amp;lt;/code&amp;gt; is het beter om '''niet''' de fotocache leeg te gooien: hier worden namelijk de verkleinde versies van foto's op Fotoweb opgeslagen. Het script &amp;lt;code&amp;gt;/scripts/cron/fw_precreatethumbs.php&amp;lt;/code&amp;gt; zorgt elke nacht ervoor dat deze cache gevuld wordt met alle foto's van Fotoweb.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Mail_sturen_vanaf_de_site</id>
		<title>Mail sturen vanaf de site</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Mail_sturen_vanaf_de_site"/>
				<updated>2018-04-06T12:36:55Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Email optie toegevoegd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als je een mailtje wil sturen vanaf de site, bijvoorbeeld bugberichten, dan heb je de functie &amp;lt;code&amp;gt;sendmail&amp;lt;/code&amp;gt; of de klasse &amp;lt;code&amp;gt;Email&amp;lt;/code&amp;gt; nodig.&lt;br /&gt;
&lt;br /&gt;
Tijdens emails sturen wordt er heel veel escaping magie gebruikt omdat er veel regels zijn over de encoding en gebruik van UTF-8 karakters. Verwacht hierdoor dat je de gehele sendmail-code niet zult begrijpen. --[[User:Ludop|Ludop]] ([[User talk:Ludop|talk]]) 14:36, 6 April 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
== sendmail ==&lt;br /&gt;
&lt;br /&gt;
De functie sendmail zit in space en verwacht de volgende parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
www/space/sendmail.php:18:function sendmail($from, $to, $subject, $text, $replyto='', $extra='', $bounceto='', $html = false)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== space/classes/Email ==&lt;br /&gt;
&lt;br /&gt;
Een andere optie is gebruik te maken van de Email klasse. Deze is veel mooier en kan goed overweg met HTML.&lt;br /&gt;
Afzenders/geadresseerden kunnen opgegeven worden met respectievelijk &amp;lt;code&amp;gt;setFrom&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;setTo&amp;lt;/code&amp;gt;. Deze verwacht een Contact, Bug, Commissie of BestuursLid.&lt;br /&gt;
&lt;br /&gt;
Email gebruikt sendmail nog.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/App</id>
		<title>App</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/App"/>
				<updated>2018-04-06T12:30:45Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
Sinds kort hebben we ook een eigen A-Appkwadraat. Dit is een android-app en de code staat in Git onder &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Het ontwikkelen van de app is/wordt gedaan door [[User:floriann]] met behulp van [https://developer.android.com/studio/install.html Android Studio].&lt;br /&gt;
&lt;br /&gt;
Er is ooit gesproken om een appcie op te starten die het beheer van de app onder zijn hoede nam, maar dit is (nog?) niet uitgevoerd.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/App</id>
		<title>App</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/App"/>
				<updated>2018-04-06T12:30:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: SVN -&amp;gt; Git&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
Sinds kort hebben we ook een eigen A-Appkwadraat. Dit is een android-app en de code staat in Git onder &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Het ontwikkelen van de app is/wordt gedaan door [[User:floriann]] met behulp van [https://developer.android.com/studio/install.html Android Studio].&lt;br /&gt;
&lt;br /&gt;
Er is ooit gesproken om een appcie op te starten die het beheer van de app onder zijn hoede nam, maar dit is (nog?) niet uitgevoerd.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel</id>
		<title>Bestuurswissel</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel"/>
				<updated>2018-04-06T12:22:36Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: /* Backside  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
Dit is het stappenplan wat elk jaar bij een bestuurswissel uitgevoerd moet worden. Dit is zo snel mogelijk na de Wissel-AV die in het begin van een nieuw collegejaar plaatsvindt.&lt;br /&gt;
&lt;br /&gt;
Er moeten zowel dingen op de site gedaan worden als in de code.&lt;br /&gt;
&lt;br /&gt;
=== Website frontside ===&lt;br /&gt;
&lt;br /&gt;
# Maak een nieuwe commissie aan met login &amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Voeg alle mensen die daar in horen toe aan deze commissie.&lt;br /&gt;
# Maak een publisher pagina aan voor het huidige bestuur (&amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Update de redirects in benamite (&amp;lt;code&amp;gt;/Vereniging/Bestuur&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/Vereniging/Commissies/Bestuur&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Dubbelcheck even of alles nog werkt.&lt;br /&gt;
&lt;br /&gt;
===Backside===&lt;br /&gt;
# Check of onderstaande dingen al meteen moeten worden aangepast, het kan best zijn dat een (oud)bestuurslid nog tijdelijk bestuursrechten nodig heeft voor de laatste inwerking of afronding van werkzaamheden.&lt;br /&gt;
# Ga naar het BESTUUR DATA deel in &amp;lt;code&amp;gt;space/specialconstants.php&amp;lt;/code&amp;gt; en verander alle data hier aan. Zie &amp;lt;code&amp;gt;/space/classes/BestuursLid.php&amp;lt;/code&amp;gt; voor de parameters van de constructor.&lt;br /&gt;
# Commentaar KANDIDAATBESTUURLOGINNAAM onder het bestuurdata-blok.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel</id>
		<title>Bestuurswissel</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel"/>
				<updated>2018-04-06T12:22:02Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Wijzigingen aan bestuurs-data in code toegepast naar aanleiding van de html-uitzwaaimail die vanaf de secretaris wordt gestuurd met de Email class&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
Dit is het stappenplan wat elk jaar bij een bestuurswissel uitgevoerd moet worden. Dit is zo snel mogelijk na de Wissel-AV die in het begin van een nieuw collegejaar plaatsvindt.&lt;br /&gt;
&lt;br /&gt;
Er moeten zowel dingen op de site gedaan worden als in de code.&lt;br /&gt;
&lt;br /&gt;
=== Website frontside ===&lt;br /&gt;
&lt;br /&gt;
# Maak een nieuwe commissie aan met login &amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Voeg alle mensen die daar in horen toe aan deze commissie.&lt;br /&gt;
# Maak een publisher pagina aan voor het huidige bestuur (&amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Update de redirects in benamite (&amp;lt;code&amp;gt;/Vereniging/Bestuur&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/Vereniging/Commissies/Bestuur&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Dubbelcheck even of alles nog werkt.&lt;br /&gt;
&lt;br /&gt;
===Backside TODO===&lt;br /&gt;
# Check of onderstaande dingen al meteen moeten worden aangepast, het kan best zijn dat een (oud)bestuurslid nog tijdelijk bestuursrechten nodig heeft voor de laatste inwerking of afronding van werkzaamheden.&lt;br /&gt;
# Ga naar het BESTUUR DATA deel in &amp;lt;code&amp;gt;space/specialconstants.php&amp;lt;/code&amp;gt; en verander alle data hier aan. Zie &amp;lt;code&amp;gt;/space/classes/BestuursLid.php&amp;lt;/code&amp;gt; voor de parameters van de constructor.&lt;br /&gt;
# Commentaar KANDIDAATBESTUURLOGINNAAM onder het bestuurdata-blok.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases</id>
		<title>WebCie Databases</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases"/>
				<updated>2018-03-26T13:50:10Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De WebCie runt een paar databases waarin alle websitedata (dus ook ledendata, en transactiedata) staat. Op de [[vm-www]], [[vm-www-debug]] en de [[vm-www-inwerking]] draaien allemaal een databaseserver en dezelfde databasestructuur (modulo updatevolgorde).&lt;br /&gt;
&lt;br /&gt;
== Gebruik in de code ==&lt;br /&gt;
&lt;br /&gt;
De beste manier om kwerries op de databaas te doen is met [[QueryBuilder]]. Dit is een manier om volautomatisch SQL te genereren vanuit object-georienteerde code, zonder dat je bang hoeft te zijn voor injectie enzo.&lt;br /&gt;
&lt;br /&gt;
De belangrijkste database is &amp;lt;code&amp;gt;whoswho4&amp;lt;/code&amp;gt;, waar alle [[WhosWho4]]-objecten in staan. Dan zijn er nog &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; voor [[Benamite]] en &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt; voor [[Bookweb]].&lt;br /&gt;
&lt;br /&gt;
=== Hoe een db-connectie opgezet wordt ===&lt;br /&gt;
&lt;br /&gt;
In principe zouden dingen als databaseconnectie enzo al geregeld moeten zijn als je controllerfunctie aangeroepen wordt, maak hier dus alleen zorgen over als je ergens in [[space]] bezig bent.&lt;br /&gt;
&lt;br /&gt;
Eerst wordt door [[space]] het bestand [[secret.php]] geladen, waarin gebruikersnaam en wachtwoord voor alle databaseusers staan. Op basis van de functie &amp;lt;code&amp;gt;getLevel&amp;lt;/code&amp;gt; worden drie globalen &amp;lt;code&amp;gt;$WSW4DB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$BWDB&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;$BMDB&amp;lt;/code&amp;gt; gemaakt door middel van [https://doxygen-www.a-eskwadraat.nl/classdbpdo.html dbpdo]. Hun memberfunctie &amp;lt;code&amp;gt;q(...)&amp;lt;/code&amp;gt; verstuurt een kwerrie naar de desbetreffende databaas.&lt;br /&gt;
&lt;br /&gt;
Dit zorgt er ook voor dat inloggen en uitloggen (en eigenlijk alles wat de auth van de gebruiker aanpast) een refresh vereist voordat alles goed weergegeven kan worden!&lt;br /&gt;
&lt;br /&gt;
== Debugdatabase ==&lt;br /&gt;
&lt;br /&gt;
Op de [[vm-www-debug]] wordt elke nacht een kopietje gemaakt van de livedatabases om op te kunnen debuggen. Deze db's heten &amp;lt;code&amp;gt;test_$BLA&amp;lt;/code&amp;gt; waar &amp;lt;code&amp;gt;$BLA&amp;lt;/code&amp;gt; staat voor de naam van de originele database.&lt;br /&gt;
&lt;br /&gt;
Om precies te zijn, elke dag wordt &amp;lt;code&amp;gt;scripts/cron/copy_db_to_test_db.sh boeken whoswho4&amp;lt;/code&amp;gt; aangeroepen op de live-server (zolang bookweb nog wordt gebruikt met &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt;).&lt;br /&gt;
Elke maandag ochtend wordt de tabel &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; gekopieerd naar de debug database.&lt;br /&gt;
Dit valt terug te vinden in de crontab onder &amp;lt;code&amp;gt;scripts/cron&amp;lt;/code&amp;gt;.&lt;br /&gt;
--[[User:Ludop|Ludop]] ([[User talk:Ludop|talk]]) 15:50, 26 March 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Aanpassen buiten de code om ==&lt;br /&gt;
&lt;br /&gt;
Heb je een nieuwe klasse gemaakt of een nieuw veld? Dan kun je op [https://pgadmin-debug.a-eskwadraat.nl] (of als je echt PHPMyAdmin nodig hebt [https://admin-debug.a-eskwadraat.nl]) (debugdb) en [https://admin.a-eskwadraat.nl] (livedb) inloggen op localhost met gebruikersnaam root en het databasewachtwoord. Dit wachtwoord vind je in het bestand &amp;lt;code&amp;gt;.my.cnf&amp;lt;/code&amp;gt; in de homedir van gebruiker &amp;lt;code&amp;gt;webcie&amp;lt;/code&amp;gt;. Als je klaar bent met dit soort wijzigingen, moet je de [[Databasestructuur committen]].&lt;br /&gt;
&lt;br /&gt;
== Migratie naar PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
MySQL is stiekem best wel slecht, dus we willen graag in plaats daarvan PostgreSQL gebruiken. De migratie gaat ongeveer als volgt.&lt;br /&gt;
&lt;br /&gt;
SSH naar de VM waar de oorspronkelijke database opstaat. Dan doe je ongeveer de volgende stappen (dit is voor de vm-www-debug).&lt;br /&gt;
Eerst installeren we Postgres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
rpm -Uvh pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
sudo yum update                                                                &lt;br /&gt;
sudo yum install postgresql96-server postgresql96-contrib                      &lt;br /&gt;
sudo service postgresql-9.6 initdb                                             &lt;br /&gt;
sudo service postgresql-9.6 start                                              &lt;br /&gt;
sudo chkconfig postgresql-9.6 on                                               &lt;br /&gt;
sudo -i                                                                        &lt;br /&gt;
su postgres                                                                    &lt;br /&gt;
psql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Doe nu &amp;lt;code&amp;gt;CREATE USER&amp;lt;/code&amp;gt; voor alle users in je [[secret.php]].&lt;br /&gt;
&lt;br /&gt;
Dan zijn we klaar om de koppeling met PHP te maken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install php-pgsql                                                        &lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
                                                        &lt;br /&gt;
Pas &amp;lt;code&amp;gt;/var/lib/pgsql/9.6/data/pg_hba.conf&amp;lt;/code&amp;gt; aan zodat je auth method md5 gebruikt.&lt;br /&gt;
(De bestanden &amp;lt;code&amp;gt;/usr/pgsql/*&amp;lt;/code&amp;gt; slaan nergens op, negeer deze.)                                                &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service postgresql-9.6 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
                                             &lt;br /&gt;
Je zou nu moeten kunnen inloggen met &amp;lt;code&amp;gt;psql --user $BLA -d postgres&amp;lt;/code&amp;gt;              &lt;br /&gt;
en ook op adminer (maar let op dat je een database kiest die bestaat).             &lt;br /&gt;
&lt;br /&gt;
=== Data migreren ===                                                                                  &lt;br /&gt;
Ruim eerst je DB een beetje op!                                                   &lt;br /&gt;
(oftewel zorg dat je foreign keys kloppen, dat er geen datums zijn met jaar 0000, maand 00 of dag 00 enzo)&lt;br /&gt;
&lt;br /&gt;
Dit is een volledige migratie, inclusief dbstructuur. Gebruik andere opties voor &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; om alleen data te verhuizen.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mysqldump --compatible=postgresql --user=root --password --default-character-set=utf8 test_whoswho4 &amp;gt; export.sql&lt;br /&gt;
python2.7 docs/db_converter.py export.sql pg-export.sql                    &lt;br /&gt;
psql -d test_whoswho4 -U root -f pg-export.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PRO-TIP: pas de relaties eerst handmatig aan, want die zijn niet echt goed over te zetten.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moeten we handmatig alle tabellen die in MySQL een autoincrement hadden, maar waar die kolom niet &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; heet, in PostgreSQL een sequencenummer geven. Dat ziet er ongeveer zo uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE SEQUENCE IOUBon_bonID_seq;&lt;br /&gt;
SELECT setval('IOUBon_bonID_seq', max(&amp;quot;bonID&amp;quot;)) FROM &amp;quot;IOUBon&amp;quot;;&lt;br /&gt;
ALTER TABLE &amp;quot;IOUBon&amp;quot; ALTER COLUMN &amp;quot;bonID&amp;quot; SET DEFAULT nextval('IOUBon_bonID_seq');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Heb je dat allemaal gedaan, dan moet je ook voor alle databaseusers rechten geven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO god;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO ingelogd;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO dibstablet;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO mollie;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO gast;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we ook nog de rechten overnemen. In MySQL doe je &amp;lt;code&amp;gt;SHOW GRANTS FOR '$USER'@'localhost'&amp;lt;/code&amp;gt; voor alle users in de db-wachtwoorden, pas de output hiervan aan tot PostgreSQL-syntax en voer die uit. (Dit is een hoop werk!)&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Cron</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Cron"/>
				<updated>2018-03-16T12:11:43Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Cronjob aanpassen moet via script install_new_crontab&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De cronjobs zijn alle scripts in &amp;lt;code&amp;gt;/scripts/cron&amp;lt;/code&amp;gt; die om de &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt;-tijd uitgevoerd moeten worden.&lt;br /&gt;
&lt;br /&gt;
De lijst van alle jobs die daadwerkelijk uitgevoerd worden staan in het &amp;lt;code&amp;gt;/scripts/cron/crontab_vm-www[|-debug].webcie&amp;lt;/code&amp;gt; bestand. &lt;br /&gt;
&lt;br /&gt;
= Formaat =&lt;br /&gt;
Schaamteloos uit /etc/crontab gekopieerd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
For details see man 4 crontabs&lt;br /&gt;
Example of job definition:&lt;br /&gt;
.---------------- minute (0 - 59)&lt;br /&gt;
|  .------------- hour (0 - 23)&lt;br /&gt;
|  |  .---------- day of month (1 - 31)&lt;br /&gt;
|  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...&lt;br /&gt;
|  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat&lt;br /&gt;
|  |  |  |  |&lt;br /&gt;
*  *  *  *  * user-name command to be executed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nieuwe cronjob =&lt;br /&gt;
&lt;br /&gt;
Als het cronjob bestand hebt aangepast in `scripts/cron`, dan wordt dit nog niet uitgevoerd door de cron.&lt;br /&gt;
Hiervoor moet je in deze map het bestand `install_new_crontab_vm-www[|-debug]` uitvoeren onder de gebruiker `webcie`.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies</id>
		<title>PHP-extensies</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies"/>
				<updated>2017-12-04T22:09:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Created page with &amp;quot;  == IMAP ==  We gebruiken de IMAP extensie voor functies als &amp;lt;code&amp;gt;imap_mime_header_decode&amp;lt;/code&amp;gt; binnen het &amp;lt;code&amp;gt;mail_process_bug.2&amp;lt;/code&amp;gt; script.  Om het te installeren mo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== IMAP ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de IMAP extensie voor functies als &amp;lt;code&amp;gt;imap_mime_header_decode&amp;lt;/code&amp;gt; binnen het &amp;lt;code&amp;gt;mail_process_bug.2&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
Om het te installeren moet je eerst &amp;lt;code&amp;gt;sudo yum install php-imap&amp;lt;/code&amp;gt; draaien op een CentOS systeem. Daarna, moet je apache herstarten: &amp;lt;code&amp;gt;sudo service httpd restart&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Git_(WebCie)</id>
		<title>Git (WebCie)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Git_(WebCie)"/>
				<updated>2017-06-01T20:14:35Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git (wat staat voor &amp;quot;Git&amp;quot;) is het bovennatuurlijke systeem waarmee we controle houden op wat er gebeurt met alle WebCie-code. Als WebCie-lid heb je een kopie (een ''checkout'') van het volledige systeem staan op je eigen account (in de map &amp;lt;code&amp;gt;~/wwwdebug&amp;lt;/code&amp;gt;). Deze code bepaalt wat jij te zien krijgt in je browser als je naar je persoonlijke debugpagina gaat (lijkt op &amp;lt;code&amp;gt;https://bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;). Als je wijzigingen in deze code aanbrengt, veranderen dus alleen de pagina's op jouw persoonlijke debug-omgeving. Dat noemen we een sandbox, het zorgt er voor dat je rustig je code kan ontwikkelen zonder dat de rest van de WWW daar last van heeft. Bovendien is jouw debugpagina alleen benaderbaar door WebCie-leden, dus als je per ongeluk lekkende SQL-queries schrijft is dat geen ramp.&lt;br /&gt;
&lt;br /&gt;
Op deze pagina staat basale info om aan de slag te gaan met Git. Je kan ook in de [https://git-scm.com/book/en/v2 online handleiding] kijken voor meer pro-tips.&lt;br /&gt;
&lt;br /&gt;
De WebCie is onlangs &amp;lt;!-- dat is dus 2017, laten we kijken hoe lang dat blijft staan --&amp;gt; overgestapt naar Git. Hierbij is ook de svn-geschiedenis gefilterd, dus pas op bij overstappen!&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
&lt;br /&gt;
Een ding waar je bij git waarschijnlijk aan moet wennen is dat iedereen een eigen idee heeft van de geschiedenis van alle code. Op de server staan een setje commitgeschiedenissen (oftewel branches), en op je debug staat ook zo'n setje. Met een beetje geluk komen ze ook nog overeen, maar dat hoeft dus niet! Er zijn commando's om van iemand anders de geschiedenis overnemen. Dan krijg je een kopietje binnen van hun geschiedenis, maar wordt jouw geschiedenis ''niet'' aangepast! Je hebt bijvoorbeeld de volgende branches, allemaal opgeslagen in je eigen debug:&lt;br /&gt;
&lt;br /&gt;
* master (jouw laatste editie van de livesite)&lt;br /&gt;
* develop (jouw eigen editie van de &amp;quot;echte&amp;quot; code)&lt;br /&gt;
* feature-watleuks (jouw eigen editie van deze feature)&lt;br /&gt;
* feature-zoveel (een feature waarvan de server nog helemaal niet weet dat die bestaat)&lt;br /&gt;
* HEAD (wijst naar de laatste commit die bij jou is gebeurd, dus als het goed is de branch waar je nu op werkt)&lt;br /&gt;
* origin/master (wat jij denkt dat de servereditie van de livesite is)&lt;br /&gt;
* origin/develop (wat jij denkt dat de servereditie van de &amp;quot;echte&amp;quot; code is)&lt;br /&gt;
* origin/feature-watleuks (wat jij denkt dat de servereditie van de deze feature is)&lt;br /&gt;
&lt;br /&gt;
Als je &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt; doet, zal git de laatste versie van elke branch van de server opvragen en die bewaren in origin/$branch. Dan kun je die weer in jouw branches stoppen met bijvoorbeeld &amp;lt;code&amp;gt;git merge&amp;lt;/code&amp;gt;. Het commando &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; stuurt jouw editie van de huidige branch naar de server. (De server weet dus in principe niet welke gebruikers er zijn of welke branches ze hebben!)&lt;br /&gt;
&lt;br /&gt;
We hebben twee hoofdbranches: &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;develop&amp;lt;/code&amp;gt;. De livesite zou gelijk moeten lopen met de branch &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;, dus we moeten goed opletten wat we daarop zetten. Om makkelijk code te kunnen delen, gaan we in principe alle commits doen op de branch &amp;lt;code&amp;gt;develop&amp;lt;/code&amp;gt;, maar het is nog netter om met branches te werken.&lt;br /&gt;
&lt;br /&gt;
Handige commando's om het overzicht te bewaren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; om de commits op je huidige branch te bekijken.&lt;br /&gt;
* &amp;lt;code&amp;gt;git log $commit-of-branch-of-etc&amp;lt;/code&amp;gt; om de commits op een andere branch te bekijken. (Het is handig om hiervoor ook &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt; te doen.)&lt;br /&gt;
* &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; als je beter tegen een grafische interface kan.&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; toont je branch, hoe die verschilt met origin/$branch en wat je ten opzichte van je branch hebt aangepast&lt;br /&gt;
* &amp;lt;code&amp;gt;git branch -a&amp;lt;/code&amp;gt; toont elke branch waar git in jouw debug van afweet&lt;br /&gt;
* &amp;lt;code&amp;gt;git log --graph --decorate --pretty=oneline --abbrev-commit&amp;lt;/code&amp;gt; om in de terminal een mooie gerichte graaf van commits te tonen (&amp;lt;code&amp;gt;--all&amp;lt;/code&amp;gt; voor alle branches tegelijk)&lt;br /&gt;
&lt;br /&gt;
=== Maak een feature ===&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;git checkout develop&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; om up to date te zijn&lt;br /&gt;
# maak een nieuwe branch met &amp;lt;code&amp;gt;git checkout -b feature-$bla&amp;lt;/code&amp;gt;&lt;br /&gt;
# ga een stukje zitten programmeren&lt;br /&gt;
# heb je nieuwe bestanden toegevoegd: vertel dat aan git met &amp;lt;code&amp;gt;git add $bestand&amp;lt;/code&amp;gt;&lt;br /&gt;
# wil je bestanden weggooien: doe dat en vertel het tegelijk aan git met &amp;lt;code&amp;gt;git rm $bestand&amp;lt;/code&amp;gt;&lt;br /&gt;
# wil je kijken wat je allemaal hebt gedaan: gebruik &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; en/of &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# ben je tevreden met een setje wijzigingen: commit ze met &amp;lt;code&amp;gt;git add $gewijzigd_bestand1 $gewijzigd_bestand2 ...&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; (het is netjes om eerst nog even te kijken wat je gaat committen zodat er geen troep meekomt)&lt;br /&gt;
# herhaal bovenstaande stappen tot je feature helemaal af is&lt;br /&gt;
# ben je klaar: stop je feature in develop met &amp;lt;code&amp;gt;git checkout develop&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;git merge feature-$bla&amp;lt;/code&amp;gt; en maak het openbaar met &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; '''(TODO: Of gaan we helemaal hardcore met pull requests beginnen?)'''&lt;br /&gt;
# alle webcie'ers krijgen nu een mailtje met de commits die je hebt gepleegd en zullen je feliciteren en/of afkraken op je programmeerstijl&lt;br /&gt;
&lt;br /&gt;
Nu is werken in je eentje heel leuk, maar samenwerken geeft een veel mooier feestje! Daarom is het aan te raden dat je om de zoveel tijd commits van anderen opvraagt en met ze deelt:&lt;br /&gt;
&lt;br /&gt;
# als iemand anders op je branch heeft gewerkt: doe &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; (krijg je een error in de trant van &amp;quot;geen remote voor branch&amp;quot;, doe dan &amp;lt;code&amp;gt;git branch --set-upstream-to origin/feature-$bla&amp;lt;/code&amp;gt; om de remote in te stellen en probeer opnieuw)&lt;br /&gt;
# als er dingen binnenkomen op develop: stop ze in je branch &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;'en en dan &amp;lt;code&amp;gt;git merge origin/develop&amp;lt;/code&amp;gt;. (Voor echte pro's is er ook &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt;, maar dat heeft meer problemen met samenwerken op de branch)&lt;br /&gt;
# als je je vooruitgang wilt delen: doe &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; (krijg je een error in de trant van &amp;quot;geen remote voor branch&amp;quot;, doe dan &amp;lt;code&amp;gt;git branch --set-upstream-to origin/feature-$bla&amp;lt;/code&amp;gt; om de remote in te stellen en probeer opnieuw)&lt;br /&gt;
&lt;br /&gt;
=== Fix een bug ===&lt;br /&gt;
&lt;br /&gt;
(Je kan dit proces ook op develop doen als de bug niet zo heel hoge prioriteit heeft. Doe dan gewoon wat hierboven staat.)&lt;br /&gt;
&lt;br /&gt;
Is er een bug die snel opgelost moet worden? Dan gaan we op basis van de livesite werken zodat we de fix apart kunnen houden van eventuele (halfbakken) features.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;git checkout master&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; om up to date te zijn&lt;br /&gt;
# maak een nieuwe branch met &amp;lt;code&amp;gt;git checkout -b bug-$bla&amp;lt;/code&amp;gt;&lt;br /&gt;
# doe precies hetzelfde programmeer-commitriedeltje als hiervoor beschreven&lt;br /&gt;
# als je in een commit een regel &amp;quot;Closes: #$bugnummer&amp;quot; zet, wordt de bug automatisch op gesloten gezet in Bugweb.&lt;br /&gt;
# ben je klaar: stop je fix in master met &amp;lt;code&amp;gt;git checkout master&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;git merge bug-$bla&amp;lt;/code&amp;gt; en maak het openbaar met &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt;&lt;br /&gt;
# zorg ervoor dat develop up-to-date blijft: &amp;lt;code&amp;gt;git checkout develop&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;git merge master&amp;lt;/code&amp;gt; en maak het openbaar met &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shit's on fire yo ===&lt;br /&gt;
&lt;br /&gt;
Heb je er een potje van gemaakt, en wil je terug naar de laatste commit? Als je een enkel bestand wil terugzetten, heb je &amp;lt;code&amp;gt;git checkout $bestand&amp;lt;/code&amp;gt;; alles wat je in het bestand hebt gedaan sinds de laatste commit wordt dan teruggezet zoals het was. De makkelijkste manier om echt helemaal alles weg te gooien is met &amp;lt;code&amp;gt;git reset --hard HEAD&amp;lt;/code&amp;gt;; elk bestand dat je hebt veranderd t.o.v. je laatste commit wordt dan teruggezet zoals het was. Dit kan dus ook nuttige wijzigingen weggooien!&lt;br /&gt;
&lt;br /&gt;
Heb je er een nog erger potje van gemaakt, en heb je een foute commit gemaakt? Als dit de laatste commit(s) was (waren) op je branch en je hebt ze nog niet gepusht, dan heb je &amp;lt;code&amp;gt;git reset HEAD~1&amp;lt;/code&amp;gt; om de laatste commit weg te gooien (en &amp;lt;code&amp;gt;HEAD~&amp;lt;/code&amp;gt;''n'' om ''n'' commits tegelijk ongedaan te maken.) Heb je ze al wel gepusht, dan moet je naar de aanpak hieronder overgaan.&lt;br /&gt;
&lt;br /&gt;
Heeft iemand anders een enorm potje gemaakt, en wil je de commit ongedaan maken? Doe dan &amp;lt;code&amp;gt;git revert $commit&amp;lt;/code&amp;gt;. Dat maakt een nieuwe commit waarin precies het tegenovergestelde gebeurt van die wijzigingen. De originele commit blijft nog wel in de geschiedenis staan! Als iemand dus geheime data heeft gecommit, moet je toch echt [https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History geavanceerde tools gebruiken].&lt;br /&gt;
&lt;br /&gt;
== Om iets live te zetten ==&lt;br /&gt;
&lt;br /&gt;
Ten eerste: denk goed na of je dit echt wel wilt doen. Er kunnen nog wel eens gebruikers gaan klagen.&lt;br /&gt;
&lt;br /&gt;
Doe gewoon een &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; naar master op je eigen bakkie. Typ lekker &amp;lt;code&amp;gt;./zetLive.sh&amp;lt;/code&amp;gt; in de /scripts map en gaan met die banaan.&lt;br /&gt;
&lt;br /&gt;
== Migreren van SVN naar Git ==&lt;br /&gt;
&lt;br /&gt;
Is jouw debug van voor de overstap? Dan is het niet heel lastig om te switchen!&lt;br /&gt;
&lt;br /&gt;
=== Verhuizen van git-svn ===&lt;br /&gt;
Gebruik je al Git-SVN, dan kun je als volgt switchen:&lt;br /&gt;
# &amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git remote add origin ssh://vm-www/srv/git&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git branch -t origin/develop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu '''moet''' je handmatig commits van je huidige branches op develop rebasen, want anders gaat de hele geschiedenis stuk. Check dat de 3e commit vanaf het begin begint met &amp;lt;code&amp;gt;9cf65047&amp;lt;/code&amp;gt; ipv &amp;lt;code&amp;gt;cc9c5bb&amp;lt;/code&amp;gt;. Zo niet, ga je allemaal antieke ledendata meepushen (die ik met pijn en moeite heb weggefilterd) en gaat de Autoriteit Persoonsgegevens je slaan.&lt;br /&gt;
&lt;br /&gt;
=== Verhuizen zonder git-svn ===&lt;br /&gt;
Heb je wel een wwwdebug maar nog geen git? Dan moet je iets meer moeite doen om je laatste versie te bewaren:&lt;br /&gt;
# &amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;svn up&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;svn log&amp;lt;/code&amp;gt; Kijk hier wat de laatste revisie is!&lt;br /&gt;
# &amp;lt;code&amp;gt;git init&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git remote add origin ssh://vm-www/srv/git&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git commit --allow-empty -m &amp;quot;Initial empty commit&amp;quot;&amp;lt;/code&amp;gt; (want git snapt het niet als je geen commit hebt gedaan en wel branches wil beginnen, dan maar zo)&lt;br /&gt;
# &amp;lt;code&amp;gt;git log origin/master&amp;lt;/code&amp;gt; Kijk hier welke git-commit overeenkomt met de laatste svn-revisie.&lt;br /&gt;
# &amp;lt;code&amp;gt;git reset --mixed $laatste_revisie_commit&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git stash&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git checkout -t origin/develop&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git stash apply&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vertaalsleutel svn -&amp;gt; git ===&lt;br /&gt;
&lt;br /&gt;
Het belangrijkste verschil is dat git heel veel verschillende commitgeschiedenissen heeft en svn maar eentje. Bij elk commando vraagt svn bijvoorbeeld aan de server of er nog commits bijgekomen zijn. Git doet dat alleen als je erom vraagt met &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;. Het is daarom een goed idee om als svn'er voor elk commando &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt; te runnen totdat je doorhebt wanneer het echt nuttig is.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;svn up&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; (vraag aan de remotes welke veranderingen er zijn, merge die automatisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;svn st&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; (vraag de huidige status op van jouw lokale kopie ten opzichte van jouw laatste commit)&lt;br /&gt;
* &amp;lt;code&amp;gt;svn diff&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt; (bekijk alle wijzigingen die er zijn tussen jouw lokale kopie en jouw laatste commit)&lt;br /&gt;
* &amp;lt;code&amp;gt;svn ci&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; (stop al je wijzigingen in een nieuwe commit, die je zou kunnen opsturen naar de andere WebCie'ers)&lt;br /&gt;
&lt;br /&gt;
== Een nieuwe git-repo opzetten ==&lt;br /&gt;
&lt;br /&gt;
Als je code die niet bij de livesite hoort wilt delen met de WebCie, kan dit via een aparte git-repo. Op deze manier maak je een nieuwe repo:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ssh vm-www&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cd /srv&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo mkdir git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chown webcie:webcie /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chmod o= /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chmod ug=rwx /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chmod g+s /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cd /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;git init --bare --shared&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je als het goed is een &amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git-$bla-repo&amp;lt;/code&amp;gt; doen!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Info van voor de overstap naar git, weet niet of we dit nog willen hebben.&lt;br /&gt;
&lt;br /&gt;
Als je liever &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;'t dan &amp;lt;code&amp;gt;svn&amp;lt;/code&amp;gt;'t (en je hebt zin om te leren hoe dat samengaat), dan kun je gebruik maken van &amp;lt;code&amp;gt;git-svn&amp;lt;/code&amp;gt;. Lees van te voren ook even de online documentatie hiervan, want het loopt allemaal net wat anders dan svn werkt of git zonder svn werkt.&lt;br /&gt;
&lt;br /&gt;
== Je eerste checkout ==&lt;br /&gt;
&lt;br /&gt;
Het handigste is als je een schone checkout maakt van de code, want dan heb je gittroep niet tussen svntroep. Het uitchecken duurt best lang, dus start eerst een &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt;sessie op! Dan kun je binnen die screensessie &amp;lt;code&amp;gt;git svn checkout&amp;lt;/code&amp;gt; doen op de huidige svn-repo (zie [[WebCie SVN]] voor de url). Na heel wat gecheckout waarbij een stuk of tienduizend commits worden binnengehaald, heb je een gitrepository waar je gewoon lokale branches hebt en alles!&lt;br /&gt;
&lt;br /&gt;
== Handige aliassen ==&lt;br /&gt;
&lt;br /&gt;
Je kan in git aliassen instellen om de volgende commando's af te korten. Ze doen ongeveer wat svn doet bij de corresponderende afkortingen, en vooral dat je dingen wat makkelijker met svn kan koppelen. Je mag natuurlijk ook gewoon alle git-svn-commando's uit je hoofd gaan leren.&lt;br /&gt;
&lt;br /&gt;
* ''git ci'': &amp;lt;code&amp;gt;git stash &amp;amp;&amp;amp; git svn dcommit &amp;amp;&amp;amp; git stash apply&amp;lt;/code&amp;gt; (zet de commits in je lokale branch om in commits op de svn-server)&lt;br /&gt;
* ''git up'': &amp;lt;code&amp;gt;git stash &amp;amp;&amp;amp; git svn rebase &amp;amp;&amp;amp; git stash apply&amp;lt;/code&amp;gt; (haal alle nieuwe veranderingen uit de svn op en zet het tussen je werk neer)&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Git_(WebCie)</id>
		<title>Git (WebCie)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Git_(WebCie)"/>
				<updated>2017-06-01T20:13:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git (wat staat voor &amp;quot;Git&amp;quot;) is het bovennatuurlijke systeem waarmee we controle houden op wat er gebeurt met alle WebCie-code. Als WebCie-lid heb je een kopie (een ''checkout'') van het volledige systeem staan op je eigen account (in de map &amp;lt;code&amp;gt;~/wwwdebug&amp;lt;/code&amp;gt;). Deze code bepaalt wat jij te zien krijgt in je browser als je naar je persoonlijke debugpagina gaat (lijkt op &amp;lt;code&amp;gt;https://bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;). Als je wijzigingen in deze code aanbrengt, veranderen dus alleen de pagina's op jouw persoonlijke debug-omgeving. Dat noemen we een sandbox, het zorgt er voor dat je rustig je code kan ontwikkelen zonder dat de rest van de WWW daar last van heeft. Bovendien is jouw debugpagina alleen benaderbaar door WebCie-leden, dus als je per ongeluk lekkende SQL-queries schrijft is dat geen ramp.&lt;br /&gt;
&lt;br /&gt;
Op deze pagina staat basale info om aan de slag te gaan met Git. Je kan ook in de [https://git-scm.com/book/en/v2 online handleiding] kijken voor meer pro-tips.&lt;br /&gt;
&lt;br /&gt;
De WebCie is onlangs &amp;lt;!-- dat is dus 2017, laten we kijken hoe lang dat blijft staan --&amp;gt; overgestapt naar Git. Hierbij is ook de svn-geschiedenis gefilterd, dus pas op bij overstappen!&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
&lt;br /&gt;
Een ding waar je bij git waarschijnlijk aan moet wennen is dat iedereen een eigen idee heeft van de geschiedenis van alle code. Op de server staan een setje commitgeschiedenissen (oftewel branches), en op je debug staat ook zo'n setje. Met een beetje geluk komen ze ook nog overeen, maar dat hoeft dus niet! Er zijn commando's om van iemand anders de geschiedenis overnemen. Dan krijg je een kopietje binnen van hun geschiedenis, maar wordt jouw geschiedenis ''niet'' aangepast! Je hebt bijvoorbeeld de volgende branches, allemaal opgeslagen in je eigen debug:&lt;br /&gt;
&lt;br /&gt;
* master (jouw laatste editie van de livesite)&lt;br /&gt;
* develop (jouw eigen editie van de &amp;quot;echte&amp;quot; code)&lt;br /&gt;
* feature-watleuks (jouw eigen editie van deze feature)&lt;br /&gt;
* feature-zoveel (een feature waarvan de server nog helemaal niet weet dat die bestaat)&lt;br /&gt;
* HEAD (wijst naar de laatste commit die bij jou is gebeurd, dus als het goed is de branch waar je nu op werkt)&lt;br /&gt;
* origin/master (wat jij denkt dat de servereditie van de livesite is)&lt;br /&gt;
* origin/develop (wat jij denkt dat de servereditie van de &amp;quot;echte&amp;quot; code is)&lt;br /&gt;
* origin/feature-watleuks (wat jij denkt dat de servereditie van de deze feature is)&lt;br /&gt;
&lt;br /&gt;
Als je &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt; doet, zal git de laatste versie van elke branch van de server opvragen en die bewaren in origin/$branch. Dan kun je die weer in jouw branches stoppen met bijvoorbeeld &amp;lt;code&amp;gt;git merge&amp;lt;/code&amp;gt;. Het commando &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; stuurt jouw editie van de huidige branch naar de server. (De server weet dus in principe niet welke gebruikers er zijn of welke branches ze hebben!)&lt;br /&gt;
&lt;br /&gt;
We hebben twee hoofdbranches: &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;develop&amp;lt;/code&amp;gt;. De livesite zou gelijk moeten lopen met de branch &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;, dus we moeten goed opletten wat we daarop zetten. Om makkelijk code te kunnen delen, gaan we in principe alle commits doen op de branch &amp;lt;code&amp;gt;develop&amp;lt;/code&amp;gt;, maar het is nog netter om met branches te werken.&lt;br /&gt;
&lt;br /&gt;
Handige commando's om het overzicht te bewaren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; om de commits op je huidige branch te bekijken.&lt;br /&gt;
* &amp;lt;code&amp;gt;git log $commit-of-branch-of-etc&amp;lt;/code&amp;gt; om de commits op een andere branch te bekijken. (Het is handig om hiervoor ook &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt; te doen.)&lt;br /&gt;
* &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; als je beter tegen een grafische interface kan.&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; toont je branch, hoe die verschilt met origin/$branch en wat je ten opzichte van je branch hebt aangepast&lt;br /&gt;
* &amp;lt;code&amp;gt;git branch -a&amp;lt;/code&amp;gt; toont elke branch waar git in jouw debug van afweet&lt;br /&gt;
* &amp;lt;code&amp;gt;git log --graph --decorate --pretty=oneline --abbrev-commit&amp;lt;/code&amp;gt; om in de terminal een mooie gerichte graaf van commits te tonen (&amp;lt;code&amp;gt;--all&amp;lt;/code&amp;gt; voor alle branches tegelijk)&lt;br /&gt;
&lt;br /&gt;
=== Maak een feature ===&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;git checkout develop&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; om up to date te zijn&lt;br /&gt;
# maak een nieuwe branch met &amp;lt;code&amp;gt;git checkout -b feature-$bla&amp;lt;/code&amp;gt;&lt;br /&gt;
# ga een stukje zitten programmeren&lt;br /&gt;
# heb je nieuwe bestanden toegevoegd: vertel dat aan git met &amp;lt;code&amp;gt;git add $bestand&amp;lt;/code&amp;gt;&lt;br /&gt;
# wil je bestanden weggooien: doe dat en vertel het tegelijk aan git met &amp;lt;code&amp;gt;git rm $bestand&amp;lt;/code&amp;gt;&lt;br /&gt;
# wil je kijken wat je allemaal hebt gedaan: gebruik &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; en/of &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# ben je tevreden met een setje wijzigingen: commit ze met &amp;lt;code&amp;gt;git add $gewijzigd_bestand1 $gewijzigd_bestand2 ...&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; (het is netjes om eerst nog even te kijken wat je gaat committen zodat er geen troep meekomt)&lt;br /&gt;
# herhaal bovenstaande stappen tot je feature helemaal af is&lt;br /&gt;
# ben je klaar: stop je feature in develop met &amp;lt;code&amp;gt;git checkout develop&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;git merge feature-$bla&amp;lt;/code&amp;gt; en maak het openbaar met &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; '''(TODO: Of gaan we helemaal hardcore met pull requests beginnen?)'''&lt;br /&gt;
# alle webcie'ers krijgen nu een mailtje met de commits die je hebt gepleegd en zullen je feliciteren en/of afkraken op je programmeerstijl&lt;br /&gt;
&lt;br /&gt;
Nu is werken in je eentje heel leuk, maar samenwerken geeft een veel mooier feestje! Daarom is het aan te raden dat je om de zoveel tijd commits van anderen opvraagt en met ze deelt:&lt;br /&gt;
&lt;br /&gt;
# als iemand anders op je branch heeft gewerkt: doe &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; (krijg je een error in de trant van &amp;quot;geen remote voor branch&amp;quot;, doe dan &amp;lt;code&amp;gt;git branch --set-upstream-to origin/feature-$bla&amp;lt;/code&amp;gt; om de remote in te stellen en probeer opnieuw)&lt;br /&gt;
# als er dingen binnenkomen op develop: stop ze in je branch &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;'en en dan &amp;lt;code&amp;gt;git merge origin/develop&amp;lt;/code&amp;gt;. (Voor echte pro's is er ook &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt;, maar dat heeft meer problemen met samenwerken op de branch)&lt;br /&gt;
# als je je vooruitgang wilt delen: doe &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; (krijg je een error in de trant van &amp;quot;geen remote voor branch&amp;quot;, doe dan &amp;lt;code&amp;gt;git branch --set-upstream-to origin/feature-$bla&amp;lt;/code&amp;gt; om de remote in te stellen en probeer opnieuw)&lt;br /&gt;
&lt;br /&gt;
=== Fix een bug ===&lt;br /&gt;
&lt;br /&gt;
(Je kan dit proces ook op develop doen als de bug niet zo heel hoge prioriteit heeft. Doe dan gewoon wat hierboven staat.)&lt;br /&gt;
&lt;br /&gt;
Is er een bug die snel opgelost moet worden? Dan gaan we op basis van de livesite werken zodat we de fix apart kunnen houden van eventuele (halfbakken) features.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;git checkout master&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; om up to date te zijn&lt;br /&gt;
# maak een nieuwe branch met &amp;lt;code&amp;gt;git checkout -b bug-$bla&amp;lt;/code&amp;gt;&lt;br /&gt;
# doe precies hetzelfde programmeer-commitriedeltje als hiervoor beschreven&lt;br /&gt;
# als je in een commit een regel &amp;quot;Closes: #$bugnummer&amp;quot; zet, wordt de bug automatisch op gesloten gezet in Bugweb.&lt;br /&gt;
# ben je klaar: stop je fix in master met &amp;lt;code&amp;gt;git checkout master&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;git merge bug-$bla&amp;lt;/code&amp;gt; en maak het openbaar met &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt;&lt;br /&gt;
# zorg ervoor dat develop up-to-date blijft: &amp;lt;code&amp;gt;git checkout develop&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;git merge master&amp;lt;/code&amp;gt; en maak het openbaar met &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shit's on fire yo ===&lt;br /&gt;
&lt;br /&gt;
Heb je er een potje van gemaakt, en wil je terug naar de laatste commit? Als je een enkel bestand wil terugzetten, heb je &amp;lt;code&amp;gt;git checkout $bestand&amp;lt;/code&amp;gt;; alles wat je in het bestand hebt gedaan sinds de laatste commit wordt dan teruggezet zoals het was. De makkelijkste manier om echt helemaal alles weg te gooien is met &amp;lt;code&amp;gt;git reset --hard HEAD&amp;lt;/code&amp;gt;; elk bestand dat je hebt veranderd t.o.v. je laatste commit wordt dan teruggezet zoals het was. Dit kan dus ook nuttige wijzigingen weggooien!&lt;br /&gt;
&lt;br /&gt;
Heb je er een nog erger potje van gemaakt, en heb je een foute commit gemaakt? Als dit de laatste commit(s) was (waren) op je branch en je hebt ze nog niet gepusht, dan heb je &amp;lt;code&amp;gt;git reset HEAD~1&amp;lt;/code&amp;gt; om de laatste commit weg te gooien (en &amp;lt;code&amp;gt;HEAD~&amp;lt;/code&amp;gt;''n'' om ''n'' commits tegelijk ongedaan te maken.) Heb je ze al wel gepusht, dan moet je naar de aanpak hieronder overgaan.&lt;br /&gt;
&lt;br /&gt;
Heeft iemand anders een enorm potje gemaakt, en wil je de commit ongedaan maken? Doe dan &amp;lt;code&amp;gt;git revert $commit&amp;lt;/code&amp;gt;. Dat maakt een nieuwe commit waarin precies het tegenovergestelde gebeurt van die wijzigingen. De originele commit blijft nog wel in de geschiedenis staan! Als iemand dus geheime data heeft gecommit, moet je toch echt [https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History geavanceerde tools gebruiken].&lt;br /&gt;
&lt;br /&gt;
== Om iets live te zetten ==&lt;br /&gt;
&lt;br /&gt;
Ten eerste: denk goed na of je dit echt wel wilt doen. Er kunnen nog wel eens gebruikers gaan klagen.&lt;br /&gt;
&lt;br /&gt;
Ga naar de live vm met &amp;lt;code&amp;gt;ssh vm-www&amp;lt;/code&amp;gt; en log in als WebCie met &amp;lt;code&amp;gt;s webcie&amp;lt;/code&amp;gt;. Er staat een git-repository in &amp;lt;code&amp;gt;/srv/http/www/git&amp;lt;/code&amp;gt;, en je kunt gewoon een &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; doen om de live site up-to-date te maken met de git server.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------&lt;br /&gt;
Dit is echt flink oud nu. Doe gewoon een &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; naar master op je eigen bakkie. Typ lekker &amp;lt;code&amp;gt;./zetLive.sh&amp;lt;/code&amp;gt; in de /scripts map en gaan met die banaan.&lt;br /&gt;
&lt;br /&gt;
== Migreren van SVN naar Git ==&lt;br /&gt;
&lt;br /&gt;
Is jouw debug van voor de overstap? Dan is het niet heel lastig om te switchen!&lt;br /&gt;
&lt;br /&gt;
=== Verhuizen van git-svn ===&lt;br /&gt;
Gebruik je al Git-SVN, dan kun je als volgt switchen:&lt;br /&gt;
# &amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git remote add origin ssh://vm-www/srv/git&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git branch -t origin/develop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu '''moet''' je handmatig commits van je huidige branches op develop rebasen, want anders gaat de hele geschiedenis stuk. Check dat de 3e commit vanaf het begin begint met &amp;lt;code&amp;gt;9cf65047&amp;lt;/code&amp;gt; ipv &amp;lt;code&amp;gt;cc9c5bb&amp;lt;/code&amp;gt;. Zo niet, ga je allemaal antieke ledendata meepushen (die ik met pijn en moeite heb weggefilterd) en gaat de Autoriteit Persoonsgegevens je slaan.&lt;br /&gt;
&lt;br /&gt;
=== Verhuizen zonder git-svn ===&lt;br /&gt;
Heb je wel een wwwdebug maar nog geen git? Dan moet je iets meer moeite doen om je laatste versie te bewaren:&lt;br /&gt;
# &amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;svn up&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;svn log&amp;lt;/code&amp;gt; Kijk hier wat de laatste revisie is!&lt;br /&gt;
# &amp;lt;code&amp;gt;git init&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git remote add origin ssh://vm-www/srv/git&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git commit --allow-empty -m &amp;quot;Initial empty commit&amp;quot;&amp;lt;/code&amp;gt; (want git snapt het niet als je geen commit hebt gedaan en wel branches wil beginnen, dan maar zo)&lt;br /&gt;
# &amp;lt;code&amp;gt;git log origin/master&amp;lt;/code&amp;gt; Kijk hier welke git-commit overeenkomt met de laatste svn-revisie.&lt;br /&gt;
# &amp;lt;code&amp;gt;git reset --mixed $laatste_revisie_commit&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git stash&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git checkout -t origin/develop&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;git stash apply&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vertaalsleutel svn -&amp;gt; git ===&lt;br /&gt;
&lt;br /&gt;
Het belangrijkste verschil is dat git heel veel verschillende commitgeschiedenissen heeft en svn maar eentje. Bij elk commando vraagt svn bijvoorbeeld aan de server of er nog commits bijgekomen zijn. Git doet dat alleen als je erom vraagt met &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;. Het is daarom een goed idee om als svn'er voor elk commando &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt; te runnen totdat je doorhebt wanneer het echt nuttig is.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;svn up&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; (vraag aan de remotes welke veranderingen er zijn, merge die automatisch)&lt;br /&gt;
* &amp;lt;code&amp;gt;svn st&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; (vraag de huidige status op van jouw lokale kopie ten opzichte van jouw laatste commit)&lt;br /&gt;
* &amp;lt;code&amp;gt;svn diff&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt; (bekijk alle wijzigingen die er zijn tussen jouw lokale kopie en jouw laatste commit)&lt;br /&gt;
* &amp;lt;code&amp;gt;svn ci&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; (stop al je wijzigingen in een nieuwe commit, die je zou kunnen opsturen naar de andere WebCie'ers)&lt;br /&gt;
&lt;br /&gt;
== Een nieuwe git-repo opzetten ==&lt;br /&gt;
&lt;br /&gt;
Als je code die niet bij de livesite hoort wilt delen met de WebCie, kan dit via een aparte git-repo. Op deze manier maak je een nieuwe repo:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ssh vm-www&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cd /srv&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo mkdir git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chown webcie:webcie /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chmod o= /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chmod ug=rwx /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo chmod g+s /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cd /srv/git-$bla-repo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;git init --bare --shared&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je als het goed is een &amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git-$bla-repo&amp;lt;/code&amp;gt; doen!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Info van voor de overstap naar git, weet niet of we dit nog willen hebben.&lt;br /&gt;
&lt;br /&gt;
Als je liever &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;'t dan &amp;lt;code&amp;gt;svn&amp;lt;/code&amp;gt;'t (en je hebt zin om te leren hoe dat samengaat), dan kun je gebruik maken van &amp;lt;code&amp;gt;git-svn&amp;lt;/code&amp;gt;. Lees van te voren ook even de online documentatie hiervan, want het loopt allemaal net wat anders dan svn werkt of git zonder svn werkt.&lt;br /&gt;
&lt;br /&gt;
== Je eerste checkout ==&lt;br /&gt;
&lt;br /&gt;
Het handigste is als je een schone checkout maakt van de code, want dan heb je gittroep niet tussen svntroep. Het uitchecken duurt best lang, dus start eerst een &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt;sessie op! Dan kun je binnen die screensessie &amp;lt;code&amp;gt;git svn checkout&amp;lt;/code&amp;gt; doen op de huidige svn-repo (zie [[WebCie SVN]] voor de url). Na heel wat gecheckout waarbij een stuk of tienduizend commits worden binnengehaald, heb je een gitrepository waar je gewoon lokale branches hebt en alles!&lt;br /&gt;
&lt;br /&gt;
== Handige aliassen ==&lt;br /&gt;
&lt;br /&gt;
Je kan in git aliassen instellen om de volgende commando's af te korten. Ze doen ongeveer wat svn doet bij de corresponderende afkortingen, en vooral dat je dingen wat makkelijker met svn kan koppelen. Je mag natuurlijk ook gewoon alle git-svn-commando's uit je hoofd gaan leren.&lt;br /&gt;
&lt;br /&gt;
* ''git ci'': &amp;lt;code&amp;gt;git stash &amp;amp;&amp;amp; git svn dcommit &amp;amp;&amp;amp; git stash apply&amp;lt;/code&amp;gt; (zet de commits in je lokale branch om in commits op de svn-server)&lt;br /&gt;
* ''git up'': &amp;lt;code&amp;gt;git stash &amp;amp;&amp;amp; git svn rebase &amp;amp;&amp;amp; git stash apply&amp;lt;/code&amp;gt; (haal alle nieuwe veranderingen uit de svn op en zet het tussen je werk neer)&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel</id>
		<title>Bestuurswissel</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel"/>
				<updated>2017-05-05T19:24:01Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: spelfoutje en &amp;lt;code&amp;gt; om code heen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
Stappenplan voor een bestuurswissel, waarschijnlijk ook wsw4 compatible.&lt;br /&gt;
&lt;br /&gt;
=== Website frontside TODO ===&lt;br /&gt;
&lt;br /&gt;
#Maak een nieuwe commissie aan met login bestuurjjjj&lt;br /&gt;
#Voeg alle mensen die daar in horen toe aan het bestuur.&lt;br /&gt;
#Maak een publisher pagina aan voor het huidige bestuur (&amp;quot;bestuurjjjj&amp;quot;).&lt;br /&gt;
#Pas de redirects in benamite (/Vereniging/Bestuur en /Vereniging/Commissies/Bestuur) aan zodat ze naar de nieuwe bestuurscommissie wijzen&lt;br /&gt;
#Dubbelcheck even of alles nog werkt.&lt;br /&gt;
&lt;br /&gt;
===Backside TODO===&lt;br /&gt;
#Check of onderstaande dingen al meteen moeten worden aangepast, het kan best zijn dat een (oud)bestuurslid nog tijdelijk bestuursrechten nodig heeft voor de laatste inwerking of afronding van werkzaamheden.&lt;br /&gt;
#Pas specialconstants.php in /space/ aan:&lt;br /&gt;
#:*naam van de boekcom&lt;br /&gt;
#:*naam van de comint (wordt secretaris en comond?)&lt;br /&gt;
#Pas init.php in /space/auth aan:&lt;br /&gt;
#:*pas de &amp;lt;code&amp;gt;$BOEKCOMNRS[]=%LIDNR%&amp;lt;/code&amp;gt; aan voor de boekcom en vice.&lt;br /&gt;
#:*pas de &amp;lt;code&amp;gt;$BESTUURLIDNRS[]=%LIDNR%&amp;lt;/code&amp;gt; aan voor de nieuwe bestuursleden en haal de oude weg.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-04-13T21:34:55Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: /* whereProp varianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereLikeProp('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om selects distinct te maken kan je de methode &amp;lt;code&amp;gt;selectDistinct&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
&lt;br /&gt;
== Order by ==&lt;br /&gt;
&lt;br /&gt;
Order by's can de QueryBuilder ook aan. Er zijn twee methoden &amp;lt;code&amp;gt;orderByAsc&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;orderByDesc&amp;lt;/code&amp;gt;. Allebei de methoden hebben slechts 1 argument nodig, de kolom om de order op uit te voeren.&lt;br /&gt;
Selecteer alle Personen geordered op contactID&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;orderByAsc('contactID')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limit &amp;amp; offset ==&lt;br /&gt;
&lt;br /&gt;
Om de limit en offset van een query te bepalen zijn er de twee methoden &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;. Beide methoden hebben 1 argument nodig, de offset of limit respectivelijk.&lt;br /&gt;
Selecteer de personen 200 t/m 300&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;limit(100)-&amp;gt;offset(200)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Havings ==&lt;br /&gt;
&lt;br /&gt;
Havings werken op dezelfde manier als alle where-methoden, zowel de standaard &amp;lt;code&amp;gt;having&amp;lt;/code&amp;gt; als de standaard &amp;lt;code&amp;gt;havingProp&amp;lt;/code&amp;gt;. De namen van de methoden zijn precies hetzelfde als de where-methoden, alleen is elke where vervangen door having.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Cron</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Cron"/>
				<updated>2017-02-23T19:47:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De cronjobs zijn alle scripts in &amp;lt;code&amp;gt;/scripts/cron&amp;lt;/code&amp;gt; die om de &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt;-tijd uitgevoerd moeten worden.&lt;br /&gt;
&lt;br /&gt;
De lijst van alle jobs die daadwerkelijk uitgevoerd worden staan in het &amp;lt;code&amp;gt;/scripts/cron/crontab_vm-www[|-debug].webcie&amp;lt;/code&amp;gt; bestand. &lt;br /&gt;
&lt;br /&gt;
= Formaat =&lt;br /&gt;
Schaamteloos uit /etc/crontab gekopieerd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
For details see man 4 crontabs&lt;br /&gt;
Example of job definition:&lt;br /&gt;
.---------------- minute (0 - 59)&lt;br /&gt;
|  .------------- hour (0 - 23)&lt;br /&gt;
|  |  .---------- day of month (1 - 31)&lt;br /&gt;
|  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...&lt;br /&gt;
|  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat&lt;br /&gt;
|  |  |  |  |&lt;br /&gt;
*  *  *  *  * user-name command to be executed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nieuwe cronjob =&lt;br /&gt;
&lt;br /&gt;
Om een nieuwe cronjob toe te voegen of die crontab anderszins aan te passen, moet je op de juiste VM de crontab installeren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh vm-www[|-debug]&lt;br /&gt;
s webcie&lt;br /&gt;
cd /srv/http/www/scripts/cron&lt;br /&gt;
crontab -l # check dat je de goede crontab te pakken hebt&lt;br /&gt;
crontab /scripts/cron/crontab_vm-www[|-debug].webcie # installeer die hap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu wordt de crontab van de huidige gebruiker geinstalleerd, en dat wil je!&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Cron</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Cron"/>
				<updated>2017-02-23T19:24:02Z</updated>
		
		<summary type="html">&lt;p&gt;Ludop: Created page with &amp;quot;De cronjobs zijn alle scripts in &amp;lt;code&amp;gt;/scripts/cron&amp;lt;/code&amp;gt; die om de &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt;-tijd uitgevoerd moeten worden.  De lijst van alle jobs die daadwerkelijk uitgevoerd worde...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De cronjobs zijn alle scripts in &amp;lt;code&amp;gt;/scripts/cron&amp;lt;/code&amp;gt; die om de &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt;-tijd uitgevoerd moeten worden.&lt;br /&gt;
&lt;br /&gt;
De lijst van alle jobs die daadwerkelijk uitgevoerd worden staan in het &amp;lt;code&amp;gt;/scripts/cron/crontab_vm-www[|-debug].webcie&amp;lt;/code&amp;gt; bestand. Het formaat wat hiervoor gebruikt wordt, is tot de dag van vandaag een magisch mysterie. Gelukkig is er een antwoord op [http://www.lmgtfy.com/?q=google google] te vinden.&lt;/div&gt;</summary>
		<author><name>Ludop</name></author>	</entry>

	</feed>