Archief voor de categorie 'Programmeren'

 

“Zware menselijke fout”, Bourgeois? Neen, niet echt

zondag 14 oktober 2012 in Programmeren. Permanente link | 12 reacties

Schrijft de Gazet Van Antwerpen

Een voorzitter van een bureau in Zoersel heeft volgens Vlaams minister Geert Bourgeois een “zware menselijke fout” gemaakt, door zijn computer in standby-modus te laten staan. Een deel van de registratie van de uitgebrachte stemmen moet daardoor manueel opnieuw gebeuren. 

Wat een compleet laffe en laagbijdegrondse uitspraak, om de schuld van dat ding in Zoersel bij de voorzitter van het stembureau te leggen. 

Ik heb op de televisie die stemcomputers zien piepen en rode lichten doen afgaan als mensen hun kaartje er te vroeg uit trokken, of omgekeerd in staken. 

De fout en de schuld en ligt uiteraard 100% bij de maker van de software van de stemcomputer: een systeem dat als een zot begint lawaai te maken en blijkbaar BAHUUT BAHUUT doet bij het minste, en dat dan niets doet als het hele systeem na een bepaald uur nog altijd in testmodus staat, dat is een slecht gemaakt systeem. 

In De Standaard, die Radio 1 citeert, is het ook van dat:

Volgens minister van Bestuurszaken Geert Bourgeois zou het grootste deel van de fouten het gevolg zijn van het niet correct gebruiken van de machines. Dat zou 80 tot 90 procent van de problemen verklaren. Slechts minder dan 20 procent heeft echt met de computers te maken, zei hij op Radio 1.

Pfeh. 

Zelfs als de fout bij de gebruiker ligt, is het nog altijd de schuld van de maker. Zeveraars. 

Variabelen en scoping en dink

zondag 19 augustus 2012 in Programmeren. Permanente link | Geen reacties

Grmbl, grmbl. 

Ik maak een custom taxonomy aan in WordPress, ik geef die de propere naam “author”, en alles lijkt in orde te zijn: ik kan aan posts meer dan één author geven (in plaats van standaard één, die dan nog eens een WordPress-user moet zijn), daar zijn archieven van, en tag clouds en watnog, en dat linkt allemaal proper naar elkaar zonder al te veel moeite.

De auteurs, om ze alfabetische te kunnen sorteren, sla ik op als “achternaam – voornaam”, en als ze dan getoond moeten worden, zet ik voornaam voor achternaam. En neen, ik kan er geen rol bij zetten (schrijver, illustrator, vertaler, …), maar bon, ‘t is geen boekendatabase die ik aan het maken ben. 

En alles werkt goed tot er een auteur met één naam toegevoegd wordt, bijvoorbeeld “Moebius” als ik er niet “Giraud – Jean” van zou maken: daar geeft WordPress een lege archiefpagina voor. 

Aargh! 

Debug, debug, debug. Blijkt dat de query om de lijst van posts van een auteur met voor- en achternaam er zo uitziet:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (246) ) AND (wp_posts.post_author != 0) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 20

en een query voor een auteur met één naam zo:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (138) ) AND (wp_posts.post_author = 0) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 20

Het verschil al gezien? Ha, inderdaad de ene doet 

(wp_posts.post_author != 0)

de andere doet 

(wp_posts.post_author = 0)

Toink? Als de taxonomieterm twee of meer woorden bevat, zoek dan posts waarvan de WordPress-auteur niet nul is, en anders: zoek posts waarvan de WordPress-auteur wél nul is (en die user bestaat niet). 

Wat in de WordPress-code gewroet, maar niet enorm vreselijk veel zin om daar in te gaan prutsen — en dan maar mijn taxonomie hernoemd van “author” naar “myauthor”: 

update wp_term_taxonomy taxonomy='myauthor' where taxonomy='author';

en dan in functions.php 

register_taxonomy('author', 'post', array( 'hierarchical' => false, …

vervangen door 

register_taxonomy('myauthor', 'post', array( 'hierarchical' => false, …

en taxonomy-author.php hernomen naar taxonomy-myauthor.php: hey presto, alles werkt zoals het zou moeten gewerkt hebben. 

Ik heb niet enorm veel goesting om te gaan kijken wat het precies was, maar ik kan niet anders dan vermoeden dat er érgens een variabele de naam van de taxonomie krijgt ($author in dit geval) en dat die een andere variabele $author overschrijft die ergens gebruikt moet worden om godweetwat in op te slaan, en dat dat op de één of andere manier verkeerd loopt onder zeer specifieke voorwaarden. 

Een interessante bug, denk ik, want treedt herhaalbaar op, zou niet mogen optreden, en is wellicht gemakkelijk te verbeteren. 

Als ik dan nog eens tijd en goesting heb, maak ik een tiketje aan. 

Demo

dinsdag 31 juli 2012 in Programmeren. Permanente link | 2 reacties

Meeemorieesss.

Moleman 2 – Demoscene – The Art of the Algorithms (2012) from Moleman on Vimeo.

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. 

Renaissanceinternetmens

dinsdag 30 augustus 2011 in Programmeren. Permanente link | Geen reacties

Daarnet zat ik met een probleem: een context aangemaakt in de Context-module (één van die fijne modules die in theorie fantastisch zijn maar in de praktijk op, euh, onverwachte momenten niet doen wat ze moeten doen), en in soep.

Context verwacht een machine name voor zijn items, fair enough (al zou ik een echte naam gemakkelijker vinden, dat die nog gewijzigd kan worden). Ik had een context aangemaakt met de fijne naam “Kalender/nieuws ABC”, en dat werkte van de eerste keer perfect hoe ik het wou: als ik op pagina ABC sta, toon dan de blokken “laatste nieuws ABC” en “binnenkort ABC” in twee kolommen naast mekaar onderaan de pagina.

Maar! Dan wou ik een “Kalender/nieuws DEF” maken, en die eerste clonen lukte niet. Die eerste wijzigen, lukte ook niet. Die eerste verwijderen, lukte ook niet. Ahem. Ah ja, die slash werd geïnterpreteerd als een parameterscheidend ding, verdomme. De mannen van Context hadden geen validering voorzien, en ik was niet de enige die er last mee had.

Okay, bon, geen probleem. Naar de server getoogd, mysql in gang gesleurd, show tables om te kijken of er ergens iets context-achtig in staat, hey kijk: een tabel dpl_context! Describe dpl_context toont dat er een name-veld in zit als primary key, select name from dpl_context geeft mij effectief alle namen, update dpl_context set name=’ABC home’ where name like ‘Kalender/nieuws ABC’ doet wat het moet doen, een refresh in Drupal later: hopla, probleem opgelost!

Dat moet, denk ik, zo ongeveer de twintigste keer zijn, de laatste paar dagen, dat ik op mijn twee knieën content ben dat ik de laatste twintig jaar gedaan heb wat ik gedaan heb, en dat ik misschien nergens een echte expert in ben, maar toch bij redelijk wat dingen mee kan spreken.

En dat ik van niet al te veel andere mensen moet afhangen als ik iets wil maken.

Dat zijn de mooiste momenten, in hobby of in werk: als ge het gevoel krijgt dat de afgelopen pakweg twintig jaar effectief ergens voor gediend hebben. :)

DHSC

vrijdag 9 maart 2007 in Programmeren. Permanente link | Eén reactie

Ha. ‘t Is eens wat anders dan Kretschmer of Jung: Your programmer personality type is DHSC.

You’re a Doer.
You are very quick at getting tasks done. You believe the outcome is the most important part of a task and the faster you can reach that outcome the better. After all, time is money.

Ik programmeer bij momenten redelijk snel, ja.

You like coding at a High level.
The world is made up of objects and components, you should create your programs in the same way.

Ik zit inderdaad niet echt graag in de loopgraven. Beetje top-down mens, ik. Mijn laatste ervaring in de loopgraven was, euh, Z80 assembler. Om u een idee te geven. :D

You work best in a Solo situation.
The best way to program is by yourself. There’s no communication problems, you know every part of the code allowing you to write the best programs possible.

Um. Kweetniet. Ik heb er nooit problemen mee gehad om met meer dan één mens tegelijk te pogrammeren aan iets.

You are a Conservative programmer.
The less code you write, the less chance there is of it containing a bug. You write short and to the point code that gets the job done efficiently.

Mwof. Ik vlieg er wel meestal meteen in, en dan komt er soms veel te veel code. Maar dan refactor ik regelmatig wel eens, en durf ik wel helemaal opnieuw te beginnen. De blutsen met de builen, veronderstel ik?

Code search

donderdag 5 oktober 2006 in Programmeren. Permanente link | Eén reactie

Humor, zie ook Kottke:

Heh.

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.

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

Menu

dinsdag 21 maart 2006 in Programmeren, Werk. Permanente link | 2 reacties

Dat is nu dus eens een typische situatie hé: ik moet een menu maken op de website van het werk, en ik zit al een kwartier te debatteren met mezelf hoe ik dat het beste doe.

Probleem is dat het algemene menu alles proper doet zoals het hoort, en databasegegenereerd en zo, maar dat de news & events-pagina’s door andere code gegenereerd worden, uit een ander stuk database, met een volledig andere logica.

So indulge me while I think out loud… Het menu van news & events ziet er voorlopig alsdus uit:

  • Headlines
  • News archive
  • Events calendar
  • Press releases
  • Speeches

Daar moet iets uit komen als

<ul id="leftnav">
  <li class="current"><a href="news/">Headlines</a></li>
  <li><a href="news/archive">News archive</a></li>
  <li><a href="events/">Events calendar</a></li>
  <li><a href="press/">Press releases</a></li>
  <li><a href="speeches/">Speeches</a></li>
</ul>

waarbij die class="current" mee verhuist met de pagina. Al die pagina’s worden door verschillende stukken code gemaakt, en bevatten nog eens onderverdelingen (“events calendar” kan bijvoorbeeld eventsIndex zijn, of eventRange, of eventSingle, etc.), dus het is geen eenvoudige één op één, maar da’s een detail: ik zou een Dictionary kunnen maken (old skool ASP hé, geen asociative arrays of zo) met daarin de menu-items, die aflopen, en de juiste op “current” zetten.

Allemaal goed en wel, maar de reden waarom ik er lastig van loop, ik dat ik voorzie dat dat nieuws zeer binnenkort allemaal uitbreidingen gaat kennen, waardoor er meer dan één niveau zal zijn, en dat ik dan allerlei prutserijen ga moeten uithalen. En: dat ik precies hetzelfde—een te genereren menu van min of meer wisselende complexiteit—ga meemaken op nog andere delen van de website. En dat het weer eens een andere plaats is waar “dingen” moeten aangepast wordenals er “iets” verandert.

Gn. Het ideaal zou zijn om het allemaal eens grondig te herbekijken, maar daar is nu geen tijd voor: ‘t is zaak van parer au plus pressé en af te raken van een gescheiden intranet/internetnieuws en een Typepad-account overbodig maken en een archief ontsluiten.

Zucht.

Kijk zie, het van u afschrijven is therapeutisch én handig. Ik ga het voorlopig houden op simpel en eenvoudig (en, helaas, vies): domweg een lijstje in één niveau, uitzonderingsmaatregel voor news & events, mooi documentere in de site manual, en dan zien we wel waar we uiteindelijk op uitkomen als het ooit nodig is om complexere dingen te gebruiken.

Le mieux est l’ennemi du bien le mieux est l’ennemi du bien le mieux est l’ennemi du bien le mieux est l’ennemi du bien le mieux est l’ennemi du bien le mieux est l’ennemi du bien……

Geschreven al luisterend naar: P.J. Harvey – Is This Desire? – A Perfect Day Elise

update: the best laid plans of mice & men… Ik heb het uiteindelijk nog simpeler gedaan:

Response.Write("<li"&iif(thisLeftnav="latest"," class=""current""","")&"><a href=""news/"">Actualités</a></li>")
Response.Write("<li"&iif(thisLeftnav="archive"," class=""current""","")&"><a href=""news/archive/"">Archives</a></li>")
Response.Write("<li"&iif(thisLeftnav="events"," class=""current""","")&"><a href=""events/"">Calendrier</a></li>")

Ja, ‘t is vies. En dan? :)

O ja, VBScript (ugh yuck bleah, I know) heeft blijkbaar geen iif, terwijl dat toch wel een serieus handig ding is. Dan maar in de rapte:

function iif(sTest, sTrue, sFalse)
  if sTest then iif=sTrue else iif=sFalse end if
end function

Ach ja. Simpel kan ook.

Geschreven al luisterend naar: Planxty – After The Break – You Rambling Boys Of Pleasure

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.

    Schart schart

    donderdag 5 januari 2006 in Programmeren. Permanente link | 10 reacties

    Good programming is about scratching an itch. En ook wel: warning—major geekitude ensues.

    Stijn van mijn vorig werk heeft een collectie weird and wonderful software staan op zijn website, zo onder meer het wonderlijke odo.

    Wat het doet? Het draait op de achtergrond, en het logt allerlei dingen.

    Eén pixelje per minuut in een resizable statusvenstertje dat al sinds jaar en dag onderaan mijn linkermonitor staat.

    In het venster staan bovenaan bewegingen van de muis (groen=horizontaal, rood=verticaal), en onderaan het aantal keer dat je van applicatie verandert (blauw), het aantal muisklikken (rood) en het en het aantal toetsaanslagen (groen).

    Zeer zeker: scratching a very specific itch.

    Zó zie het er in het uitgerokken uit [klik voor groter beeld]:

    Odo thumb

    Om het uur een lichtgrijs streepje, en om het kwartier een iets donkerder streepje. Overlappende kleuren combineren, dus als er onderaan veel magenta staat, is het dat er veel van applicatie geswitched is (blauw) en met de muis geklikt is (+rood). Staat er veel cyaan, is het dat er veel getypt is (groen) en ook veel van applicatie veranderd (+blauw).

    En o ja, had ik al gezegd dat het zijn gegevens ook in een database wegschrijft, à rato van één record per minuut, maand na maand na maand, dag en nacht? Spartaanse interface; maar doet wat het moet doen:

    Odo-db

    Enfin, in mijn geval, ettelijke honderdduizenden records en vijftig op twaalfhonderd pixels control freak’s dream:

    Odo-wide

    Typisch zo’n applicatie die over de jaren heen verfijnd is trouwens. Kleine details als tooltips die detail geven per minuut als je over een minuut gaat waar data opgenomen werd:

    Odo-tooltip

    …en een tooltip die aangeeft wanneer het laatste en het eerstvolgende datapunt opgenomen werd als je over een minuut gaat waar niets gebeurde:

    Odo-tooltip2

    …in dit geval dat het laatste wapenfeit “gisteren” op mijn computer om 6u23 deze ochtend gebeurde, en het eerste “vandaag” om 8u00.

    Functionaliteit weg in plaats van bij soms ook: vroeger kon je de snelheid aanpassen, maar dat werd toch niet gebruikt, dus nu staat die vast, één pixel per seconde.

    Klap op de vuurpijl: het staat toch in de achtergrond alle toetsaanslagen te monitoren, dus zijn ook echt nuttige dingen mogelijk.  En sinds vorige week—mits goedvinden van de mannen van den IT op het werk volgende maandag—is het een must-install geworden op mijn voorlopige laptop.

    Die is namelijk een QWERTY-model, en al zet ik hem wel in Belgium-French, ik heb er geen < en geen > en geen \ op: QWERTY heeft namelijk geen toets naast de linkershift. En zonder <\> is het echt serieus moeilijk om bijvoorbeeld HTML te schrijven.

    De oplossing:

    [Fix]
    Fix102=1

    toe te voegen in odo.ini. Maakt van het 101–toetsenkeyboard een 102–toetsenkeyboard.  Zorgt ervoor dat de linkershifttoets bij één enkele aanslag < geeft, in combinatie met de rechtershift  >, en in combinatie met rechter-alt  \.

    Pure magic.

    freewaresoftwaregeek

    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