It’s alive!

dinsdag 8 januari 2013 in Sonstiges. Permanente link | 7 reacties

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

donderdag 12 juli 2012 in Programmeren. Permanente link | Geen reacties

Mijn hersenen bloeden een beetje:

[via]

Goeie bloederige help, in 4k

donderdag 10 mei 2012 in Programmeren. Permanente link | Geen reacties

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

vrijdag 27 april 2012 in Kinderen, Programmeren. Permanente link | 6 reacties

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)

zaterdag 9 augustus 2008 in Sonstiges. Permanente link | 3 reacties

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)

vrijdag 8 augustus 2008 in Sonstiges. Permanente link | 4 reacties

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

donderdag 7 augustus 2008 in Sonstiges. Permanente link | 14 reacties

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

maandag 26 juni 2006 in Programmeren. Permanente link | 16 reacties

…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

woensdag 21 juni 2006 in Computers en dingen. Permanente link | 12 reacties

‘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

woensdag 3 mei 2006 in Programmeren. Permanente link | 2 reacties

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

woensdag 22 maart 2006 in Programmeren. Permanente link | 11 reacties

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

zondag 19 maart 2006 in Programmeren. Permanente link | 4 reacties

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?

    vrijdag 10 maart 2006 in Sonstiges. Permanente link | 2 reacties

    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.

    maandag 5 december 2005 in Computers en dingen. Permanente link | Geen reacties

    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

    donderdag 10 november 2005 in Boeken. Permanente link | Geen reacties

    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

    Vriendjes

    Zoek

    <insert standard disclaimer>

    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.

    Valideert, in principe: css & xhtml.
    Gemaakt met WordPress.
    Syndicatie: Entries (RSS) en commentaar (RSS).



    ISSN 1780-1338