Dit ìs leesbaar.RayNbow schreef op woensdag 13 april 2011 @ 07:23:
[...]
Nou, schrijf deze maar eens om naar iets leesbaars:
Python:
1 2 import re m = re.compile('^((00|11)*(01|10)(11|00)*(10|01))*(00|11)*(01|10)(11|00)*$')
Durf jij dan met droge ogen te beweren dat je in 1 oogopslag kan zien wat de regexp voorstelt?
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Eerste oogopslag; het parsed binary string literals.RayNbow schreef op woensdag 13 april 2011 @ 10:50:
[...]
Durf jij dan met droge ogen te beweren dat je in 1 oogopslag kan zien wat de regexp voorstelt?
code:
1
2
3
4
5
6
7
8
9
10
11
| ^ ( (00|11)* (01|10) (11|00)* (10|01) )* (00|11)* (01|10) (11|00)* $ |
Dat zal 't wel niet zijn; anders had je wel ^(0|1)+$ opgeschreven maar 't is een mooie hypothese om mee te beginnen.
Het is als vragen of jij in een oogopslag ziet wat dit is;
code:
1
2
3
4
5
6
7
8
9
10
| Derivative a = evaluate(state, t, 0.0f, Derivative()); Derivative b = evaluate(state, t+dt*0.5f, dt*0.5f, a); Derivative c = evaluate(state, t+dt*0.5f, dt*0.5f, b); Derivative d = evaluate(state, t+dt, dt, c); const float dxdt = 1.0f/6.0f * (a.dx + 2.0f*(b.dx + c.dx) + d.dx); const float dvdt = 1.0f/6.0f * (a.dv + 2.0f*(b.dv + c.dv) + d.dv) state.x = state.x + dxdt * dt; state.v = state.v + dvdt * dt; |
[ Voor 6% gewijzigd door PrisonerOfPain op 13-04-2011 11:14 ]
Het grote probleem met regexpen is dat je niet kunt zien of het klopt. Je kunt immers niet de intentie zien. Nu kun je er wel commentaar bij zetten, maar wanneer er een verschil is tussen commentaar en regexp is vervolgens de vraag wie gelijk heeft. Is er bug? Is er wat gefixed maar is het commentaar niet aangepast?
Regexpen zijn vaak nodig omdat je bijvoorbeeld een beperkt validatie framework hebt. Regexpen zijn leuk als programmeer piemels om te kijken wie de grootste heeft, maar wanneer je serieus werk wilt maken van de onderhoudbaarheid van je code dan kun je de inzet toch het beste tot een minimum beperken.
Regexpen zijn vaak nodig omdat je bijvoorbeeld een beperkt validatie framework hebt. Regexpen zijn leuk als programmeer piemels om te kijken wie de grootste heeft, maar wanneer je serieus werk wilt maken van de onderhoudbaarheid van je code dan kun je de inzet toch het beste tot een minimum beperken.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Hetzelfde kun je zeggen over wiskundig of logica gerelateerde problemen. Stel je nu voor dat we die probleem groepen ook maar moeten vermijden?Janoz schreef op woensdag 13 april 2011 @ 11:38:
Het grote probleem met regexpen is dat je niet kunt zien of het klopt. Je kunt immers niet de intentie zien. Nu kun je er wel commentaar bij zetten, maar wanneer er een verschil is tussen commentaar en regexp is vervolgens de vraag wie gelijk heeft. Is er bug? Is er wat gefixed maar is het commentaar niet aangepast?
Om vervolgens zelf een statemachine met substrs, string compares en arbitraire offsets in elkaar te draaien. Nee, bedankt.Regexpen zijn vaak nodig omdat je bijvoorbeeld een beperkt validatie framework hebt. Regexpen zijn leuk als programmeer piemels om te kijken wie de grootste heeft, maar wanneer je serieus werk wilt maken van de onderhoudbaarheid van je code dan kun je de inzet toch het beste tot een minimum beperken.
En daarom is het ook jammer dat mijn reactie over EBNF notatie verder niet wordt opgepikt. Het probleem met regexen ligt 'm voornamelijk in de representatie ervan. Strings met gigantisch veel geneste haakjes en escape sequences. Je edit 'm tot je denkt dat ie goed is, maar daarna is ie niet meer leesbaar.
[ Voor 54% gewijzigd door .oisyn op 13-04-2011 12:02 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
EBNF notatie zou inderdaad een goed leesbaar alternatief zijn. Zeker omdat je het in kleinere delen opdeelt, is het een stuk overzichtelijker.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Parsed binary string literals, met wat restricties op welke bits elkaar mogen opvolgen. Daarnaast heb je heel erg irritant gedaan door (00|11) en (11|00) door elkaar te gebruiken, zelfde voor (01|10).RayNbow schreef op woensdag 13 april 2011 @ 10:50:
[...]
Durf jij dan met droge ogen te beweren dat je in 1 oogopslag kan zien wat de regexp voorstelt?
code:
1
2
3
4
5
6
7
8
9
10
11
| ^ ( (00|11)* (01|10) (00|11)* (01|10) )* (00|11)* (01|10) (00|11)* $ |
Dit maakt het al iets leesbaarder. Groepen van gelijke bits van oneven lengte, en daar een even aantal groepen van (2 of meer). Bijvoorbeeld 01, 0111, 010101, 0000010101, of 10001110.
Obfuscation is mogelijk in alle talen
point taken: dat kostte wel een paar minuten om uit te zoeken

[ Voor 11% gewijzigd door MBV op 13-04-2011 13:30 ]
Mijn regexp heb ik gelukkig niet zelf getikt, maar gegenereerd aan de hand van het volgende:Janoz schreef op woensdag 13 april 2011 @ 11:38:
Het grote probleem met regexpen is dat je niet kunt zien of het klopt. Je kunt immers niet de intentie zien. Nu kun je er wel commentaar bij zetten, maar wanneer er een verschil is tussen commentaar en regexp is vervolgens de vraag wie gelijk heeft. Is er bug? Is er wat gefixed maar is het commentaar niet aangepast?

Deze NFA is stukken duidelijker dan de equivalente regexp.
Misschien nog duidelijker is een mogelijke vertaling naar Haskell:
Haskell:
1
2
3
4
| m :: String -> Bool m s = and [odd numZeros, odd numOnes, numElse == 0] where [numZeros, numOnes, numElse] = count [(=='0'), (=='1'), (`notElem` "01")] s |
Waarbij ik count als volgt gedefinieerd heb:
Haskell:
1
2
3
4
5
6
| import Data.List (transpose) import Control.Monad import Control.Monad.Instances count ps [] = map (const 0) ps count ps s = map (length . filter id) . transpose . map (sequence ps) $ s |
Doel je op iets als dit?.oisyn schreef op woensdag 13 april 2011 @ 12:00:
En daarom is het ook jammer dat mijn reactie over EBNF notatie verder niet wordt opgepikt.
Haskell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| -- Based on: http://hpaste.org/25623/ -- + http://hpaste.org/25621/ -- + http://paste.lisp.org/display/24849 -- Simpele regexp lib: import Prelude hiding (id) import Control.Monad (forM_) import Control.Category (id, (>>>)) import Control.Arrow (Kleisli(..), (<+>)) star e = id <+> plus e plus e = e >>> star e char c = Kleisli $ \s -> [tail s | (not . null) s && head s == c] dot = Kleisli $ \s -> [tail s | (not . null) s] string s = (foldr (>>>) id . map char) s exactMatch e s = [] `elem` runKleisli e s -- Voorbeeld uit -- http://gathering.tweakers.net/forum/list_message/35856033#35856033 postbus = string "postbus" voorbeeld = star (postbus >>> dot) |
ghci> exactMatch voorbeeld "" True ghci> exactMatch voorbeeld "postbusA" True ghci> exactMatch voorbeeld "postbusApostbusB" True ghci> exactMatch voorbeeld "ApostbusB" False
Er is een simpelere uitleg wat deze regexp doet, zie het eerste stukje Haskell code hierboven.MBV schreef op woensdag 13 april 2011 @ 13:29:
Parsed binary string literals, met wat restricties op welke bits elkaar mogen opvolgen.
Alleen heb ik dat niet zelf gedaan, maar een tool.Daarnaast heb je heel erg irritant gedaan door (00|11) en (11|00) door elkaar te gebruiken, zelfde voor (01|10).
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Zoals boven ook aangehaald gaat het niet om de problemen, maar de leesbaarheid. Wanneer je een algoritme implementeert kun je dat een stuk leesbaarder maken door duidelijke variabele namen te gebruiken en stukjes code in aparte methoden implementeren welke je weer een duidelijk beschrijvende naam geeft. Daarnaast kun je in commentaar verwijzen naar de naam van het algoritme of het pattern mocht je daar gebruik van maken. Dat is wezenlijk anders dan de werking van een stuk code 2x beschrijven (1x code en 1x commentaar)PrisonerOfPain schreef op woensdag 13 april 2011 @ 11:57:
Hetzelfde kun je zeggen over wiskundig of logica gerelateerde problemen. Stel je nu voor dat we die probleem groepen ook maar moeten vermijden?
Het is niet zo zwart wit. Niet elke regexp is enkel te vervangen door een statemachine. Neem het eerder aangehaalde voorbeeld. Wanneer daadwerkelijk de intentie was om te valideren of een string niet met "postbus" begint dan is het veel leesbaarder om gewoon de startsWith methode te gebruiken.Om vervolgens zelf een statemachine met substrs, string compares en arbitraire offsets in elkaar te draaien. Nee, bedankt.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Volgens mij is dat per definitie wél het geval, maar ik snap wat je bedoeltJanoz schreef op woensdag 13 april 2011 @ 14:40:
Niet elke regexp is enkel te vervangen door een statemachine.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Dit kan met regular expressions ook; je hebt daar comments, newlines en named capturing groups tot je beschikking om het een en ander duidelijker te maken.Janoz schreef op woensdag 13 april 2011 @ 14:40:
[...]
Zoals boven ook aangehaald gaat het niet om de problemen, maar de leesbaarheid. Wanneer je een algoritme implementeert kun je dat een stuk leesbaarder maken door duidelijke variabele namen te gebruiken en stukjes code in aparte methoden implementeren welke je weer een duidelijk beschrijvende naam geeft. Daarnaast kun je in commentaar verwijzen naar de naam van het algoritme of het pattern mocht je daar gebruik van maken. Dat is wezenlijk anders dan de werking van een stuk code 2x beschrijven (1x code en 1x commentaar)
Complexe statemachines zijn hét veld waarin regular expressions uitblinken, dat ze ook ingezet kunnen worden voor triviale dingen staat buiten kijf. Daarnaast heb je zelf kunnen zien hoe veel pogingen het herschrijven van die code nodig had; enkel door een reactie in de trant van 'ieuw regexen zijn moeilijk'.Het is niet zo zwart wit. Niet elke regexp is enkel te vervangen door een statemachine. Neem het eerder aangehaalde voorbeeld. Wanneer daadwerkelijk de intentie was om te valideren of een string niet met "postbus" begint dan is het veel leesbaarder om gewoon de startsWith methode te gebruiken.
Let op het woord 'enkel'.oisyn schreef op woensdag 13 april 2011 @ 14:49:
[...]
Volgens mij is dat per definitie wél het geval, maar ik snap wat je bedoelt
[ Voor 7% gewijzigd door PrisonerOfPain op 13-04-2011 14:50 ]
Mocht die regex precies doen waar hij voor bedoeld is, dan heb je gelijk. Maar het is waarschijnlijker dat deze regex precies het "probleem" aangeeft. En dat is dat regexen veel te vaak gebruikt worden door mensen die niet goed weten waar ze mee bezig zijn, voor zaken die ook op veel eenvoudigere manieren opgelost kunnen worden.PrisonerOfPain schreef op woensdag 13 april 2011 @ 14:50:
[...]
Daarnaast heb je zelf kunnen zien hoe veel pogingen het herschrijven van die code nodig had; enkel door een reactie in de trant van 'ieuw regexen zijn moeilijk'.
Dat wil niet zeggen dat Regexen altijd vermeden moeten worden, want het is wel degelijk een krachtige tool, maar IMHO laat de leesbaarheid wel degelijk wat te wensen over.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Waarom zou dit niet het geval zijn? De code draait immers al een tijd in productie. Ik wil hier niet mee claimen dat er geen bugs in productie voorkomen, echter dat de verhouding tussen goede code en slechte code hopelijk richting goede code neigtWoy schreef op woensdag 13 april 2011 @ 14:55:
[...]
Mocht die regex precies doen waar hij voor bedoeld is, dan heb je gelijk.
Lekker bagatelliserend.En dat is dat regexen veel te vaak gebruikt worden door mensen die niet goed weten waar ze mee bezig zijn, voor zaken die ook op veel eenvoudigere manieren opgelost kunnen worden.
[ Voor 5% gewijzigd door PrisonerOfPain op 13-04-2011 15:13 ]
Ik zou het liefste alle regexen wegstoppen in een library voor zover die er niet al is, zodat ik alleen die hoef aan te passen en elke keer kan hergebruiken.
Iets als een telefoonnummer is nog wel makkelijk te lezen als regex, maar een geldig e-mailadres is hopeloos:
Maar e-mailadressen zijn dan weer een apart geval, omdat blah@blah.bla niet echt bestaat, maar later wel kan bestaan. Dan zou je dus elk TLD moeten invullen, kortom: een enorm gedoe...
Iets als een telefoonnummer is nog wel makkelijk te lezen als regex, maar een geldig e-mailadres is hopeloos:
Perl:
1
| (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) |
Maar e-mailadressen zijn dan weer een apart geval, omdat blah@blah.bla niet echt bestaat, maar later wel kan bestaan. Dan zou je dus elk TLD moeten invullen, kortom: een enorm gedoe...
En dan heb je nog unicode domain names.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
ik snap wat je bedoeld, maar het is voornamelijk "niet enkel" als in "er zijn meer oplossingen dan zelf een statemachine implementeren". Uiteindelijk is een startswith natuurlijk intern ook geimplementeerd middels een state machine (uiteindelijk is de hele computer natuurlijk een Turing machine), maar ik heb meer vertrouwen in een publieke lib dan in een 'enkel voor deze toepassing geschreven' stukje..oisyn schreef op woensdag 13 april 2011 @ 14:49:
[...]
Volgens mij is dat per definitie wél het geval, maar ik snap wat je bedoelt
Ik bedacht me nog iets anders. Vaak is de coverage van een regexp met standaard tooling nauwelijks te bepalen.
[ Voor 8% gewijzigd door Janoz op 13-04-2011 15:24 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
http://www.regexbuddy.com/Janoz schreef op woensdag 13 april 2011 @ 15:22:
Ik bedacht me nog iets anders. Vaak is de coverage van een regexp met standaard tooling nauwelijks te bepalen.
Overigens is zelfs dat ding redelijk duidelijk te krijgen als het geen one-line zou zijn.Davio schreef op woensdag 13 april 2011 @ 15:18:
Perl:
1 (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| (?: # match username [a-z0-9!#$%&'*+/=?^_`{|}~-]+ (?: \. [a-z0-9!#$%&'*+/=?^_`{|}~-]+ )* | # match a username in quotes, character set is more permissive " (?: [\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f] | \[\x01-\x09\x0b\x0c\x0e-\x7f] )* " ) @ (?: # match regular domain name (?: [a-z0-9] (?: [a-z0-9-]* [a-z0-9] )? \. )+ [a-z0-9] (?: [a-z0-9-]* [a-z0-9] )? | # or match ip4 address \[ (?: (?: 25[0-5] | 2[0-4][0-9] | [01]?[0-9][0-9]? ) \. ){3} (?: 25[0-5] | 2[0-4][0-9] | [01]? | [0-9][0-9]? # match address literal [a-z0-9-]* [a-z0-9]: (?: [\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f] | \[\x01-\x09\x0b\x0c\x0e-\x7f] )+ ) \] ) |
[ Voor 78% gewijzigd door PrisonerOfPain op 13-04-2011 16:04 ]
Ja, vooral de manier om aan te geven: Het moet in de range 0 - 255 liggen met eventuele padding is totaal niet verkracht...
Als de bedoeling is wat soczol zegt, dan vind ik dat het niet doet waarvoor het bedoeld is.PrisonerOfPain schreef op woensdag 13 april 2011 @ 15:12:
[...]
Waarom zou dit niet het geval zijn? De code draait immers al een tijd in productie. Ik wil hier niet mee claimen dat er geen bugs in productie voorkomen, echter dat de verhouding tussen goede code en slechte code hopelijk richting goede code neigt
soczol schreef op dinsdag 12 april 2011 @ 13:39:
[...]
Dat lijkt wel verdomd veel op een regex van SIDN. Die houden er niet van als je een postbus als bedrijfsadres invult. Wij hadden dit in eerste instantie wel.
Toen hebben ze bij de introductie van "DRS5" als oplossing de volgende regular expression toegepast:
code:
1 ^((?![P|p]ostbus).)*$.
Ze waren dan ook not amused toen mijn collega daar leuk 'POSTBUS' invulde. Nu hebben ze dat 'opgelost', met jouw regexp tot gevolg
Dat mag jij vinden, maar ik zie keer op keer problemen met regular expressions langskomen, terwijl een regex in veel gevallen helemaal niet de meest logische oplossing is, en bij de gevallen waar het wel logisch is zie je ook vaak problemen door de leesbaarheid.Lekker bagatelliserend.
Ik heb ook nergens gezegd dat regexen niet handig zijn, of dat je ze ten alle tijden moet proberen te vermijden. Maar als iets ook met een simpele string operatie voor elkaar te krijgen is, heeft dat toch mijn voorkeur qua leesbaarheid.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Ik kan er over heen lezen, maar ik lees daar niks over coverage. Ook lees ik niks over dit op kunnen nemen in je CI.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Vanmiddag een mooie gezien bij een collega projectlid
C#
En dan een uur zoeken waarom hij nooit verder komt dan case 0
C#
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| private void doeIets(DataTable table) { foreach(DataRow row in table.Rows) { int i = 0; switch(i) { case 0: doe iets; i++; break; .... default: doe het standaard ding; break; } } } |
En dan een uur zoeken waarom hij nooit verder komt dan case 0
/post
Verwijderd
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| private void doeIets(DataTable table) { int i = 0; foreach(DataRow row in table.Rows) { switch(i) { case 0: doe iets; i++; break; .... default: doe het standaard ding; break; } } } |
Problem "solved".
Je kan in dit geval het beste gewoon een for-lus gebruiken
Ik probeer ook foreach te vermijden, zeker omdat ik 9 uit 10 ook nog een index nodig heb. Dat neemt overigens niet weg dat het een lelijk programmeervoorbeeld isVerwijderd schreef op woensdag 13 april 2011 @ 19:07:
C#:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 private void doeIets(DataTable table) { int i = 0; foreach(DataRow row in table.Rows) { switch(i) { case 0: doe iets; i++; break; .... default: doe het standaard ding; break; } } }
Problem "solved".
Je kan in dit geval het beste gewoon een for-lus gebruiken
If money talks then I'm a mime
If time is money then I'm out of time
Verwijderd
Meestal gebruik ik LINQ, en als dat niet kan foreach en als ik daadwerkelijk een index nodig heb een for-lus.
Dit kan je in mijn geval wel eens tegenkomen.
C#:
1
2
3
4
| foreach(var t in from i in items where i.getal > 10 select i) { //doe iets } |
Dit kan je in mijn geval wel eens tegenkomen.
[ Voor 40% gewijzigd door Verwijderd op 13-04-2011 19:21 ]
LINQ, heerlijk. Zoveel handigheidjes. 
.Any() vind ik ook handig.
.Any() vind ik ook handig.
We are shaping the future
Heb je deze variant nog nooit gezien? (uit de RFC meen ik)Davio schreef op woensdag 13 april 2011 @ 15:18:
Ik zou het liefste alle regexen wegstoppen in een library voor zover die er niet al is, zodat ik alleen die hoef aan te passen en elke keer kan hergebruiken.
Iets als een telefoonnummer is nog wel makkelijk te lezen als regex, maar een geldig e-mailadres is hopeloos:
Perl:
1 (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Maar e-mailadressen zijn dan weer een apart geval, omdat blah@blah.bla niet echt bestaat, maar later wel kan bestaan. Dan zou je dus elk TLD moeten invullen, kortom: een enorm gedoe...
http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
Je kunt natuurlijk ook even de pagina lezen waar je naar linkt. De RFC geeft natuurlijk geen regexps, en deze regexp matcht an sich niet alle legale mailadressen:Enfer schreef op woensdag 13 april 2011 @ 20:14:
Heb je deze variant nog nooit gezien? (uit de RFC meen ik)
http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
This regular expression will only validate addresses that have had any comments stripped and replaced with whitespace (this is done by the module).
Is dat echt nodig? Is dat niet net zo iets als de coverage van een library opnemen in je CI, terwijl je weet dat de library stable is? Of ben je daar juist ook voor?Janoz:
Ik kan er over heen lezen, maar ik lees daar niks over coverage. Ook lees ik niks over dit op kunnen nemen in je CI.
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Ja, ik gebruik zelf vaker de "kleine" methodes in plaats van volledige expressies.Alex) schreef op woensdag 13 april 2011 @ 20:10:
LINQ, heerlijk. Zoveel handigheidjes.
.Any() vind ik ook handig.
Voorbeeld:
C#:
1
2
3
4
5
6
7
8
9
| // Dit doe ik dus niet var foo = from i in items where i.getal > 10 select i; // Dit dus wel var foo = items.Where(i => i.getal > 10); // Je kan ook aan elkaar knopen var foo = items.Where(i => i.getal > 10).OrderBy(i => i.naam); // Nadeel is dat je twee keer een soortgelijke lambda-expressie gebruikt |
Die zocht ik in eerste instantie, maar kon hem zo snel niet vinden, wat een monster.Enfer schreef op woensdag 13 april 2011 @ 20:14:
[...]
Heb je deze variant nog nooit gezien? (uit de RFC meen ik)
http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
Nee, wanneer een regexp daadwerkelijk onderdeel uitmaakt van je code dan hoort hij imho ook goed getest te zijn. Als het je eigen regexp is dan weet je immers helemaal niet of hij wel stable is. Als ik zelf een email regexp in elkaar gefietst heb dan ben je er niet wanneer een unittest de regexp regel geraakt heeft. Je zou er pas moeten zijn wanneer een groot gedeelte van de randgevallen ook getest zijn. Het is dan ook wel interessant wanneer je daadwerkelijk een soort branche coverage van een regexp zou kunnen meenemen.drm schreef op woensdag 13 april 2011 @ 21:55:
[...]
Is dat echt nodig? Is dat niet net zo iets als de coverage van een library opnemen in je CI, terwijl je weet dat de library stable is? Of ben je daar juist ook voor?
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Verwijderd
Ik had laatst een mooie.Davio schreef op woensdag 13 april 2011 @ 22:15:
[...]
Ja, ik gebruik zelf vaker de "kleine" methodes in plaats van volledige expressies.
Voorbeeld:
C#:
1 2 3 4 5 6 7 8 9 // Dit doe ik dus niet var foo = from i in items where i.getal > 10 select i; // Dit dus wel var foo = items.Where(i => i.getal > 10); // Je kan ook aan elkaar knopen var foo = items.Where(i => i.getal > 10).OrderBy(i => i.naam); // Nadeel is dat je twee keer een soortgelijke lambda-expressie gebruikt
C#:
1
2
3
4
5
| var items = (from i in array1 where i.getal > 10 select new { Name = i.Name, BirthDate = i.BirthDate}).Union(from i in array2 where i.getal > 10 select new { Name = i.Name, BirthDate = i.BirthDate }).Distinct(); |
Maar dan natuurlijk wel anders
Korte notatie gebruik ik alleen wanneer dat het beste uitkomt. Maar volledig uitschrijven is nuttig als je een écht lange LINQ-query hebt. (Met sub-querys en annonieme typen die je dan in een Union aan elkaar koppelt).
Maar weer ff ontopic, LINQ is geen slecht programmeervoorbeeld. Juist een heel goede.
C#:
1
2
3
4
5
6
7
8
9
10
11
| try { if (txtHex.Text.Length == 7) { Color c = HexNaarKleur(txtHex.Text); Color = c; } } catch { } |
Van eigen hand XD. Het is niet zozeer een fout, maar het is wel slecht.
Beter
C#:
1
2
| if (txtHex.TextLength == 7) Color = HexNaarKleur(txtHex.Text); |
[ Voor 38% gewijzigd door Verwijderd op 13-04-2011 23:02 ]
Ja daar zit wel wat in ja... Zou wel interessant zijn idd.Janoz:
Nee, wanneer een regexp daadwerkelijk onderdeel uitmaakt van je code dan hoort hij imho ook goed getest te zijn. Als het je eigen regexp is dan weet je immers helemaal niet of hij wel stable is. Als ik zelf een email regexp in elkaar gefietst heb dan ben je er niet wanneer een unittest de regexp regel geraakt heeft. Je zou er pas moeten zijn wanneer een groot gedeelte van de randgevallen ook getest zijn. Het is dan ook wel interessant wanneer je daadwerkelijk een soort branche coverage van een regexp zou kunnen meenemen.
Ik weet er het fijne niet van maar volgens mij zijn regexen met de meeste engines te compilen. Waar dat dan precies naartoe compilet weet ik niet, maar het zal wel iets van een intermediate bytecode zijn die dan ook op coverage geanalyseerd moet kunnen worden. Wel interessant idee.
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Vind ik nu niet zo spannend eigenlijk, die ene variabele die je weglaat had de compiler ook wel voor je verwijderd.Verwijderd schreef op woensdag 13 april 2011 @ 22:51:
[...]
Ik had laatst een mooie.
[code=c#]
C#:
1 2 3 4 5 6 7 8 9 10 11 try { if (txtHex.Text.Length == 7) { Color c = HexNaarKleur(txtHex.Text); Color = c; } } catch { }
Van eigen hand XD. Het is niet zozeer een fout, maar het is wel slecht.
Beter
C#:
1 2 if (txtHex.TextLength == 7) Color = HexNaarKleur(txtHex.Text);
Vind het vreemder dat je een 7karakters lange string per definitie gebruikt als zijne een hex waarde. Tenzij HexNaarKleur dat nog checked, maar dan zie ik helemaal niet wat er nu zo vreemd is aan die code.
Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three
Ik vind dat niet echt een zaak van HexNaarKleur om te controleren.
Ik zou doen:
Dan vraag ik me af of je hier goed een MaskedTextBox voor kunt gebruiken...
Ik zou doen:
C#:
1
2
3
4
5
6
7
8
9
10
11
| string possibleHex = txtHex.Text; if(IsValidHex(possibleHex)) Color = HexNaarKleur(possibleHex); private bool IsValidHex(string possibleHex) { // IsNullOrEmpty is met de regex overbodig, maar misschien sneller return !string.IsNullOrEmpty(possibleHex) && Regex.IsMatch(possibleHex, @"^#[A-Fa-f0-9]{6}$"); // Moet # escaped worden? Geen idee... } |
Dan vraag ik me af of je hier goed een MaskedTextBox voor kunt gebruiken...
[ Voor 4% gewijzigd door Davio op 14-04-2011 10:10 ]
Bah, nederlands en engels door elkaarVerwijderd schreef op woensdag 13 april 2011 @ 22:51:
[...]
Beter
C#:
1 2 if (txtHex.TextLength == 7) Color = HexNaarKleur(txtHex.Text);
Dus elke aanroep moet zelf checken of hij wel goede parameters aan de call meegeeft? Dat lijkt me nou typisch een voorbeeld van iets wat de verantwoordelijkheid is van de method zelf. Je kunt er gewoon de standaard InvalidArgumentException voor throwen. Mooi gevalletje Law of Demeter.Davio:
Ik vind dat niet echt een zaak van HexNaarKleur om te controleren.
Ik zou uberhaupt helemaal niet over HEX waardes spreken, misschien wil je later nog wel rgb(...) of rgba(...) notaties introduceren... 't Is gewoon een string die geïnterpreteerd moet worden als kleur. Wat er in die string zit en of die method er iets mee kan moet die method zelf maar zien.
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Verwijderd
Grappig, ik vroeg me gisteravond precies hetzelfde afDavio schreef op donderdag 14 april 2011 @ 10:09:
Ik vind dat niet echt een zaak van HexNaarKleur om te controleren.
Ik zou doen:
C#:
1 2 3 4 5 6 7 8 9 10 11 string possibleHex = txtHex.Text; if(IsValidHex(possibleHex)) Color = HexNaarKleur(possibleHex); private bool IsValidHex(string possibleHex) { // IsNullOrEmpty is met de regex overbodig, maar misschien sneller return !string.IsNullOrEmpty(possibleHex) && Regex.IsMatch(possibleHex, @"^#[A-Fa-f0-9]{6}$"); // Moet # escaped worden? Geen idee... }
Dan vraag ik me af of je hier goed een MaskedTextBox voor kunt gebruiken...
De code gaat uiteindelijk naar:
ColorTranslator.FromHtml(hex);
Het is voor een parser van HTML kleurcodesdrm schreef op donderdag 14 april 2011 @ 10:36:
[...]
Dus elke aanroep moet zelf checken of hij wel goede parameters aan de call meegeeft? Dat lijkt me nou typisch een voorbeeld van iets wat de verantwoordelijkheid is van de method zelf. Je kunt er gewoon de standaard InvalidArgumentException voor throwen. Mooi gevalletje Law of Demeter.
Ik zou uberhaupt helemaal niet over HEX waardes spreken, misschien wil je later nog wel rgb(...) of rgba(...) notaties introduceren... 't Is gewoon een string die geïnterpreteerd moet worden als kleur. Wat er in die string zit en of die method er iets mee kan moet die method zelf maar zien.
Je zit dus al een niveau'tje lager, bedoel je? Dat vroeg ik me nog af nadat ik had gepost
Ik had eigenlijk te weinig context om de opmerking te kunnen maken die maakte, besefte ik te laat
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Noem het dan HtmlNaarKleur oid.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Als je dat doet moet je ook kleuren als "blue", "red", "green" etc accepteren en niet alleen de hex-notatie met 6 chars (want #FFF is natuurlijk ook correct).oisyn schreef op donderdag 14 april 2011 @ 10:57:
Noem het dan HtmlNaarKleur oid.
Verwijderd
Color.FromNameErkens schreef op donderdag 14 april 2011 @ 11:00:
Als je dat doet moet je ook kleuren als "blue", "red", "green" etc accepteren en niet alleen de hex-notatie met 6 chars (want #FFF is natuurlijk ook correct)
Verwijderd
Yep
Overal aan gedacht
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| /// <summary> /// Conventeer een html waarde naar een .Net Color object. /// </summary> /// <param name="html">Hexwaarde (met of zonder #) van de Color</param> /// <returns>.NET Color object</returns> public Color HtmlToColor(string html) { if (!html.StartsWith("#")) html = "#" + html; if (Regex.IsMatch(html, @"^#[A-Fa-f0-9]{3,6}$")) { return ColorTranslator.FromHtml(html); } else { html = html.Substring(1); try { return Color.FromName(html); } catch { return Color.Empty; } } } |
Overal aan gedacht
True. HtmlKleurcodeNaarKleur dan. "hex" slaat gewoon nergens op ("#" is geen geldig hexadecimaal karakter).Erkens schreef op donderdag 14 april 2011 @ 11:00:
[...]
Als je dat doet moet je ook kleuren als "blue", "red", "green" etc accepteren en niet alleen de hex-notatie met 6 chars (want #FFF is natuurlijk ook correct)
[ Voor 11% gewijzigd door .oisyn op 14-04-2011 11:37 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Waarom check je niet gewoon in je regexp of er wel of niet begonnen wordt met een hekjesanderev66:
C#:
1 2 3 4 5 6 7 public Color HtmlToColor(string html) { if (!html.StartsWith("#")) html = "#" + html; /* ..snip.. */ html = html.Substring(1); /* ..snip.. */ }
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Verwijderd
Zodat zowel FFFFFF als #FFFFFF correcte invoer is voor de ColorTranslator die dus wel de # nodig heeft.
Dan kun je dat hekje toch gewoon optioneel maken in je regexVerwijderd schreef op donderdag 14 april 2011 @ 14:52:
Zodat zowel FFFFFF als #FFFFFF correcte invoer is voor de ColorTranslator die dus wel de # nodig heeft.
Verwijderd
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public Color HtmlToColor(string html) { if (Regex.IsMatch(html, @"^#?[A-Fa-f0-9]{3,6}$")) { return ColorTranslator.FromHtml(html); } else { try { return Color.FromName(html); } catch { return Color.Empty; } } } |
Dit gaat fout als html "FFFFFF" is, de regex gaat goed maar de ColorTranslator geeft een exception.
Dan kán ik natuurlijk nog dit doen, maar dan heb ik ong. hetzelfde als eerst:
C#:
1
| return ColorTranslator.FromHtml(html.StartsWith("#") ? html : "#" + html); |
[ Voor 15% gewijzigd door Verwijderd op 14-04-2011 15:10 ]
hm. wat gebeurt er eigenlijk met FFFF en FFFFF? worden die gewoon gepad? en zoja, waarom zou je dan het onderste limiet behouden..
edit:: omdat ik toch verwacht dat je alléén de cases met 3 of 6 symbolen wilt stel ik de volgende regex voor:
edit:: omdat ik toch verwacht dat je alléén de cases met 3 of 6 symbolen wilt stel ik de volgende regex voor:
code:
1
| "^#?[A-Fa-f0-9]{3}{1,2}$" |
[ Voor 37% gewijzigd door kaesve op 14-04-2011 22:35 ]
Over magic numbers gesproken. I did this:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| $iStrLen = strlen($iNumber); switch($iSize) { case 1: $fFontSizeBase = 2.2; break; case 2: $fFontSizeBase = 2.7; break; case 3: $fFontSizeBase = 3.3; break; case 4: $fFontSizeBase = 3.9; break; case 5: $fFontSizeBase = 4.4; break; case 6: $fFontSizeBase = 5; break; } $fFontSizeBase -= ($iStrLen-1)/(3-0.5*($iSize-3)); //Breedte tekst schatten $fTextWidth = $fFontSizeBase * 3 * $iStrLen; $fTextHeight = $fFontSizeBase * 4; $oImage = imagecreatefrompng($sIconDir."cluster-$iSize.png"); imagesavealpha($oImage, true); $iX = floor(($iWidth / 2) - ($fTextWidth / 2)-(floor($fFontSizeBase/2))); $iY = floor(($iHeight / 2) + ($fTextHeight / 2)); |

Badieboediemxvahajwjjdkkskskskaa
Die 2'tjes had je makkelijk kunnen vervangen door "HALF" ja
Minder dan 3, 4, 5 of meer dan 6 letters in een kleurnotatie zijn geen geldige kleur. Ik gok dat de Color.FromName ook zal falen en dus wordt de Color.Empty terug gegeven.kaesve schreef op donderdag 14 april 2011 @ 15:14:
hm. wat gebeurt er eigenlijk met FFFF en FFFFF? worden die gewoon gepad? en zoja, waarom zou je dan het onderste limiet behouden..
edit:: omdat ik toch verwacht dat je alléén de cases met 3 of 6 symbolen wilt stel ik de volgende regex voor:
code:
1 "^#?[A-Fa-f0-9]{3}{1,2}$"
RGBA is toch ook geldig?HuHu schreef op dinsdag 19 april 2011 @ 18:04:
[...]
Minder dan 3, 4, 5 of meer dan 6 letters in een kleurnotatie zijn geen geldige kleur. Ik gok dat de Color.FromName ook zal falen en dus wordt de Color.Empty terug gegeven.
In CSS kun je kleurcodes met alpha- channel niet schrijven als hexadecimaal getal.
Alleen #[0-9A-Fa-f]{3,6} is geldig. Kleurcodes met alpha moet je specificeren met rgba().
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
Ik had hier zojuist ook een leuke
En ik een half uur zitten zoeken naar die ene syntax error. >_>
PHP:
1
| $db = new Zend_Db::factory('pdo_mysql', array( /* DB gegevens */ ) ); |
En ik een half uur zitten zoeken naar die ene syntax error. >_>
Wat overigens weinig moeite zou zijn, lijkt me althans, om ook als geldig te accepteren.Jaap-Jan schreef op dinsdag 19 april 2011 @ 18:20:
[...]
In CSS kun je kleurcodes met alpha- channel niet schrijven als hexadecimaal getal.
#RGBA of #RRGGBBAA is makkelijk te onderscheiden van #RGB en #RRGGBB
Nu is alpha een 0..1 value, maar een 0..255 is natuurlijk prima te interpoleren naar 0..1
Er is overigens wel over nagedacht maar besloten 't niet (meer) mee te nemen in de spec.
[ Voor 15% gewijzigd door RobIII op 19-04-2011 18:34 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Verwijderd
Die is toch wel heel erg... Ken je design patterns (en syntax).X_lawl_X schreef op dinsdag 19 april 2011 @ 18:25:
Ik had hier zojuist ook een leuke
PHP:
1 $db = new Zend_Db::factory('pdo_mysql', array( /* DB gegevens */ ) );
En ik een half uur zitten zoeken naar die ene syntax error. >_>
mwah, was gewoon toe aan koffie.Verwijderd schreef op dinsdag 19 april 2011 @ 18:37:
[...]
Die is toch wel heel erg... Ken je design patterns (en syntax).
R, G en B zijn ook 0..1 values.RobIII schreef op dinsdag 19 april 2011 @ 18:32:
Nu is alpha een 0..1 value, maar een 0..255 is natuurlijk prima te interpoleren naar 0..1
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Wat een groep zachte eitjes zeg.RobIII schreef op dinsdag 19 april 2011 @ 18:32:
Er is overigens wel over nagedacht maar besloten 't niet (meer) mee te nemen in de spec.
Het is toch een draft met een reden?The working group discussed the addition of new features to
css3-color and decided that no new features should be added at this
time; rather, the draft should be advanced with its current feature
set, which is at this point widely implemented. New features will
be considered for the next level of the CSS color module.
En verderop
EnI really don't see how you can say it's not a feature. A new syntax
for the same thing is a feature. It would still delay the spec
advancing to recommendation, since there are not two interoperable
implementations of the feature.
It's not trivial to ship that in already-released browsers.

[ Voor 21% gewijzigd door PrisonerOfPain op 19-04-2011 20:56 ]
Maar zo heel vreemd is het niet. Het lijkt triviaal, maar voor een goede spec hebben dat soort dingen gewoon even tijd nodig. Hoe gaan huidige browsers bijvoorbeeld #rgba interpreteren als ze alleen #rgb en #rrggbb ondersteunen? Als je je richt op een final draft dan zijn dat soort nieuwe features niet handig.
Maar wat ik persoonlijk nogal raar vind is dat niemand hier eerder over na heeft gedacht.
Maar wat ik persoonlijk nogal raar vind is dat niemand hier eerder over na heeft gedacht.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Kom ik nu net tegen in een database... niet door ons gemaakt overgens.
Waarbij "code" nooit meer dan 4 tekens bevat, en "percentage" alleen 1 tot 100%... De "parent_id" bevat ook spaties, punten, comma's en alle andere willekeurige tekens; die zorgt voor de JOIN met een andere tabel.
Ook leuk, de "Products" tabel (van de webshop) bevat een nieuw record voor elke kleur/maat combinatie...
Shirt_1 / Maat L / Rood
Shirt_1 / Maat XL / Rood
Shirt_1 / Maat XXL / Rood
Shirt_1 / Maat L / Blauw
Shirt_1 / Maat XL / Blauw
Shirt_1 / Maat XXL / Blauw
code:
1
2
3
4
5
| id int(11) ... code varchar(255) percentage varchar(255) parent_id varchar(255) |
Waarbij "code" nooit meer dan 4 tekens bevat, en "percentage" alleen 1 tot 100%... De "parent_id" bevat ook spaties, punten, comma's en alle andere willekeurige tekens; die zorgt voor de JOIN met een andere tabel.
Ook leuk, de "Products" tabel (van de webshop) bevat een nieuw record voor elke kleur/maat combinatie...
Shirt_1 / Maat L / Rood
Shirt_1 / Maat XL / Rood
Shirt_1 / Maat XXL / Rood
Shirt_1 / Maat L / Blauw
Shirt_1 / Maat XL / Blauw
Shirt_1 / Maat XXL / Blauw
[ Voor 25% gewijzigd door OkkE op 20-04-2011 09:35 ]
“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.
Prima, maar de argumenten die aangehaald werden leken er op te duiden dat het te veel werk was (prima, er moet een paragraaf geschreven worden over hoe het werkt, er moet een syntax definitie voor komen, en er moet waarschijnlijk weken over gepraat worden of het rgba of argb moet zijn). Verder word er gezegt dat, ondanks dat het geen final document is, er niets meer aan toe kan worden gevoegt omdat huidige browsers de boel al geimplementeerd hebben. Waarom zou je dan uberhaupt nog een TR of final draft op willen stellen? Ik snap dat ze niet alle 'triviale' features kunnen toevoegen aan de spec; immers iedere feature kost x uur en als er genoeg features zijn komen ze nooit aan een final document. Maar een feature als deze, die er eigenlijk al in had moeten zitten sinds het toevoegen van alpha channel support aan CSS, zou er wmb tòch wat anders naar gekeken moeten worden..oisyn schreef op dinsdag 19 april 2011 @ 21:16:
Maar zo heel vreemd is het niet. Het lijkt triviaal, maar voor een goede spec hebben dat soort dingen gewoon even tijd nodig. Hoe gaan huidige browsers bijvoorbeeld #rgba interpreteren als ze alleen #rgb en #rrggbb ondersteunen? Als je je richt op een final draft dan zijn dat soort nieuwe features niet handig.
Dat hoeft niet per definitie fout te zijn... Vaak hebben die ook eigen product codes dus is het vrij logisch om ze als losstaande entiteiten te zien. Het is nu wel lastiger ze te groeperen, maar echt heel erg fout vind ik het niet.OkkE schreef op woensdag 20 april 2011 @ 09:32:
Kom ik nu net tegen in een database... niet door ons gemaakt overgens.
code:
1 2 3 4 5 id int(11) ... code varchar(255) percentage varchar(255) parent_id varchar(255)
Waarbij "code" nooit meer dan 4 tekens bevat, en "percentage" alleen 1 tot 100%... De "parent_id" bevat ook spaties, punten, comma's en alle andere willekeurige tekens; die zorgt voor de JOIN met een andere tabel.
Ook leuk, de "Products" tabel (van de webshop) bevat een nieuw record voor elke kleur/maat combinatie...
Shirt_1 / Maat L / Rood
Shirt_1 / Maat XL / Rood
Shirt_1 / Maat XXL / Rood
Shirt_1 / Maat L / Blauw
Shirt_1 / Maat XL / Blauw
Shirt_1 / Maat XXL / Blauw
Binnen ERP pakketen als Axapta werkt het ook zo en kun je op dimensie niveau dingen als maat en kleur inregelen, maar iedere productcombinatie heeft een eigen record in de database.
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Van:
Naar:
<rage.jpg>
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| procedure TF_Frm_FooForm.medatum1Exit(Sender: TObject); begin if (Pos('/', Trim(MeDatum1.text)) <> 1) then begin try strtodate(MeDatum1.text); except showmessage('Invalid date!'); MeDatum1.SetFocus; end; end; end; /* knip 250 regels */ procedure TF_Frm_FooForm.metm8Exit(Sender: TObject); begin if (Pos(':', Trim(MeTm8.text)) <> 1) then begin try strtotime(MeTm8.text); except showmessage('Invalid time!'); MeTm8.SetFocus; end; end; end; |
Naar:
Delphi:
1
2
3
4
5
6
7
8
9
| procedure TF_Frm_FooForm.TimeMaskEditExit(Sender: TObject); begin TFooClass.ControleerTijd(Sender as TMaskEdit); end; procedure TF_Frm_FooForm.DateMaskEditExit(Sender: TObject); begin TFooClass.ControleerDatum(Sender as TMaskEdit); end; |
<rage.jpg>
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Niet "vreemd", maar eigenlijk vrij normaal. Dit kan gezien worden als een (soort van) SKU:OkkE schreef op woensdag 20 april 2011 @ 09:32:
Ook leuk, de "Products" tabel (van de webshop) bevat een nieuw record voor elke kleur/maat combinatie...
Shirt_1 / Maat L / Rood
Shirt_1 / Maat XL / Rood
Shirt_1 / Maat XXL / Rood
Shirt_1 / Maat L / Blauw
Shirt_1 / Maat XL / Blauw
Shirt_1 / Maat XXL / Blauw
Alhoewel als je het echt "goed" wilt doen in geval van bovenstaande kleding shop je bijvoorbeeld zoiets krijgt als:Warehousing item that is unique because of some characteristic (such as brand, size, color, model) and must be stored and accounted for separate from other items. Every SKU is assigned a unique identification number (inventory or stock number) which is often the same as (or is tied to) the item's EAN or UPC.
Products
product_id
ean
brand
description
SKUs
product_id
sku_id
color
size
[ Voor 11% gewijzigd door mindcrash op 20-04-2011 11:16 ]
"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)
.Gertjan. schreef op woensdag 20 april 2011 @ 10:38:
Dat hoeft niet per definitie fout te zijn... Vaak hebben die ook eigen product codes dus is het vrij logisch om ze als losstaande entiteiten te zien. Het is nu wel lastiger ze te groeperen, maar echt heel erg fout vind ik het niet.
Oke, voor elk product een nieuw record heeft dan nog wel een aantal voordelen.mindcrash schreef op woensdag 20 april 2011 @ 11:12:
Niet "vreemd", maar eigenlijk vrij normaal. Dit kan gezien worden als een (soort van) SKU:
Maar de hele website/webshop is verder echt één drama, o.a. dus een VARCHAR (de merknaam (incl. spaties, punten, comma's, etc)) als Primary Key, waar JOINs mee gedaan worden.
Verder staan alle Categorieën niet in de database, maar als Array in PHP (op vier verschillende plekken). Staan de database gegevens in een "config.xml" in de webroot, staan alle HTML URLs hard-coded in een XML file...
“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.
There, I fixed it for youOkkE schreef op woensdag 20 april 2011 @ 11:34:
Maar de hele website/webshop is verder echt één drama een uitdaging waarin ik me helemaal kan geven , o.a. dus een VARCHAR (de merknaam (incl. spaties, punten, comma's, etc)) als Primary Key, waar JOINs mee gedaan worden.
Bugs en issues bestaan toch niet in de ICT wereld, we kennen alleen kansen en uitdagingen toch
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Jij bent een échte manager, Gertjan.
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Ik zal hem meenemen bij mijn volgende functioneringsgesprek. "Zelfs op het internet vind men dat ik een manager ben, wordt het niet eens tijd voor een promotie"
En tja "het internet" heeft altijd gelijk
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
en een pareltje van eigen hand...
Kwam 'm toevallig tegen, snel maar even weggehaald
C#:
1
2
3
4
5
6
7
8
| if (geselecteerdeVraag.statusAsString.Equals("Ingediend")) { m_view.geefMenuModuleContext().enableCommandWithName("cmdToewijzen"); } else { m_view.geefMenuModuleContext().enableCommandWithName("cmdToewijzen"); } |
Kwam 'm toevallig tegen, snel maar even weggehaald
Hehe, netjes. 
Overigens zou ik ook kijken naar constanten, enums en het goed gebruik om niet nederlands en engels door elkaar te programmeren.
Overigens zou ik ook kijken naar constanten, enums en het goed gebruik om niet nederlands en engels door elkaar te programmeren.
Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.
Ik zie een nieuwe domein wel of niet Engels discussie aankomen ^^mOrPhie schreef op woensdag 20 april 2011 @ 15:06:
Hehe, netjes.
Overigens zou ik ook kijken naar constanten, enums en het goed gebruik om niet nederlands en engels door elkaar te programmeren.
Uh, d'uh. Ja. My bad. Ik doelde op rgba(255, 255, 255, 1) maar het is natuurlijk allemaal uiteindelijk een representatie van 0..1, 0..255, 0..ff, net wat je leuk vindt.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Wat, wil je zeggen dat in de rgba(r,g,b,a) syntax de r,g en b wel gewoon van 0 tot 255 lopen maar a niet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ik gaf ook niet aan dat het een perfecte regexp is, ik gaf alleen een leuke grote regex aanValHallASW schreef op woensdag 13 april 2011 @ 21:50:
[...]
Je kunt natuurlijk ook even de pagina lezen waar je naar linkt. De RFC geeft natuurlijk geen regexps, en deze regexp matcht an sich niet alle legale mailadressen:
[...]
offtopic:
Aannames maken als Software Engineer is bijna per definitie fout
Aannames maken als Software Engineer is bijna per definitie fout
Blijkbaar is het toch een goed idee om ze daar wat langer over de #AARRGGBB notatie na te laten denken.oisyn schreef op woensdag 20 april 2011 @ 19:25:
Wat, wil je zeggen dat in de rgba(r,g,b,a) syntax de r,g en b wel gewoon van 0 tot 255 lopen maar a niet![]()

Wat ik vreemd vind, is dat hier geen TryParse c.q. TryParseExact methods voorhanden zijn...Verwijderd schreef op donderdag 14 april 2011 @ 10:38:
De code gaat uiteindelijk naar:
ColorTranslator.FromHtml(hex);
Verwijderd
Alpha gaat wel gewoon van 0 tot 255PrisonerOfPain schreef op woensdag 20 april 2011 @ 19:49:
[...]
Blijkbaar is het toch een goed idee om ze daar wat langer over de #AARRGGBB notatie na te laten denken
MSDN: Color.A Property (System.Drawing)
Want mocht je het nog niet weten 0...255 is precies 1 byte.
[ Voor 25% gewijzigd door Verwijderd op 20-04-2011 21:04 ]
In de css-specs loopt de a van 0..1. Voor r, g en b kun je 0..255 en 0%..100% gebruiken, dat komt netjes overeen met de gewone rgb() kleuren..oisyn schreef op woensdag 20 april 2011 @ 19:25:
Wat, wil je zeggen dat in de rgba(r,g,b,a) syntax de r,g en b wel gewoon van 0 tot 255 lopen maar a niet![]()
Maar je kunt ook hsl (en hsla)-kleuren gebruiken.
Dat slaat dan dus ook weer echt nergens op. Waarom is alpha een waarde tussen 0 en 1 maar zijn de kleurwaarden tussen 0 en 255?Light schreef op woensdag 20 april 2011 @ 22:27:
[...]
In de css-specs loopt de a van 0..1. Voor r, g en b kun je 0..255 en 0%..100% gebruiken, dat komt netjes overeen met de gewone rgb() kleuren.
Dus omdat je 1 specifieke API quote is het zo? Kleurcomponenten (inclusief alpha) interpoleren gewoon tussen helemaal uit en helemaal aan, ongeacht de gebruikte granulariteit. Tussen 0 en 1 dus. Door elk component met een byte te representeren krijg je dus 0 tot 255, maar dat hoeft helemaal niet. 16 bits per component kleurformaten schalen van 0 tot 65535, maar ook andere formaten zijn mogelijk (zoals het veelgebruikte 5-6-5 in het 16 bits kleur tijdperk, met r en b tussen 0 en 31 en g tussen 0 en 63).
Daarom slaat het ook nergens op om de RGB wel van 0 tot 255 te laten schalen, maar de A niet. Doe gewoon álles tussen 0 en 1, zoals het hoort. Die 255 klopt alleen bij 8 bits per component kleurformaten, en het is niet aan CSS om een dergelijke limitatie op te leggen.
[ Voor 11% gewijzigd door .oisyn op 20-04-2011 22:55 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
.oisyn schreef op woensdag 20 april 2011 @ 19:25:
Wat, wil je zeggen dat in de rgba(r,g,b,a) syntax de r,g en b wel gewoon van 0 tot 255 lopen maar a niet![]()
Ja, sorry, ik heb 't ook niet verzonnen.oisyn schreef op woensdag 20 april 2011 @ 22:50:
Daarom slaat het ook nergens op om de RGB wel van 0 tot 255 te laten schalen, maar de A niet. Doe gewoon álles tussen 0 en 1, zoals het hoort. Die 255 klopt alleen bij 8 bits per component kleurformaten, en het is niet aan CSS om een dergelijke limitatie op te leggen.
Sterker nog: een percentage mag ook: rgba(50%, 75%, 80%, 0.5)

Verwijderd schreef op woensdag 20 april 2011 @ 20:57:
Want mocht je het nog niet weten 0...255 is precies 1 byte.

[ Voor 63% gewijzigd door RobIII op 20-04-2011 23:08 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Hehe, het alpha kanaal. Toen ik net begon met kleuren in WPF vergat ik iedere keer dat stukje mee te nemen, voor kleuren gebruikte ik dus gewoon alleen Red Green en Blue. Dan zette hij automatisch de alpha op 0 waardoor de kleur niet te zien was. Heeft best wel lang geduurd voor ik door had wat er mis ging. Nadat ik wat met de WYSIWYG editor aan het spelen was gegaan zag ik dat er ook nog een alpha was...
Alpha setten in je kleur en hij was zichtbaar
Als je met de alpha speelt wordt het dan ook transparant(er) of haal ik nu wat door elkaar?
Overigens was het vroegah in CSS een ramp om iets transparant te krijgen, er staat mij bij dat je voor iedere browser weer iets anders moest gebruiken... Komt nu in me op omdat ik CSS en alpha zie...


Als je met de alpha speelt wordt het dan ook transparant(er) of haal ik nu wat door elkaar?
Overigens was het vroegah in CSS een ramp om iets transparant te krijgen, er staat mij bij dat je voor iedere browser weer iets anders moest gebruiken... Komt nu in me op omdat ik CSS en alpha zie...
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Huh?.Gertjan. schreef op donderdag 21 april 2011 @ 07:41:
Hehe, het alpha kanaal. Toen ik net begon met kleuren in WPF vergat ik iedere keer dat stukje mee te nemen, voor kleuren gebruikte ik dus gewoon alleen Red Green en Blue. Dan zette hij automatisch de alpha op 0 waardoor de kleur niet te zien was. Heeft best wel lang geduurd voor ik door had wat er mis ging. Nadat ik wat met de WYSIWYG editor aan het spelen was gegaan zag ik dat er ook nog een alpha was...Alpha setten in je kleur en hij was zichtbaar
![]()
Als je met de alpha speelt wordt het dan ook transparant(er) of haal ik nu wat door elkaar?
Overigens was het vroegah in CSS een ramp om iets transparant te krijgen, er staat mij bij dat je voor iedere browser weer iets anders moest gebruiken... Komt nu in me op omdat ik CSS en alpha zie...
Als je in WPF #00FF00 opgeeft krijg je toch gewoon groen, ongeacht of je nu wel of geen alpha kanaal meegeeft?
Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three
Mmm, dat weet ik niet meer zeker, maar als je met brushes ging werken moest je dacht ik Alpha wel expliciet meegeven. Maar goed pin me er niet op vast, is weer een tijdje terug.BM schreef op donderdag 21 april 2011 @ 07:43:
[...]
Huh?
Als je in WPF #00FF00 opgeeft krijg je toch gewoon groen, ongeacht of je nu wel of geen alpha kanaal meegeeft?Volgens mij zet ie alpha juist standaard zo dat het wel zichtbaar is?
Kan ook goed zijn dat ik standaard 0 in heb gevuld omdat ik niet wist wat het was
edit: ik zit even te kijken in de code, maar de eerste 2 zijn het alpha kanaal, als je die niet set gaat hij, dacht ik, aan de hand van de 6 karakters een 8 karakter kleur code maken. Op de een of andere manier kwam er soms iets compleet mislukts uit. (maar kan ook zijn dat het probleem tussen het toetsenbord en stoel zat
[ Voor 22% gewijzigd door .Gertjan. op 21-04-2011 07:48 ]
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Ik ben halverwege het project erbij gekomen, dus de meeste benamingen zijn niet van eigen hand. Heb wel hier en daar wat dingen op moeten schonen wat dat betreft, want het is echt heel verwarrend om engels en nederlands door elkaar te doen..mOrPhie schreef op woensdag 20 april 2011 @ 15:06:
Hehe, netjes.
Overigens zou ik ook kijken naar constanten, enums en het goed gebruik om niet nederlands en engels door elkaar te programmeren.
Ja idd. Want dan moet je de hele tijd kijken hoe een functie nou precies heet omdat je.omgwtfbbq schreef op donderdag 21 april 2011 @ 10:57:
[...]
Ik ben halverwege het project erbij gekomen, dus de meeste benamingen zijn niet van eigen hand. Heb wel hier en daar wat dingen op moeten schonen wat dat betreft, want het is echt heel verwarrend om engels en nederlands door elkaar te doen..
Nothing to see here!
Maak die zin eens af, ik viel bijna van m'n stoel zo abrupt als die eindigde.Rutix schreef op donderdag 21 april 2011 @ 12:55:
[...]
Ja idd. Want dan moet je de hele tijd kijken hoe een functie nou precies heet omdat je.
Inderdaad, behoorlijk irritant van die mensen die hun zin nietPatriot schreef op donderdag 21 april 2011 @ 12:59:
[...]
Maak die zin eens af, ik viel bijna van m'n stoel zo abrupt als die eindigde.
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
In dit soort gevallen weet je het einde en ga je automatisch aanvullen. Zelfde als automatische foutcorrctie in je koppie. Echter, in het eerder geval zou ik bijvoorbeeld absoluut niet weten wat er achter moet en dan begint irritatie op te treden..Gertjan. schreef op donderdag 21 april 2011 @ 13:30:
[...]
Inderdaad, behoorlijk irritant van die mensen die hun zin niet
Edit; aan zijn profiel te zien zal het wel een firewall zijn geweest die het verder typen heeft geblokkeerd
Grappige 'managers', sorry.. niet gewend.

[ Voor 26% gewijzigd door graceful op 21-04-2011 14:12 ]
graceful schreef op donderdag 21 april 2011 @ 14:08:
[...]
In dit soort gevallen weet je het einde en ga je automatisch aanvullen. Zelfde als automatische foutcorrctie in je koppie. Echter, in het eerder geval zou ik bijvoorbeeld absoluut niet weten wat er achter moet en dan begint irritatie op te treden.
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Verwijderd
Nog niet half zo irritant als mensen die je zin mee gaan praten! Dat is echt te irritant voor woorden. Ik heb een klasgenoot die dat onbewust doet, ook al is een docent iets aan het uitleggen. Echt heel vervelend..Gertjan. schreef op donderdag 21 april 2011 @ 13:30:
[...]
Inderdaad, behoorlijk irritant van die mensen die hun zin niet
Als het eendje was dan is het wel weer leukVerwijderd schreef op donderdag 21 april 2011 @ 17:03:
[...]
Nog niet half zo irritant als mensen die je zin mee gaan praten! Dat is echt te irritant voor woorden. Ik heb een klasgenoot die dat onbewust doet, ook al is een docent iets aan het uitleggen. Echt heel vervelend.

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
In de hexadecimale notatie hoeft dat niet. Maar als de functie rgbA is, ja, dan verwacht hij gewoon vier parameters.BM schreef op donderdag 21 april 2011 @ 07:43:
[...]
Huh?
Als je in WPF #00FF00 opgeeft krijg je toch gewoon groen, ongeacht of je nu wel of geen alpha kanaal meegeeft?Volgens mij zet ie alpha juist standaard zo dat het wel zichtbaar is?
Speel ook Balls Connect en Repeat
FromArgb()Onbekend schreef op donderdag 21 april 2011 @ 18:08:
[...]
In de hexadecimale notatie hoeft dat niet. Maar als de functie rgbA is, ja, dan verwacht hij gewoon vier parameters.
[ Voor 8% gewijzigd door Caelorum op 21-04-2011 18:36 ]
Dit topic is gesloten.
Let op:
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes.
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes.