Zoudt ge willen geloven dat ik van mijn leven nog nooit een programma geschreven had om Conway’s Life te doen?
Tot daarnet, dus:
Een bord vullen met random hier en daar cellen. Alle cellen afgaan: elke levende cel met minder dan twee of meer dan drie levende buren, gaat dood, en alle dode cellen met juist drie levende buren, wordt ook levend. En herbeginnen.
Simpel als goeiendag, maar het gevoel van bloody hell het lééft als uw eerste glider komt voorbijgegleden of uw traffic light staat te blinken: prijsloos.
Vorig jaar maakte hij deze (“basically a mix of spheretracing, orbit traps, fake ambient occlusion and a little bit post postprocessing timed with some nice 4klang synth”):
Dit jaar maakte hij deze:
Zegt de mens:
It’s a mix of shere-tracing, fake ambient occlusion and a lot of post-processing. And it took me nearly two months to complete it. The shader basically encapsulates a sphere-tracing based raymarcher for a single fractal formula with camera handling. An extra post-processing shader adds effects like god-rays, tv-lines and noise to make the result look more interesting and less ‘sterile’. The different intro parts are all parameter and camera position variations of the same fractal.
Voor de duidelijkheid: die “4k”, dat wil zeggen dat het (gecompileerde, uiteraard) programma dat dit maakt maximum 4096 bytes lang mag zijn. Uitgeschreven zijn dat 64 lijntjes van 64 karakters.
Sinds er Windows 8 op de computer staat, werkte Warcraft III niet meer, zei Louis. En ik moest kijken wat er aan de hand was.
Blijkt: hij startte Warcraft op met een verkeerde shortcut. Die naar Reign of Chaos in plaats van die naar Frozen Throne (want ik had de upgrade er ook op gezet — ja, helemaal legaal, van de originele CD’s, zelfs), en dat liep verkeerd.
Enfin, shortcut in de startbalk gezet, Louis content.
Op weg naar die oplossing kwam ik voorbij allerlei dingen die nog op de computer stonden, en waar ik al half van vergeten was dat ze erop stonden. Een oude Age of Empires III, bijvoorbeeld. Waar Louis nu al een volledige avond op gespeeld heeft.
En een directory met de naam QB, die ik al sinds jaar en dag op al mijn PC’s zet: QuickBasic 4.5. Van 24 jaar geleden, en nog altijd even fantastisch, vind ik.
Louis vroeg wat dat was, en ik heb het hem in de rapte getoond:
cls input "Wat is jouw naam? ", f$ for t=1 to 100 print "Hallo", f$, t next t
Uitgelegd:
cls is “maak het scherm leeg”
input wil zeggen “stel een vraag en zet het resultaat in wat er na de komma staat” (in dit geval f$ — die $ staat er om te zeggen dat het tekst mag zijn, als er gewoon f stond, zou het alleen getallen aanvaarden)
for…next wil zeggen “geef t de waarde 1, doe dan iets, maak t eentje groter, en blijf dat doen tot t 100 is”
print wil zeggen: zet iets op het scherm, in dit geval “Hallo”, en dan wat er in f$ gezet werd, en dan de waarde die t nu heeft (dus eerst 1, dan 2, dan 3, enzoverder)
Louis: oh! maar als ik zeg dat mijn naam Louis is, dan gaat hij honderd keer “Hallo Louis” zeggen!
Programma gerund, en jawel hoor: ik denk dat ik lichtjes in zijn ogen heb gehoord.
En ik denk dat ik dat eens ga beginnen aankweken, programmeerskills.
Bijna geen tijd voor niets gehad, vandaag, maar in de rapte toch nog aan de slag gegaan met pygame.
Typisch, natuurlijk: ik zou eigenlijk moeten de computer moves programmeren, maar ik heb mij eerst op het grafische en op de distributie gegooid.
Nu ja, gegooid: eens uitgeprobeerd wat het allemaal doet. Ik heb een achtergrond en ik heb beeldjes voor de pionnen en zo. Qua teaserachtig, de beeldjes om aan te duiden dat het aan speler A of speler B is (de pionnen en zo zelf zullen niet zo irritant bewegen, natuurlijk):
En ik ben erin geslaagd om het in een executable te gooien. Nu ja, niet dat dat moeilijk was of zo, maar toch. Het voelt altijd fijn aan als iets gecompileerd kan worden.
Morgen verder!
(tussen het leeghalen van de keuken door, that is)
Vanalles gedaan vandaag, en pas vanavond aan mijn spelletje begonnen. Het is Python geworden, de programmeertaal. Omdat ik er veel goed van gehoord heb, en omdat ik zin had om eens een taal te leren waar ik nog nooit in gewerkt had.
Het is een beetje objectgeoriënteerd, mijn spelletje, omdat dat nu eenmaal kan in Python. Het had ook niet-OO gekund, maar hey, zo is het nu eenmaal.
Het spelbord zit in een class, met een paar methodes eraan vast: eentje om het bord te tekenen, eentje om een zet te doen, en eentje om te kijken of er een winnaar is. En het bord zelf, de vakjes, zitten allemaal in één string van 25 karakters, haha.
Ik heb voorlopig enkel de hoofdloop van het spel staan: een nieuw bord maken, en zolang er geen winnaar is, de speler doen spelen. Uiteindelijk komen daar twee spelers in, nu heb ik alleen nog maar een functie voor menselijke speler (teken bord, vraag zet en zorg ervoor dat hij geldig is, doe zet).
En dit is wat het tot nog toe doet:
Turn 1
a b c d e +===========+ 1 | | 2 | | 3 | | 4 | | 5 | | +===========+ Player O, enter your move (a-e or 1-5):
Er zijn twee spelers, O en M. Het speelbord is 5×5, en spelers kunnen om beurten een zet doen aan de linkerkant of langs boven. Nu is speler O aan zet. Stel dat hij een pion op B binnenschuift, dan wordt dit de situatie:
a b c d e +===========+ 1 | O | 2 | | 3 | | 4 | | 5 | | +===========+ Player M, enter your move (a-e or 1-5):
M zet een pion op 1, en daarmee verschuift de pion van O naar rechts:
Turn 2
a b c d e +===========+ 1 | M O | 2 | | 3 | | 4 | | 5 | | +===========+ Player O, enter your move (a-e or 1-5):
…en zo dus verder. Het is niet compleet evident spelen, omdat het spelbord voortdurend verschuift, maar het is ook geen schaken natuurlijk. En na de negende zet kan het er bijvoorbeeld zo uitzien:
Turn 10
a b c d e +===========+ 1 | M O M M | 2 | M O O | 3 | M M O O M | 4 | O M O M | 5 | O O | +===========+ Player O, enter your move (a-e or 1-5):
Zo. Next up: de computer doen bewegen. Ik denk eerst eens random om te zien wat het doet, en dan eens brute kracht, drie ply of zo. En dan pas slimmer werken.
Ik heb nog eens zin om iets te programmeren. Iets grafisch, een spelletje, maar dan wel om na te denken—dus niet actiegewijs in 3D of zo.
Geen idee in welke taal ik het nu zou doen, en het kan me ook niet echt schelen. Java? Of flash? Of iets anders? Ik ga eens rond beginnen kijken.
Wát ik ga doen, dat weet ik wel al. Een eenvoudig spelletje dat ik ooit in de jaren 80 in C en dan C++ gemaakt heb, en dan in de jaren 90 in java (met Visual Café, ik ga het nooit vergeten), en daarna nog een paar keer in ColdFusion.
Een bord van 5×5, en men kan er dingen in schuiven van aan twee zijkanten. Doel is om vijf op een rij te hebben. Speler en computer doen om beurten een zet, en ‘t is met een eenvoudig minimax-ding om de zetten van de computer te berekenen.
Ik ben aan een WordPress-template aan het programmeerderen.
Niet “aan het programmeren”. Want “programmeren”, dat impliceert serieus werken. WordPress moedigt serieus werken niet aan.
Scheiding tussen inhoud en presentatie is er nauwelijks, abstractie wordt er nauwelijks gemaakt, en vies werken wordt praktisch aangemoedigd.
Het is dan ook altijd weer schipperen tussen binnen de lijntjes van de WordPress-functies te werken en een plugin schrijven en gewoon brutekracht hap smijt MySQL-queries en PHP te doen… vies, vies, vies. Ick ick ick.
En het stomme van de zaak: uiteindelijk zijn dat allemaal zo geen ingewikkelde zaken, en uiteindelijk heb ik soms de indruk dat het bijna gemakkelijker zou zijn om het allemaal zelf te programmeren.
Tot ik kijk wat er allemaal zou moeten gedaan worden, en dat het toch wel weer het wiel uitvinden zou worden… urgh ack crap.
Toch maar eens kijken naar een betere oplossing dan WordPress? Drupal toch nog?
‘t Is niet genoeg dat ik op het werk met css en dingen bezig ben, nà mijn uren is het ook van dat: trekken en duwen en duwen en trekken aan templates en dingen in WordPress.
Eigenlijk feitelijk is dat wel wijs, zo prutsen met templates. Hier ook weer: gewoon het hoofd erbij houden, niet panikeren, en met enige regelmaat wat afstand nemen en een reality check uitvoeren.
Zoals daarnet: ik gebruik een aantal plugins en wat eigen php om een aantal dingen te doen die WordPress niet van zichzelf kan doen. Dat geeft als gevolg dat ik door drie keer gelijkaardige dingen, drie verschillende mark-ups kreeg:
Die “hoofding” en “item” moeten telkens (ongeveer) dezelfde style krijgen, dus dat gaf op geen tijd atrociteiten in de zin van
div#een ul#ding li, div#twee h3, div#drie p { regel regel regel }
en allerlei kunst– en vliegwerk om die <small>s in display:block te krijgen, en prutserijen met uitzonderingen op uitzonderingen (ul li ul.bla li.gerief en zo).
Enfin, ‘t had geen uitzicht meer.
En dus—kogel door kerk te G.: de plugins zelf bepoteld. De output daarvan geharmoniseerd. Het kwaad bij de wortel aangepakt.
Tja, veel plugins upgraden zal er dus niet aan te pas moeten komen. Of de wijzigingen zouden ook moeten opnieuw overgenomen worden natuurlijk. Heb ik mezelf lekker (heel erg relatief) onmisbaar gemaakt!
<rant> kijk hé! dààr krijg ik dus het vliegend heen en weer van bij WordPress: die hele plugin-architectuur die allemaal heel erg proper zou kunnen zijn, maar dat in de praktijk helemaal niet is. Het zou zo goed zijn mochten al die plugins hun gegevens gewoon als een structuurtje teruggeven in plaats van html en data vrolijk te mixen. Maar nee: zet er nog maar een hardgecodeerd tagsken tussen mannen! Toe maar! Een stijltje meer of minder, daar kijken wij niet op! En uiteraard structureren wij al onze gegevens met <li>’s, ah ja, da’s toch, hoe-was-het-ook-al-weer, semantisch zeker hé? </rant>
Ik heb indertijd nog dingen gemaakt met Inform 6. En, euh, meer dan twintig jaar geleden dingen gemaakt met The Quill.
Met “dingen” bedoel ik dan wat men nu Interactive Fiction noemt, en indertijd Adventure Games. Of, nadat er ook point & click-dingen waren zoals de King’s/Police/Space Quests: Text Adventures.
Werelden bouwen is wijs, zelfs al zit er niemand anders in. En met Inform 7 wordt het wel heel erg eenvoudig. Natural language programming! Hoera! Kijk, dit is de broncode:
“House”
by Michel Vuijlsteke
Section 1 – Setting things up
The player is wearing a bathrobe and some slippers.
The description of the bathrobe is “It’s a dark blue striped bathrobe with deep pockets.” The description of the slippers is “They’re pretty threadbare slippers.”
The bathrobe is the player’s holdall.
Section 2 – Ground floor
The Hallway is a room. “You are in a dark and narrow hallway. Heavy oak beams loom overhead. A rickety door, all wood and metal and jingly glass bits, leads outside. [if the curtains are not in the room]A doorway leads east [otherwise]Gray curtains hang down from the ceiling on the east wall[end if] and a large brown wardrobe looms against the west wall.”
The front door, some beams, some curtains and a wardrobe are scenery in the hallway.
The wardrobe is closed and openable. It contains a dark green overcoat. The overcoat is wearable. The description of the overcoat is “The coat is a dark green ankle-length affair, shiny in patches and with its lining hanging out.”
The front door is south of the hallway and north of the street. The front door is a lockable and unlocked door. “[if open]The front door is open, gently swaying in the wind. [otherwise]The front door is shut.”
A door-mat and a white desk are in the hallway. A small brass key unlocks the front door. The white desk is pushable between rooms.
Instead of taking the desk, say “You can barely lift the desk, let alone carry it. You may be able to push it around though.” Instead of taking the door-mat, say “Ugh! It’s all muddy!” Instead of taking the front door, say “The door may be rickety, but it’s still surprisingly well attached to the door jamb.” Instead of taking the beams, say “You can’t quite reach the beams.” Instead of taking the curtains: say “You tug on the curtains. They practically fall apart in your hands, revealing a dark room behind them.”, remove the curtains from play.
The Street is a room. “You are standing in the middle of an empty, weirdly modern street running through muddy fields. Sand crunches underfoot. The only house in the street that doesn’t have its doors and windows boarded is a drooping affair to the north.”
Some sand is scenery in the street. Instead of taking the sand, say “You consider pocketing a handful of damp sand but think better of it.”
The house is scenery in the street. The description of the house is “The house looks like a mediaeval affair hidden behind peeling nineteenth century plasterwork. It has quite obviously seen better times. There’s a rickety door and a window with half-drawn blinds on the ground floor.”
The window is scenery in the street. “The window is gray with caked on dust.”
The street is outside of the hallway.
En dat geeft dan bijvoorbeeld dit:
House An Interactive Fiction by Michel Vuijlsteke Release 1 / Serial number 060503 / Inform 7 build 3K27 (I6/v6.31 lib 6/10N) SD
Hallway You are in a dark and narrow hallway. Heavy oak beams loom overhead. A rickety door, all wood and metal and jingly glass bits, leads outside.
Gray curtains hang down from the ceiling on the east wall and a large brown wardrobe looms against the west wall.
You can see a door-mat and a white desk here.
>look at myself As good-looking as ever.
>inventory You are carrying: a bathrobe (being worn and open but empty) some slippers (being worn)
>examine bathrobe It’s a dark blue striped bathrobe with deep pockets.
>put slippers in bathrobe (first taking them off) You put the slippers into the bathrobe.
>look in wardrobe You can’t see inside, since the wardrobe is closed.
>open it You open the wardrobe, revealing a dark green overcoat.
>wear overcoat (first taking the dark green overcoat) You put on the dark green overcoat.
>open door You open the front door.
>examine door The front door is open, gently swaying in the wind.
>go out
Street You are standing in the middle of an empty, weirdly modern street running through muddy fields. Sand crunches underfoot.
The only house in the street that doesn’t have its doors and windows boarded is a drooping affair to the north.
>get sand You consider pocketing a handful of damp sand but think better of it.
>look at the window The window is gray with caked on dust.
>n Hallway You can see a door-mat and a white desk here.
>get door-mat Ugh! It’s all muddy!
>get desk You can barely lift the desk, let alone carry it. You may be able to push it around though.
>look Hallway You are in a dark and narrow hallway. Heavy oak beams loom overhead. A rickety door, all wood and metal and jingly glass bits, leads outside.
Gray curtains hang down from the ceiling on the east wall and a large brown wardrobe looms against the west wall.
You can see a door-mat and a white desk here.
>get curtains You tug on the curtains. They practically fall apart in your hands, revealing a dark room behind them.
>get beams You can’t quite reach the beams.
>get desk You can barely lift the desk, let alone carry it. You may be able to push it around though.
Een uurtje werk, twee kamers en het begin van een puzzel (het bureau verplaatsen tot onder de balk, wie weet zit daar wel iets in!), en ik heb er serieus goesting in om er aan verder te doen.
Ach, wereldliteratuur it ain’t, en ik ben hoedanook niet van plan om dergelijke dingen op de wereld los te laten, maar het is ongelooflijk wijs om te prutsen, en Inform 7 is echt machtig.
Het heeft zo zijn voordelen, met een klein team ontwikkelen. Veel nadelen ook, vooral als “klein team” eigenlijk betekent “één mens alleen die ontwerpt en programmeert en test”, maar ook een aantal voordelen.
Het grootste voordeel is wel dat er geen tijd verloren gaat aan coördinatie tussen programmeurs. Geen coderingsafspraken, geen code reviews, geen roadmaps, niets behalve wat in mijn eigen hoofd zit—al is er uiteraard wel een roadmap en een as-I-code-it-handleiding, en zijn er richtlijnen waar ik me aan houd.
Geen CVS nodig ook—al zou ik er wàt graag één installeren, de tijdskost is niet te verrechtvaardigen: als er ergens iets gewijzgd is in een bestand, is het (in principe) mijn eigne verantwoordelijkheid.
Ook geen bug tracking ding: al zou ik er, opnieuw, enorm graag één hebben om (vooral anderen) wat meer zicht te verschaffen in planning en dingen, de moeite is de toegevoegde waarde niet waard.
…en dus is dit voor het ogenblik mijn planning en mijn bug tracking in één (klik voor detail):
…een boekje, een pen, en quality control door de Little Gods of Debugging.
En behalve dat: ‘t zijn de domste bugs eerst natuurlijk. Pak nu het vierdevoorlaatste item op delijst met te fixen bugs voor vandaag: “highlight day when in day overview”.
…en dat werkt niet. Doet niet wat het moet doen. Het zou moeten een maandkalendertje tonen met daarin de dagen tussen beginDay en endDay in een ander kleurtje, maar de dagen blijven gewoon niet-gekleurd staan. Alle code is juist hoor, en als ik bijvoorbeeld
zeg, dan worden proper de 21ste tot de 24ste gehighlight. Zo’n typische typing-issue, want dit werkt wel, als ik het er vingerdik op leg dat het om getallen moet gaan:
Ja, ik weet ook niet waarom. Ik dacht nu echt dat asp vbscript weak typing deed, dat het niet uitmaakte of ik een getal als een string dan wel als een getal doorgeef… nee dus.
Er zijn stapels prutserijen in allerlei programma’s die de mensen een stapel werk zouden besparen mochten ze ze kennen. Photoshop is zo’n notoir programma dat vol met shortcuts en handigheidjes zit, en ook de Microsoft Office-programma’s lopen over van de nuttige features die niemand praktisch gebruikt.
Maar ook dingen als T-SQL, dat nochtans een relatief beperkte lijst toch wel goed gedocumenteerde functies heeft, die met andere woorden op een relatief beperkte tijd allemaal eens zelf te doorlopen en uit te proberen zijn, bevat zaken die het leven veel gemakkelijker zouden kunnen maken maar dat toch wellicht vaak niet doen wegens onbekend en dus onbemind.
[phew, ik ben zo content dat ik door die zin geraakt ben, dat het me eigenlijk zelfs niet al te veel meer kan schelen of hij nog begrijpbaar is]
Stel er moeten op een website events getoond worden, afhankelijk van een aantal mogelijke factoren. Bijvoorbeeld dat alle events van een bepaald type getoond moeten worden en/of van een bepaalde dag en/of van een bepaald departement.
Naieve structuur van de database:
tblEvents
ID
title
deptID
typeID
eventdate
description
Dat geeft, euh, acht mogelijke combinaties:
select * from tblEvents
select * from tblEvents where deptID=[dept]
select * from tblEvents where typeID=[type]
select * from tblEvents where eventdate=[date]
select * from tblEvents where typeID=[type] and eventdate=[date]
select * from tblEvents where deptID=[dept] and eventdate=[date]
select * from tblEvents where typeID=[type] and deptID=[dept]
select * from tblEvents where typeID=[type] and deptID=[dept] and eventdate=[date]
In het programmeren wordt dat al snel iets als
queryString="select * from tblEvents" if ([type] not null OR [dept] not null OR [date] nor null) then queryString=queryString & " where 1=1 " if ([type] not null) then queryString=queryString & " and typeID="&[type] end if if ([dept] not null) then queryString=queryString & " and deptID="&[dept] end if if ([date] not null) then queryString=queryString & " and eventdate="&[date] end if end if
Mja. Beetje vies natuurlijk. Dat soort dingen kan ook in de database zelf gebeuren. Eén mogelijkheid is met case when (zie bijvoorbeeld alhier voor een voorbeeldje), maar in dit geval gaat het nog veel sneller met coalesce:
select * from tblEvents where typeID=coalesce([type],typeID) and deptID=coalesce([dept],deptID) and eventdate=coalesce([date],eventdate)
Ha! Die coalesce aanvaardt een onbeperkt aantal parameters en geeft de eerste niet-NULL-waarde terug.
Dus: als [type] en [dept] niet meegegeven werden en [date] wel, dan wordt de query hierboven
select * from tblEvents where typeID=typeID and deptID=deptID and eventdate=[date]
Dat zou kunnen opgebouwd worden in een query en zo, maar nóg veel gemakkelijker (om niet te zeggen properder) is het om het allemaal in een stored procedure te smijten. Dat wordt dan iets als
create procedure getEvents @type int=null, @dept int=null, @date datetime=null as select * from tblEvents where typeID=coalesce(@type,typeID) and deptID=coalesce(@dept,deptID) and eventdate=coalesce(@date,eventdate)
…en dan proper schone aanroepen als bijvoorbeeld exec getEvents voor alle evenementen, en exec getEvents @deptID=5 voor alle evenementen van departement 5, en exec getEvents @typeID=3, @dept=6 voor alle evenementen van type 3 en departement 6.
Er zijn zo van die momenten dat ik bekijk wat ik een maand of twee geleden geschreven heb en dat ik mij afvraag what the drat was I thinking:
function getCalendar(thisDate,beginDay,stopDay)
dim ret
dim startday, endday, prv, nxt, totalTD, dayTmp, calTmp
ret=""
if (thisDate="") then
thisDate=now()
end if
daysInMonth=day(dateadd("d",-1,dateadd("m",1,dateserial(year(thisdate),month(thisdate),1))))
startday=Weekday(dateserial(year(thisdate),month(thisdate),1),vbMonday)
endday=Weekday(dateserial(year(thisdate),month(thisdate),daysInMonth),vbMonday)
totalTD=daysInMonth+(startday-1)+(7-endday)
prv=DateAdd("m",-1,thisDate)
nxt=DateAdd("m",1,thisDate)
ret=ret&"<div class=""colbox1""><table id=""calendar"" cellspacing=""0"" cellpadding=""0"" summary="""&pageCalendarSummary&""">"
ret=ret&"<caption class=""nav""><a href=""events/"&year(prv)&"/"&month(prv)&""" title="""&calendarPrevMonth&""">««</a> "
ret=ret&"<a href=""events/"&year(thisDate)&"/"&month(thisDate)&""" title="""&MonthName(Month(thisDate))&" "&year(thisDate)&""">"
ret=ret&MonthName(Month(thisDate))&" "&year(thisDate)
ret=ret&"</a> <a href=""events/"&year(nxt)&"/"&month(nxt)&""" title="""&calendarNextMonth&""">»»</a></caption>"
ret=ret&"<tr>"
for f=1 to 7
dayname=WeekdayName(f,false,vbMonday)
ret=ret&"<th scope=""col"" abbr=""&dayname&"" title=""&dayname&"">"&ucase(left(dayname,1))&"</th>"
next
ret=ret&"</tr>"
qry="select datefrom, case when dateuntil is null then datefrom else dateuntil end dateuntil from vwNewsAll where event=1 and "
qry=qry&"((month(datefrom)="&month(thisDate)&" or month(dateuntil)="&month(thisDate)&") or "
qry=qry&"(month(datefrom)< ="&month(thisDate)&" and month(dateuntil)>="&month(thisDate)&")) order by datefrom"
rs.Open qry, cn
dim eventDays(33)
while (not(rs.EOF))
'ret=ret&rs.Fields("datefrom")&"--"&rs.Fields("dateuntil")&"<br />"
'ret=ret&month(rs.Fields("datefrom"))&" "
tmpStartDay=rs.Fields("datefrom")
tmpEndDay=rs.Fields("dateuntil")
if (tmpStartDay<dateserial (year(thisDate), month(thisDate), 1)) then
tmpStartDay=1
else
tmpStartDay=day(tmpStartDay)
end if
if (tmpEndDay>DateSerial(year(thisDate), month(thisDate), daysInMonth)) then
tmpEndDay=daysInMonth
else
tmpEndDay=day(tmpEndDay)
end if
for q=tmpStartDay to tmpEndDay
eventDays(q)=1
next
rs.MoveNext
wend
rs.Close
dayTmp=0
for f=1 to totalTD
calTmp=f-startday+1
if (dayTmp=0) then
ret=ret&"<tr>"
end if
if (DateSerial(year(thisDate), month(thisDate), calTmp)=dateserial(year(now()),month(now()),day(now()))) then
ret=ret&"<td class=""today"">"
elseif (calTmp< =stopDay and calTmp>=beginDay) then
ret=ret&"</td><td class=""eventday"">"
else
ret=ret&"</td><td>"
end if
if ((f<startday ) or (f>(daysInMonth+startday-1))) then
ret=ret&" "
else
if (eventDays(calTmp)=1) then
ret=ret&"<a href=""events/"&year(thisDate)&"/"&month(thisDate)&"/"&calTmp&""">"&calTmp&"</a>"
else
ret=ret&calTmp
end if
end if
ret=ret&"</startday></td>"
if (dayTmp=6) then
ret=ret&"</tr>"
end if
if (dayTmp=6) then
dayTmp=0
else
dayTmp=dayTmp+1
end if
next
ret=ret&"</dateserial></table>"
ret=ret&"<ul class=""callinks"">"
ret=ret&"<li><a href=""events/"">Current/upcoming</a></li>"
ret=ret&"<li><a href=""events/thisweek/"">This week</a></li>"
ret=ret&"<li><a href=""events/nextweek/"">Next week</a></li>"
ret=ret&"<li><a href=""events/"&year(now())&"/"&month(now())&""">This month</a></li>"
ret=ret&"</ul></div>"
getCalendar=ret
end function
Nope: geen flauw gedacht. Your guess is as good as mine.
Coder #1: I liked the fix you did on that bug. Coder #2: When in doubt, just take away access from the user. It’s a fascist approach, but I swear by it.
Ik was er nu zó het hart van in dat die boekendatabasewebsite niet meer werkte, dat ik hem in de rapte alsnog rechtgeduwd heb.
De backend verhuist van computer naar computer, maar ik vrees dat ik er ook al jàren geen boeken meer in gestoken heb. Ik steek voorlopig sporadisch en aan de hand van een barcodelezer van tijd tot tijd eens wat boeken in Book Collector, maar ook dat gebeurt maar met een half hart.
Ik blijf mezelf voorhouden dat van zodra mijn boeken weer in een bibliotheek staan, ik ze allemaal ga klasseren.
Maar ondertussen… miljaar wat voor tijd heb ik over de jaren niet gestoken in die database! Feest uw ogen op de back-end in Access:
Al mijn boeken (indertijd), met alle gegevens die ik erover kon vinden, met ingescande covers toen Amazon nog niet bestond, met voor anthologieën elk individueel verhaal (auteur, pagina van-tot, omschrijving), met kruisverwijzingen van overal naar overal… ‘t was wel wat.
En de interface in Access was helemaal naar mijn hand gezet, met ook onder meer een webbrowser in Access, en alles.
Alles wat hier staat is mijn eigen opinie. Het wordt niet nagelezen of goedgekeurd door mijn werkgever voor het on-line komt, en ik bied geen enkele garantie voor kwaliteit of correctheid.
Mijn werkgever is het niet noodzakelijk eens met wat ik schrijf, en het spreekt vanzelf dat hij dan ook op geen enkele wijze aansprakelijk kan zijn voor wat ik hier publiceer.
Ter info
Eén van mijn e-mailadressen is michel [at] zog punt org. Normaal gezien antwoord ik daar, buiten de kantooruren, onmiddellijk op.