Michel Vuijlsteke's weblog

Tales of Drudgery & Boredom.

Tag: Programmeren (pagina 1 van 2)

It’s alive!

Zoudt ge willen geloven dat ik van mijn leven nog nooit een programma geschreven had om Conway’s Life te doen?

Tot daarnet, dus: 

Screen Shot 2013 01 08 at 20 50 12

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. 

Life, in APL

Mijn hersenen bloeden een beetje:

[via]

Goeie bloederige help, in 4k

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.

Meer hier ([via].

QB

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. 

Spelletje (ii)

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):

O_animX_anim

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)

Spelletje (i)

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.

En dáárna: grafisch verzorgen.

Op zoek naar programmeertaal

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.

Ha!

Schlurpts

…dat is het geluid van mijn hart dat bloedt.

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?

Pfff.

Prutsen en doen

‘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:

  1. <ul id="ding">
      <li>hoofding
        <ul class="spel"><li>item</li>
          <li>item</li></ul>
      </li>
      <li>hoofding
        <ul class="spel"><li>item</li>
          <li>item</li></ul>
      </li>
    </ul>
  2. <h3>hoofding</h3>
    <p>item</p>
    <p>item</p>
    <h3>hoofding</h3>
    <p>item</p>
    <p>item</p>
  3. <p>hoofding
    <small>item, item</small></p>
    <p>hoofding
    <small>item, item</small></p>

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>

Interactief

Wijs!

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.

Debugging

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):

Debugging

…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”.

Ik laat ergens een kalender zó verschijnen:

Response.Write(getCalendar(DateSerial(thisYear,thisMonth,1), beginDay, endDay))

 …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

Response.Write(getCalendar(DateSerial(thisYear,thisMonth,1), 21, 24))

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:

Response.Write(getCalendar(DateSerial(thisYear,thisMonth,1), beginDay+0, endDay+0))

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.

Geschreven al luisterend naar: Claude Nougaro – Au théâtre des Champs Elysées disc 2 – Comedie musicale

Voor ’t gemak

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:

  1. select * from tblEvents
  2. select * from tblEvents where deptID=[dept]
  3. select * from tblEvents where typeID=[type]
  4. select * from tblEvents where eventdate=[date]
  5. select * from tblEvents where typeID=[type] and eventdate=[date]
  6. select * from tblEvents where deptID=[dept] and eventdate=[date]
  7. select * from tblEvents where typeID=[type] and deptID=[dept]
  8. 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.

Proper, mijn gedacht.

Uiyngk?

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.

Geschreven al luisterend naar: Arbeid Adelt! – Des duivels oorkussen – Nergens heen

True. True.

Op Overheard in the Office:

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.

It’s funny cause it’s true.

dixitprogrammeren

Boeken, alsnog

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:

Backend

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.

En ook een website natuurlijk. Met informatie over auteurs, en over boeken, en over series en alles. Zucht.

Al die tijd, en zeggen dat ik er nu geen meer heb.

Geschreven al luisterend naar: Elvis Costello & The Brodsky Quartet – The Juliet Letters – Damnation’s Celler

database boeken

Oudere berichten

© 2016 Michel Vuijlsteke's weblog

Thema gemaakt door Anders NorenBoven ↑