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 dan wel met commentaar erbij vermeld behoort te worden..oisyn schreef op maandag 15 augustus 2005 @ 18:06:
Wat is daar mis mee? Het lijkt me volkomen valide als de schrijver rekening heeft gehouden met de toekomst, dwz dat er mogelijk een stukje code tussen komt die fBlaat op false zet.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Verwijderd
Met het commentaar: "pas op, dit is een variabele, iets of iemand zou de waarde weleens kunnen veranderen?"-NMe- schreef op maandag 15 augustus 2005 @ 18:09:
...wat dan wel met commentaar erbij vermeld behoort te worden.
Dat dat soort constructies gebruikt worden omdat het ooit wel eens kan gaan veranderen snap ik, maar dan zet je er niet dat soort commentaar bij.
[ Voor 27% gewijzigd door Radiant op 15-08-2005 18:13 ]
Het later toevoegen kost niet meer tijd dan er nu rekening mee houden. Zeker niet als het niet altijd gebeurd..oisyn schreef op maandag 15 augustus 2005 @ 18:06:
Wat is daar mis mee? Het lijkt me volkomen valide als de schrijver rekening heeft gehouden met de toekomst, dwz dat er mogelijk een stukje code tussen komt die fBlaat op false zet.
De code wordt er wel 'slechter' door, dus zou ik het niet doen.
Verwijderd
Ik ken 1 situatie in Java die je eigenlijk verplicht (nouja...) om een exception te misbruiken: de isNumber(String); functie die Sun maar weigert om aan Java API toe te voegen. Bijna iedereen die ik ken implementeerd deze met een String.toDouble en geeft dan false terug als er een NumberFormatExeption komt en true als dat niet zo is.kenneth schreef op maandag 15 augustus 2005 @ 16:10:
Exception misbruik (execption = uit-zon-de-ring) vind ik wel een zodanig grote zonde, dat ik hem niet zou misbruiken voor optimalisatie.
Je zou kunnen zeggen dat je altijd een nummer verwacht via deze functie en dat geen number eraan meegeven een exception is, maar ik blijf het misbruik vinden.
Je kan toch ook een regexp gebruiken? Al zal dat waarschijnlijk trager zijn dan met een exception werken.Verwijderd schreef op maandag 15 augustus 2005 @ 23:04:
Ik ken 1 situatie in Java die je eigenlijk verplicht (nouja...) om een exception te misbruiken: de isNumber(String); functie die Sun maar weigert om aan Java API toe te voegen. Bijna iedereen die ik ken implementeerd deze met een String.toDouble en geeft dan false terug als er een NumberFormatExeption komt en true als dat niet zo is.
Je zou kunnen zeggen dat je altijd een nummer verwacht via deze functie en dat geen number eraan meegeven een exception is, maar ik blijf het misbruik vinden.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
In deze code kom ik regelmatig de volgende 'slimme oplossingen' tegen;
1
2
3
4
5
6
| $bestelling = ereg_replace("-------","------", $bestelling); $bestelling = ereg_replace("------","-----", $bestelling); $bestelling = ereg_replace("-----","----", $bestelling); $bestelling = ereg_replace("----","---", $bestelling); $bestelling = ereg_replace("---","--", $bestelling); $bestelling = ereg_replace("--","-", $bestelling); |
Dit wordt dus gebruikt om meerdere liggende streepjes achter elkaar, te vervangen tot 1 liggend streepje...
Toen ik mijn collega vroeg waarom hij het niet zo deed;
1
| $bestelling = ereg_replace("[-]*","-", $bestelling); |
als hij perse een regExp wou gebruiken, of
1
2
3
4
5
6
| $bestelling = str_replace("-------","------", $bestelling); $bestelling = str_replace("------","-----", $bestelling); $bestelling = str_replace("-----","----", $bestelling); $bestelling = str_replace("----","---", $bestelling); $bestelling = str_replace("---","--", $bestelling); $bestelling = str_replace("--","-", $bestelling); |
als hij van replace's houd.. was het antwoord;
"Deze code werkt al jaren, en het is zonde van de tijd om het aan te passen"
Mijn baas begrijp het niet dat ik liever dingen opnieuw ontwikkel dan in de code van collega's werk...
[ Voor 45% gewijzigd door frickY op 16-08-2005 09:31 ]
Op zich logisch dat het niet aangepast wordt als er niks aan de code gedaan moet worden maar niet echt een antwoord op je vraag natuurlijkfrickY schreef op dinsdag 16 augustus 2005 @ 09:30:
als hij van replace's houd.. was het antwoord;
"Deze code wetrkt al jaren, en het is zonde van de tijd om het aan te passen"
“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.”
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Verwijderd
Ik heb laatst een topic geopend wat precies hierover gaat:
[rml][ alg] Herschrijven brakke code collega's?[/rml]
Zelfs de experts zijn er duidelijk over: blijf met je poten van andermans code af. Als het werk, dan werkt het.
Alleen in het geval dat je toch een bug moet fixen in de code of echt groot (radicaal) onderhoud moet plegen, kun je overwegen een WTF weg te halen, maar dan moet je wel eerst met de grootste voorzichtigheid en diplomatie je WTF'ende collega benaderen.
Jaja, en wat als er nou 8 -jes inzitten? dan hou je er altijd 2 overfrickY schreef op dinsdag 16 augustus 2005 @ 09:30:
Owww dat ik dit topic nu pas ontdek!!! Ik werk nu ruim een half jaar bij een internet bedrijf dat voornamelijk sites met een CMS oplevert.
In deze code kom ik regelmatig de volgende 'slimme oplossingen' tegen;
PHP:
1 2 3 4 5 6 $bestelling = ereg_replace("-------","------", $bestelling); $bestelling = ereg_replace("------","-----", $bestelling); $bestelling = ereg_replace("-----","----", $bestelling); $bestelling = ereg_replace("----","---", $bestelling); $bestelling = ereg_replace("---","--", $bestelling); $bestelling = ereg_replace("--","-", $bestelling);
...

Assumptions are the mother of all fuck ups | iRacing Profiel
ik blijf dan ook maar prutsen met arrays, waar je ook een TObjectlist zou kunnen gebruiken... Maar dat vergeet ik dan weer als ik aan iets nieuws begin.
[ Voor 14% gewijzigd door Oscar Mopperkont op 16-08-2005 11:20 ]
1
2
3
4
5
6
7
8
| std::string aString; // aString wordt ingevuld ... if (aString == "eerste waarde" || "tweede waarde") { // doe iets } |
De code in het if-block werd dus altijd uitgevoerd. die code was eigenlijk niet
echt belangrijk, met als gevolg dat dit er al heel lang in zat.
Toch wel grappig, want als je de if statement leest, klinkt het wel goed
Dit is nou mijn nachtmerrie. Code van anderen, waarop je op de eerste 15 keer dat je het leest niet ziet waar de fout zit. En als je vervolgens aan het debuggen slaat jezelf voor je kop slaat en roept: "Dat ik dat niet heb gezien!". Very obvious foutje, maar wel een gemene. Overigens vind ik dit soort fouten wel een fout van de developer in kwestie die er uit had moeten komen tijdens het testen van het betreffende blok code. In dit geval had hij alle "randwaarden" moeten testen, dus "eerste waarde", "tweede waarde" een "andere waarde". Dit zou, in ieder geval bij ons, niet door de tests komen en dus (in princiepe *kuch*) niet in productie code terechtkomen.schoene schreef op dinsdag 16 augustus 2005 @ 11:34:
Heb onlangs deze code tegengekomen op mn werk:
[ Voor 12% gewijzigd door RobIII op 16-08-2005 11:40 ]
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
Dit is idd een veel voorkomende (beginners) fout. Ik heb hem ook al enkele keren gezien.schoene schreef op dinsdag 16 augustus 2005 @ 11:34:
Heb onlangs deze code tegengekomen op mn werk:
C++:
1 2 3 4 5 6 7 8 std::string aString; // aString wordt ingevuld ... if (aString == "eerste waarde" || "tweede waarde") { // doe iets }
De code in het if-block werd dus altijd uitgevoerd. die code was eigenlijk niet
echt belangrijk, met als gevolg dat dit er al heel lang in zat.
Toch wel grappig, want als je de if statement leest, klinkt het wel goed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| int nextValue(int& x) { return (x = x + 1); // or complicated series based on x } int main() { int series = 0; std::cout << " n0 = " << series << " n1 = " << nextValue(series) << " n2 = " << nextValue(series) << std::endl; // prints: "n0 = 2 n1 = 2 n2 = 2" on VC7.1 } |
(en wat als je dit met bekende C library functies doet die niet thread safe zijn? Of bv met rand()? ...)
[ Voor 95% gewijzigd door Zoijar op 16-08-2005 13:22 . Reden: oops foutje :P ]
Ik zit te twijfelen of dit nou per compiler verschillend is. Als namelijk bekend is of de operator links of rechts associatief is, dan heeft dit een eenduidige betekenis. VC7.1 behandelt het volgens mij als rechts assiciatief, maar ligt zoiets vast in de standaard?Zoijar schreef op dinsdag 16 augustus 2005 @ 13:09:
Dit blijft ook altijd tricky:
C++:
1 2 // prints: "n0 = 2 n1 = 2 n2 = 2" on VC7.1 }
(en wat als je dit met bekende C library functies doet die niet thread safe zijn? Of bv met rand()? ...)
Nu ik er over nadenk, wsch niet, omdat het een optimalisatie kwestie is.
[ Voor 19% gewijzigd door Glimi op 16-08-2005 13:26 ]
Verwijderd
Variatie op de 'standaard' bug, waar idd veel mensen intrappen.Zoijar schreef op dinsdag 16 augustus 2005 @ 13:09:
Dit blijft ook altijd tricky:
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 int nextValue(int& x) { return (x = x + 1); // or complicated series based on x } int main() { int series = 0; std::cout << " n0 = " << series << " n1 = " << nextValue(series) << " n2 = " << nextValue(series) << std::endl; // prints: "n0 = 2 n1 = 2 n2 = 2" on VC7.1 }
(en wat als je dit met bekende C library functies doet die niet thread safe zijn? Of bv met rand()? ...)
1
2
3
4
5
6
7
8
9
| void print( int a, int b ) { std::cout "a=" << a << " b=" << b << std:endl; } int main() { int series = 0; print ( series, nextValue(series) ); return 0; } |
Dit is ook zoiets. De output is nu undefined. Ik heb hier ooit eens slaande ruzie over gehad met een collega bij een vorig bedrijf. Ik zei dat je niet op de volgorde van evaluatie moest vetrouwen en dat dit dus fout kon gaan. Het punt was dat het toevallig goed ging op de compiler die we toen gebruikte en die jongen me gewoon keihard niet geloofde. Ik kon lullen als brugman, maar hij geloofde me gewoon keihard niet. Nog een passage in de standaard laten zien, maar ook dat mocht niet baten
Verwijderd
Een collega van mij trapte in de bekende val door steeds meer java code (scriptlets) aan een JSP pagina toe te voegen. Ik heb dus even overlegd met hem en gezegd dat je eigenlijk geen logica met java (Scriptlets) in een JSP pagina moet gebruiken, maar dat je alleen HTML en taglibs (bv JSTL) dient te gebruiken voor opmaak.
Nou, dat 'voor opmaak' was zeker niet goeddoorgekomen. Een tijdje later moest ik toevallig in een JSP pagina van hem kijken, en mijn eerste reactie was daadwerkelijk: WTF!?
Wat was er gebeurd? Hij had een gedeelte van de logica op de pagina gewoon herschreven in JSTL! Alle Java statements gewoon vervangen door JSTL constructies.

(maar goed, na wat overleg is het weer allemaal goedgekomen, en nu terugkijkend is het wel lachen eigenlijk
Ligt niet vast nee, en verschilt dus per compiler. De associativiteit van de operators ligt wel vast, maar de volgorde van executie niet. Het is (vrijwel) niet mogelijk om zeker te zijn van de volgorde van executie in C++. Er zijn maar twee regels, en dat is dat tussen sequence points alle side effect 'gedaan' zijn, en dat de waarneembare status onveranderd blijft door reordering van instructies. Waarneembare status is I/O en I/O naar volatile. Je kan dus enigszins wat doen met 'volatile' om de ordering te beinvloeden. Dit is ook waarom bv double checked locking niet werkt. Omdat je bij een statement van de vorm "instance = new Singleton;" niet weet wat er eerst gebeurt: de allocatie, de constructie, of de pointer assignment.Glimi schreef op dinsdag 16 augustus 2005 @ 13:23:
Ik zit te twijfelen of dit nou per compiler verschillend is. Als namelijk bekend is of de operator links of rechts associatief is, dan heeft dit een eenduidige betekenis. VC7.1 behandelt het volgens mij als rechts assiciatief, maar ligt zoiets vast in de standaard?
edit:
Nu ik er over nadenk, wsch niet, omdat het een optimalisatie kwestie is.
Verwijderd
1
2
3
4
5
| private string _patientGuid { get {return (string) Session["PatientGuid"];} set {Session["PatientGuid"] = _patientGuid;} } |
Het is erg vervelend als compilers dingen die undefined zijn wel goed doen... Net als bv geheugen of pointers op 0 initialiseren. Tijd terug nog een probleem mee gehad: een groot stuk code werkte overal, en ik ging er thuis aan werken en daar crashed het runtime. Na uren zoeken bleek het dat er een pointer niet geinitialiseerd was. Er werden wel null-checks op pointers gedaan, maar blijkbaar waren die toevallig null op alle andere platformen; behalve de mijne dus.Verwijderd schreef op dinsdag 16 augustus 2005 @ 13:39:
Dit is ook zoiets. De output is nu undefined. Ik heb hier ooit eens slaande ruzie over gehad met een collega bij een vorig bedrijf. Ik zei dat je niet op de volgorde van evaluatie moest vetrouwen en dat dit dus fout kon gaan. Het punt was dat het toevallig goed ging op de compiler die we toen gebruikte en die jongen me gewoon keihard niet geloofde. Ik kon lullen als brugman, maar hij geloofde me gewoon keihard niet. Nog een passage in de standaard laten zien, maar ook dat mocht niet baten
Erg handig om alles op 0xDEADBEEF the initiaiseren
Op sommige punten zet ik bij een try {} catch een system exit neer omdat ik dan zeker wil weten dat het programma niet meer start/verder gaat.
Best aardig natuurlijk, alleen niet als je dezelfde constructie toepast in een java bean...ploff daar ging jboss keurig netjes alles afsluiten.
Website|Air 3s|Mini 4 Pro|Avata 2|Canon R6|Canon 5d2|8 fisheye|14f2.8|24f2.8|50f1.8|135f2|10-22|17-40|24-105|70-300|150-600
Misschien klinkt Criminals (tekst-based RGP game) wel bekend bij jullie, vele jongeren gebruiken deze source. Maar nog steeds is het onbekend wie nou de auteur is.
Laat ik maar een stukje geven, en houd je goed vast aan je stoel zou ik zeggen :+:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| <?php /* ------------------------- */ include("_include-config.php"); if(! check_login()) { header("Location: login.php"); exit; } if(! ($data->level & 0x80)) exit; mysql_query("UPDATE `[users]` SET `online`=NOW() WHERE `login`='{$data->login}'"); /* ------------------------- */ ?> <html> <head> <title> Cyber-war </title> <link rel="stylesheet" type="text/css" href="<?php echo ($_COOKIE['v'] == 2) ? "css-v2.css" : "css-v1.css"; ?>"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <style="background: #000000; margin: 0px;"> Je moet admin heten om iedereen te resetten.<br> <? if($data->login == admin) { ?> <a href="massa-reset.php?p=tjahierstondeenpasswoord">Klik hier om het hele spel te Resetten.</a><br> <?php if($_GET['p'] == "tjahierstondeenpasswoord"){ mysql_query("UPDATE `[users]` SET `IPs`=''"); mysql_query("UPDATE `[users]` SET `cash`='2500'"); mysql_query("UPDATE `[users]` SET `bank`='2500'"); mysql_query("UPDATE `[users]` SET `bankleft`='5'"); mysql_query("UPDATE `[users]` SET `bankmax`='2500'"); mysql_query("UPDATE `[users]` SET `clicks`='0'"); mysql_query("UPDATE `[users]` SET `clickstoday`='0'"); mysql_query("UPDATE `[users]` SET `attack`='0'"); mysql_query("UPDATE `[users]` SET `defence`='0'"); mysql_query("UPDATE `[users]` SET `attwins`='0'"); mysql_query("UPDATE `[users]` SET `attlosses`='0'"); mysql_query("UPDATE `[users]` SET `defwins`='0'"); mysql_query("UPDATE `[users]` SET `deflosses`='0'"); mysql_query("UPDATE `[users]` SET `clan`=''"); mysql_query("UPDATE `[users]` SET `clanlevel`='0'"); mysql_query("UPDATE `[users]` SET `turns`='100'"); mysql_query("UPDATE `[users]` SET `showonline`='1'"); mysql_query("UPDATE `[users]` SET `attack`='0'"); mysql_query("UPDATE `[users]` SET `defence`='0'"); mysql_query("UPDATE `[users]` SET `attwins`='0'"); mysql_query("UPDATE `[users]` SET `Mes`='0'"); mysql_query("UPDATE `[users]` SET `Walter P99`='0'"); mysql_query("UPDATE `[users]` SET `Uzi`='0'"); mysql_query("UPDATE `[users]` SET `MP5k`='0'"); mysql_query("UPDATE `[users]` SET `Flashbang`='0'"); mysql_query("UPDATE `[users]` SET `Granaat`='0'"); mysql_query("UPDATE `[users]` SET `Shotgun`='0'"); mysql_query("UPDATE `[users]` SET `G36C`='0'"); mysql_query("UPDATE `[users]` SET `SIG 552`='0'"); mysql_query("UPDATE `[users]` SET `Ak47`='0'"); mysql_query("UPDATE `[users]` SET `Ak Beta`='0'"); mysql_query("UPDATE `[users]` SET `Scherpschut geweer`='0'"); mysql_query("UPDATE `[users]` SET `M4`='0'"); mysql_query("UPDATE `[users]` SET `Granaat Lanceerder`='0'"); mysql_query("UPDATE `[users]` SET `Bazooka`='0'"); mysql_query("UPDATE `[users]` SET `Kogelvrij vest`='0'"); mysql_query("UPDATE `[users]` SET `Bulldog`='0'"); mysql_query("UPDATE `[users]` SET `Camera`='0'"); mysql_query("UPDATE `[users]` SET `Hek`='0'"); mysql_query("UPDATE `[users]` SET `Muur`='0'"); mysql_query("UPDATE `[users]` SET `Bunker`='0'"); mysql_query("UPDATE `[users]` SET `Mobieltje`='1'"); mysql_query("UPDATE `[users]` SET `FN P90`='0'"); mysql_query("UPDATE `[users]` SET `Chip`='0'"); mysql_query("UPDATE `[users]` SET `Helm`='0'"); mysql_query("UPDATE `[users]` SET `Politie wagen`='0'"); print <<<ENDHTML <p><font color="#FFFFFF" size="4"><b>U heeft net het hele spel gereset!!</b></font></p> <p><font size="4"><a href="hq.php">klik hier om terug te gaan naar het hoofdkwartier</a></font></p> ENDHTML;} else print "<BR>n"; } ?> </body> </html> |
en het ergste vind ik dat ze voor het updaten van diverse velden al zat queries gebruiken. je kan ook meerdere dingen updaten in 1 querie. ? Als de auteur dit makkelijk vind, echt handig is het niet ?
mysql_pconnect() is ook niet handig. Persistentie connecties zijn niet leuk meestal voor servers.
Maar het blijft een vraag. Wie o wie is de maker?
[ Voor 87% gewijzigd door AW_Bos op 16-08-2005 16:02 ]
☎ Telecommunicatie van vroeger
🚅Alles over spoor en treintjes
doet niet aan icons, usertitels of signatures
Ok, ik ziet niet diep in C++, dus dit is pure speculatie van mijn kant hoor. Ik wil je ook niet in twijfel trekken, maar eerder de boel wat beter begrijpen.Zoijar schreef op dinsdag 16 augustus 2005 @ 13:49:
Ligt niet vast nee, en verschilt dus per compiler. De associativiteit van de operators ligt wel vast, maar de volgorde van executie niet. Het is (vrijwel) niet mogelijk om zeker te zijn van de volgorde van executie in C++.
Stel << is rechts associeerend, dan kunnen we het schrijven als:
1
2
3
4
5
| (std::cout << (" n0 = " << (series << (" n1 = " << (nextValue(series) << (" n2 = " << (nextValue(series) << std::endl) ) ) ) ) ) ) |
Stel we vervangen nu de operator door een functiecall
1
2
3
4
5
6
7
8
| f(std::cout, f(" n0 = ", f(series, f(" n1 = ", f(nextValue(series), f(" n2 = ", f(nextValue(series), f(std::endl) ) ) ) ) ) ) |
Hij zal eerst z'n argument moeten berekenen voordat hij de call kan doen.
Err... hmmz nu ik het uitschrijf zie ik het ook wel staan eigenlijk. Hij kan natuurlijk eerst kiezen om het tweede argument te berekenen of het eerste argument. Net wat het beste uitkomt en daarmee is het niet bepaald in welke volgorde hij de boel gaat uitrekenen.
Super, duidelijk. Bedankt voor het inzicht Zoijar.Er zijn maar twee regels, en dat is dat tussen sequence points alle side effect 'gedaan' zijn, en dat de waarneembare status onveranderd blijft door reordering van instructies. Waarneembare status is I/O en I/O naar volatile. Je kan dus enigszins wat doen met 'volatile' om de ordering te beinvloeden. Dit is ook waarom bv double checked locking niet werkt. Omdat je bij een statement van de vorm "instance = new Singleton;" niet weet wat er eerst gebeurt: de allocatie, de constructie, of de pointer assignment.
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 kreeg pas geleden ook een mailtje van iemand die wat dingen in elkaar had gedraaid om al zijn users te kunnen mailen. Het haalde alle usernames op, doorliep ze vervolgens allemaal, deed daarin een query om te kijken wat de prefs waren, aan de hand van die prefs werd er nog een query gedaan om data uit de database te trekken, en vervolgens nog een query om de hoeveelheid mailtjes die die user had gehad met 1 op te hogen. In principe is dat voor een scriptje wat incidenteel 10 users mailt niet zo'n probleem, maar wel als je het elke week loslaat op zo'n 1500 usersAW_Bos schreef op dinsdag 16 augustus 2005 @ 15:56:
Dan heb ik de echte nachtmerrie gevonden op enkele web-scripters forums.
Misschien klinkt Criminals (tekst-based RGP game) wel bekend bij jullie, vele jongeren gebruiken deze source. Maar nog steeds is het onbekend wie nou de auteur is.
Laat ik maar een stukje geven, en houd je goed vast aan je stoel zou ik zeggen :+:
PHP:
1 {lap code}
en het ergste vind ik dat ze voor het updaten van diverse velden al zat queries gebruiken. je kan ook meerdere dingen updaten in 1 querie. ? Als de auteur dit makkelijk vind, echt handig is het niet ?
mysql_pconnect() is ook niet handig. Persistentie connecties zijn niet leuk meestal voor servers.
Maar het blijft een vraag. Wie o wie is de maker?. Dat zal een eeuwige vraag blijven denk ik
.

Sole survivor of the Chicxulub asteroid impact.
het kan zelfs met 2 querys: eentje om alle mailadressen te selecteren, en eentje om bij iedereen met die een mail gaat krijgen hem op te hogen.AtleX schreef op dinsdag 16 augustus 2005 @ 16:50:
[...]
Ik kreeg pas geleden ook een mailtje van iemand die wat dingen in elkaar had gedraaid om al zijn users te kunnen mailen. Het haalde alle usernames op, doorliep ze vervolgens allemaal, deed daarin een query om te kijken wat de prefs waren, aan de hand van die prefs werd er nog een query gedaan om data uit de database te trekken, en vervolgens nog een query om de hoeveelheid mailtjes die die user had gehad met 1 op te hogen. In principe is dat voor een scriptje wat incidenteel 10 users mailt niet zo'n probleem, maar wel als je het elke week loslaat op zo'n 1500 users. Met wat joins in de queries heb ik het geheel terug gebracht tot 1 query vooraf, en 1 query bij elke lusdoorloop die de teller ophoogde als het versturen van de mail gelukt was. Preventief heb ik de memory limit voor het script wat opgeschroeft zodat hij weer even vooruit kan
.
Assumptions are the mother of all fuck ups | iRacing Profiel
En als het versturen van 1 van die mails fout gaat dan? Weer een update om de teller te verlagen?Salandur schreef op dinsdag 16 augustus 2005 @ 17:15:
[...]
het kan zelfs met 2 querys: eentje om alle mailadressen te selecteren, en eentje om bij iedereen met die een mail gaat krijgen hem op te hogen.

[ Voor 7% gewijzigd door RobIII op 16-08-2005 17:18 ]
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
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.
Geen probleem. Ik moest het zelf ook weer even goed nakijken, waardoor het nu weer vers in het geheugen ligt. Altijd goed om dit soort dingen bij te houdenGlimi schreef op dinsdag 16 augustus 2005 @ 16:07:
Super, duidelijk. Bedankt voor het inzicht Zoijar.
MSVC maakt er trouwens leuke code van:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| ; 58 : int series = 0; ; 59 : std::cout << "n0 = " << series << " n1 = " << nextValue(series) << " n2 = " << nextValue(series) << std::endl; push 2 push OFFSET FLAT:??_C@_06FNDEGBIO@?5n2?5?$DN?5?$AA@ push 2 push OFFSET FLAT:??_C@_06BKJEBLFO@?5n1?5?$DN?5?$AA@ push 2 push OFFSET FLAT:??_C@_05MEOHHFKP@n0?5?$DN?5?$AA@ push OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> > add esp, 8 mov ecx, eax call ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<< |
Zo zie je maar weer...functie aanroep, welke functie aanroep?
[ Voor 10% gewijzigd door Zoijar op 16-08-2005 17:30 ]
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 dinsdag 16 augustus 2005 @ 17:22:
Wat let je om de update pas te doen nadat de mails verstuurd zijn?
1
2
3
4
5
6
7
| If bAllSentOK then Update users set mails_received = mails_received + 1 else for t=0 to UBound(SuccessArray) Update users set mails_received = mails_received + 1 where us_id = SuccessArray(T) next end if |
Zoiets? Lekker duidelijk ... Mag je ook nog eens een array gaan zitten bijhouden tijdens het mails sturen welke nu succesvol zijn en welke niet. Of zoiets:
1
2
3
4
5
6
7
8
| If bAllSentOK then Update users set mails_received = mails_received + 1 else for t=0 to UBound(SuccessArray) sOut = sOut & SuccessArray(T) & "," next Update users set mails_received = mails_received + 1 where us_id in (Left(sOut,Len(sOut)-1)) end if |
(Beide "pseudo code" en vrij SQL e.d. door elkaar).
Doe mij dan maar lekker de DB bijwerken na ieder mailtje. Houdt de load ook wat lager wegens de "vertraging" tussen de queries wegens de mails sturen
En nog beter: Een disconnected recordsetje bijhouden, daarbij zelf de waardes ophogen en dan uiteindelijk connecten en een updatebatch er tegen aan knallen
[ Voor 27% gewijzigd door RobIII op 16-08-2005 17:37 ]
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
2, 2, 1 bij mij? (8.0.50215.44 beta2, zowel debug als release build) Ach het bewijst in ieder geval het punt.oisyn schreef op dinsdag 16 augustus 2005 @ 17:31:
Grappig is overigens dat MSVC++ 8.0 wel 0, 1, 2 output
Beter laat dan nooit, gcc maakt ervan:Glimi schreef op dinsdag 16 augustus 2005 @ 13:23:
[...]
Ik zit te twijfelen of dit nou per compiler verschillend is. Als namelijk bekend is of de operator links of rechts associatief is, dan heeft dit een eenduidige betekenis. VC7.1 behandelt het volgens mij als rechts assiciatief, maar ligt zoiets vast in de standaard?
edit:
Nu ik er over nadenk, wsch niet, omdat het een optimalisatie kwestie is.
1
| n0 = 2 n1 = 2 n2 = 1 |
Nee, want ik ging er al niet vanuit dat iedereen standaard de mail krijgt omdat je dat nou net in je preferences in kon stellen.
Zoals ik al zei, die array zul je toch op de een of andere manier hebben, of die nou rechtstreeks uit je database komt of even ergens intern opgeslagen staat. Ik zie niet in hoe dat slecht is. En als je dan de mail aan het versturen bent kun je iedereen bij wie het foutgaat uit de lijst wegstrepen en dan hou je exact een lijst over bij wie het wel gelukt is. Wat is hier nou "bad practice" aan?Lekker duidelijk... Mag je ook nog eens een array gaan zitten bijhouden tijdens het mails sturen welke nu succesvol zijn en welke 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.
Hmmmz, nu ik dit zie en dan het stukje van mezelf erboven, zie ik dat ik weer wat onzin heb neergezet. Rechts associatief is onzin, VC7.1 lijkt gewoon eerst alle functiecalls te doen. GCC en de VC van Zoijar doen wel de boel netjes van rechts naar links.Dannr schreef op dinsdag 16 augustus 2005 @ 17:40:
Beter laat dan nooit, gcc maakt ervan:
code:
1 n0 = 2 n1 = 2 n2 = 1
Ik krijg idd ook 2, 2, 1 in een release build, maar in debug is het toch echt 0, 1, 2. De /clr optie staat wel aan, even kijken of dat uitmaaktZoijar schreef op dinsdag 16 augustus 2005 @ 17:40:
[...]
2, 2, 1 bij mij? (8.0.50215.44 beta2, zowel debug als release build) Ach het bewijst in ieder geval het punt
.edit: dat maakt idd uit
[ Voor 4% gewijzigd door .oisyn op 16-08-2005 17:49 ]
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.
Niks joh! Dat was mijn punt.oisyn schreef op dinsdag 16 augustus 2005 @ 17:45:
Wat is hier nou "bad practice" aan?
We gaan lekker vandaag met z'n tweetjes he?
[ Voor 35% gewijzigd door RobIII op 16-08-2005 17:49 ]
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
1
| Decimal huisnr = (decimal)BllHelper.ConvertToDecimal( this.huisnummer.Text.Trim() ); |

oogjes open, snaveltjes dicht
Wat maakt dit het slechtste prog voorbeeld?Don Facundo schreef op woensdag 17 augustus 2005 @ 09:45:
C#:
1 Decimal huisnr = (decimal)BllHelper.ConvertToDecimal( this.huisnummer.Text.Trim() );
daar heb je tenslotte
1
| Convert.ToDecimal( string ); |
voor. Nou zou het kunnen dat die BllHelper geen exception gooit maar dan weet je nog steeds niet wanneer het een ongeldig nummer is.
[edit]
O en de cast lijkt me natuurlijk ook niet meer nodig als je net Geconverteerd hebt
[ Voor 11% gewijzigd door Woy op 17-08-2005 10:01 ]
“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.”
1) Huisnummer decimal?questa schreef op woensdag 17 augustus 2005 @ 09:53:
[...]
Wat maakt dit het slechtste prog voorbeeld?
2) Decimal = (decimal)Convert.ToDecimal() beetje overdone? En cast dan nog naar Decimal en niet naar decimal.
oogjes open, snaveltjes dicht
“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.
Maar een huisnummer in een decimal opslaan is wel raar ja.
https://fgheysels.github.io/
Ik weet het niet zeker maar volgens mij is het zelfs gewoon een Alias dus dan is het voor de compiler exact hetzelfde.whoami schreef op woensdag 17 augustus 2005 @ 10:08:
Die cast is idd een beetje overdone, maar een decimal en een Decimal in .NET mappen eigenlijk naar hetzelfde datatype. Een decimal is geloof ik, het primitieve type, en Decimal is het .NET type.
Maar een huisnummer in een decimal opslaan is wel raar ja.
Maar idd Gebruik dan gewoon altijd dezelfde dat is ieder geval duidelijker.
Voor de rest kan je een Huisnummer natuurlijk best numeriek opslaan als je dan ook maar een apart gedeelte hebt voor de toevoeging. Volgens mij heeft elk adres nog steeds een numeriek huisnummer gedeelte. Al zou ik het zelf idd niet als numeriek opslaan.
“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.”
Dit is inderdaad onnodig.
Die merkt de compiler bij een release build en de optimizer zal dit gewoon negeren.2) Decimal = (decimal)Convert.ToDecimal() beetje overdone? En cast dan nog naar Decimal en niet naar decimal.
Ik zou inderdaad ook gewoon een string pakken.rwb schreef op woensdag 17 augustus 2005 @ 10:14:
[...]
Voor de rest kan je een Huisnummer natuurlijk best numeriek opslaan als je dan ook maar een apart gedeelte hebt voor de toevoeging. Volgens mij heeft elk adres nog steeds een numeriek huisnummer gedeelte.
[ Voor 33% gewijzigd door pjvandesande op 17-08-2005 10:19 ]
Ik ben er vrijwel zeker van dat dat niet zo is; Decimal is zeer zeker een struct, en decimal is een primitive. Om van decimal naar Decimal te gaan, en omgekeerd, moet er volgens mij ook geboxed en ge-unboxed worden.rwb schreef op woensdag 17 augustus 2005 @ 10:14:
[...]
Ik weet het niet zeker maar volgens mij is het zelfs gewoon een Alias dus dan is het voor de compiler exact hetzelfde.
Er moet niet geboxed worden.
Numeriek opslaan, ok, maar een decimal is toch niet nodig ? Gebruik dan gewoon een int.Voor de rest kan je een Huisnummer natuurlijk best numeriek opslaan als je dan ook maar een apart gedeelte hebt voor de toevoeging. Volgens mij heeft elk adres nog steeds een numeriek huisnummer gedeelte. Al zou ik het zelf idd niet als numeriek opslaan.
[ Voor 3% gewijzigd door whoami op 17-08-2005 10:27 ]
https://fgheysels.github.io/
Waarom dan geen int? Ik ken niemand die op nummer 15 en een half woont.rwb schreef op woensdag 17 augustus 2005 @ 10:14:
[...]
Ik weet het niet zeker maar volgens mij is het zelfs gewoon een Alias dus dan is het voor de compiler exact hetzelfde.
Maar idd Gebruik dan gewoon altijd dezelfde dat is ieder geval duidelijker.
Voor de rest kan je een Huisnummer natuurlijk best numeriek opslaan als je dan ook maar een apart gedeelte hebt voor de toevoeging. Volgens mij heeft elk adres nog steeds een numeriek huisnummer gedeelte. Al zou ik het zelf idd niet als numeriek opslaan.
edit @ hieronder : de aanname van apart opslaan was al in het door mij gequote stukje gedaan.
[ Voor 8% gewijzigd door Janoz op 17-08-2005 11:05 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Flatbewoners hebben nog weleens de neiging op 63A ofzo te wonen.Janoz schreef op woensdag 17 augustus 2005 @ 10:23:
[...]
Waarom dan geen int? Ik ken niemand die op nummer 15 en een half woont.
Als je per se je huisnummer in een int wil hebben moet je 't in 2 delen opslaan anders... dat lijkt me ook wat onhandig.
Saved by the buoyancy of citrus
want ik vindt ook de toevoeging eigenlijk wel bij het nummer horen omdat het gewoon nodig is om een adres uniek te indentificeren. want je kan ook nummers hebben als 2 bis 2 hoog. Dan kan je natuurlijk bis 2 hoog als toevoegsel opslaan maar ik vindt het dan duidelijker om het gewoon in een veld te houden aangezien het gewoon een unieke identifier binnen de straat is. Bedenkt me trouwens wel dat dat problemen kan geven met het sorteren.
Ik wist het idd ook niet zeker. Ik gebruik ze ook meestal zo. Als ik een datatype aangeef dan gebruik ik decimal en als ik er een static method van gebruik gebruik ik Decimal aangezien je een method aanroept op een Object en de standaard is nou eenmaal dat je daarvoor hoofdletters gebruikt.Ik ben er vrijwel zeker van dat dat niet zo is; Decimal is zeer zeker een struct, en decimal is een primitive.
“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.”
In tweeëen opdelen werkt niet, daarvoor zijn er te veel varianten. Bij woonboten wordt bijvoorbeeld het huisnummer aangehouden van het huis waarvoor de boot ligt en wordt er a.b. (= aan boord) voor gezet: Lindelaan a.b. 12. Wat nog veel vaker voorkomt: een pand met meerdere huisnummers: Lindelaan 14-18. En dan heb ik het nog niet eens over varianten zoals Lindelaan 22bis. Trouwens: welk huisnummer zou je willen gebruiken om een bouwplaats in een nieuwe wijk aan te duiden? Vaak bestaat daar nog niet eens een officiële postcode. Kortom: een huisnummer moet je in een string opslaan.Cyphax schreef op woensdag 17 augustus 2005 @ 10:27:
[...]
Flatbewoners hebben nog weleens de neiging op 63A ofzo te wonen.
Als je per se je huisnummer in een int wil hebben moet je 't in 2 delen opslaan anders... dat lijkt me ook wat onhandig.
Een goede grap mag vrienden kosten.
Je hebt gelijk. Ik was even in de war met bool wat wel een alias is voor System.Boolean.whoami schreef op woensdag 17 augustus 2005 @ 10:19:
[...]
Ik ben er vrijwel zeker van dat dat niet zo is; Decimal is zeer zeker een struct, en decimal is een primitive.
System.Decimal is idd een struct.
“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.”
1
2
3
4
5
6
7
8
9
10
11
12
| #include <iostream> using namespace System; void f(System::Int32) { } void f(int) { } // error: f(int) already has a body int main() { std::cout << typeid(System::Boolean).name() << std::endl; // outputs "bool" std::cout << typeid(System::Int32).name() << std::endl; // outputs "int" } |
I love C++/CLI
.edit: in de MSDN staat overigens ook dat decimal een C# alias is voor System.Decimal.
[ Voor 15% gewijzigd door .oisyn op 17-08-2005 11:28 ]
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.
idd
1
2
3
4
5
6
| public void Test( Decimal a ) { } public void Test( decimal a ) { } |
geeft compiler error
Class 'WindowsApplication2.Form1' already defines a member called 'Test' with the same parameter types
Mmm dat zag ik hier niet staan. En bij bool wel letterlijk.edit: in de MSDN staat overigens ook dat decimal een C# alias is voor System.Decimal.
[edit]
nou ik beter kijk toch wel
The following table shows the keywords for built-in C# types, which are aliases of predefined types in the System namespace.
C# Type .NET Framework type bool System.Boolean byte System.Byte sbyte System.SByte char System.Char decimal System.Decimal double System.Double float System.Single int System.Int32 uint System.UInt32 long System.Int64 ulong System.UInt64 object System.Object short System.Int16 ushort System.UInt16 string System.String
[ Voor 114% gewijzigd door Woy op 17-08-2005 11:41 ]
“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.”
Verwijderd
Herb Sutter is een cool mannetje
Mischien kan tweakers eens van C++/CLI een mooie tech review schrijven als VS.NET 2005 final uit is?
1
2
3
4
5
| If voorwaarde = true then <intVariabele> = 5 else <intVariabele> = 5 end if |
weinig uitleg voor nodig dat deze voorwaardelijke conditie overbodig is. Maar toch betrap ik mezelf ook regelmatig op dit soort prutswerk. Om de simpele reden dat je tijdens het ontwerpen die voorwaardelijke conditie wel nodig hebt gehad en uiteindelijk, bij het debuggen er achter bent gekomen dat je toch géén voorwaarde nodig hebt gehad.
maar nu mijn punt
Zou het topic niet beter worden als we direct bij de code schrijven wat er beter / anders aan zou kunnen. Dan kunnen beginners (waaronder mijzelf) meteen zien hoe het hoort en wat "done" is en wat "not done" is.
concreet: slechter prog voorbeelden en de oplossing / verbetering
[ Voor 4% gewijzigd door BovenHond op 17-08-2005 21:56 ]
1
2
3
4
| if (i != 0 || i != 1) { //Deze compoundstatement zal dus altijd uitgevoerd worden } |
-_-"
Ik kan me eigenlijk heel moeilijk voorstellen hoe iemand er bij het debuggen pas achter komt dat een bepaalde voorwaarde de program flow niet beinvloed.
@prototype:
Een duidelijk deMorgan foutje
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Yeah, het herschrijven van die expressie volgens deMorgan had explicieter boekdelen moeten spreken. Helaas heeft niet iedereen logica gehadJanoz schreef op donderdag 18 augustus 2005 @ 09:35:
@Bovenhond:
Ik kan me eigenlijk heel moeilijk voorstellen hoe iemand er bij het debuggen pas achter komt dat een bepaalde voorwaarde de program flow niet beinvloed.
@prototype:
Een duidelijk deMorgan foutje
Ook hebben ze classes gemaakt voor het construeren van een box op een pagina. Helemaal niet verkeerd dus, behalve dat het aanroepen wordt op de volgende manier:
1
| new infoBox($content, $title); |
Blijkt dus dat ze gewoon de HTML outputten in de constructor, erg slecht imo.
opzich is daar niks mis mee, als dat het enige doel van die class isMichali schreef op donderdag 01 september 2005 @ 15:21:
Blijkt dus dat ze gewoon de HTML outputten in de constructor, erg slecht imo.
Dan is een static method beter imho.Erkens schreef op donderdag 01 september 2005 @ 15:32:
[...]
opzich is daar niks mis mee, als dat het enige doel van die class is
Je verwacht gewoon een dat een object wordt geconstrueerd, zonder side-effects als HTML output imo. Ik zou altijd voor een expliciete method gaan die de output verzorgt. Desnoods roep je het dan zo aan:Erkens schreef op donderdag 01 september 2005 @ 15:32:
[...]
opzich is daar niks mis mee, als dat het enige doel van die class is
1
| new InfoBox($title, $content)->render(); |
nee want dan mis je de voordelen van het gebruik van een object
true, ik denk dat ik het ook op een dergelijke manier zou hebben gedaan, maar het ligt een beetje aan. Want opzich is er weinig mis mee met een constructor die ook nog iets anders doet bij het creeren van het object, mits dit niet verplicht is (bijvoorbeeld met de argumenten die je mee geeft)Michali schreef op donderdag 01 september 2005 @ 15:36:
[...]
Je verwacht gewoon een dat een object wordt geconstrueerd, zonder side-effects als HTML output imo. Ik zou altijd voor een expliciete method gaan die de output verzorgt. Desnoods roep je het dan zo aan:
PHP:
1 new InfoBox($title, $content)->render();
Als je het object nodig hebt... dan vind ik dat je gebruik moet maken van een method als Render oid.Erkens schreef op donderdag 01 september 2005 @ 15:42:
[...]
nee want dan mis je de voordelen van het gebruik van een object
Als alleen de ctor maar nodig is om HTML uit te spugen heb je het object niet nodig dus kan het static.
[ Voor 16% gewijzigd door pjvandesande op 01-09-2005 15:44 ]
Het ligt natuurlijk ook aan de naamgeving van de class, stel het beestje heet iets als HTMLOutputRenderer ofzo, dan is het al duidelijk wat het ding gaat doen. Enne met static heb je nogal wat beperkingen.questa schreef op donderdag 01 september 2005 @ 15:44:
[...]
Als je het object nodig hebt... dan vind ik dat je gebruik moet maken van een method als Render oid.
Als alleen de ctor maar nodig is om HTML uit te spugen heb je het object niet nodig dus kan het static.
Inderdaad, het zou dan een anderen naamgeving moeten hebben. Maar een ctor die alleen HTML uitspuugd vind ik wel heel ransig. Zeker als het object alleen daarvoor gebruikt word en verder niet, dan blijft imho static de beste keuze.Erkens schreef op donderdag 01 september 2005 @ 15:48:
[...]
Het ligt natuurlijk ook aan de naamgeving van de class, stel het beestje heet iets als HTMLOutputRenderer ofzo, dan is het al duidelijk wat het ding gaat doen. Enne met static heb je nogal wat beperkingen.
Op zich niets mis mee want wat heb je eraan het from of to adres te veranderen? Je eigen e-mail naar jezelf sturen is niet echt nuttig en kan ook wel via outlook.OkkE schreef op woensdag 17 augustus 2005 @ 10:06:
Ik kwam pas nog een website tegen waar een contact formulier in stond, met een hidden form-field met het adres waar de email naartoe gestuurd werd. Ik even een eigen form gemaakt, met mijn eigen adres in het 'naar'-veld, en ja hoor: email kwam netjes bij mij aan. Lijkt me toch ook iets dat je eigenlijk zou willen beveiligen.
Ikke:AAAARGH! We zijn gehacked! En da's al de zoveelste keer! En we draaien nog wel een firewall en virusscanner bla bla bla... Hoe komt dat?
* RobIII checked wat stuff.... Ontdekt een firewall die uit staat, een gratis (meuk) virusscanner en een IIS+PHP+MySQL configuratie die completely default is. Vervolgens kijk ik in een PHP bestand, en daar zie ik dit staan:Ik heb geen idee, maar ik zal eens even kijken...
1
2
3
4
5
6
7
8
9
10
11
| <?php include "c:\internet\databasesettings.php"; $connection = mysql_connect($DB_SERVER, $DB_USER, $DB_PASSWORD) or die("Kan gaan verbinding met de server maken."); mysql_select_db($DB_NAME, $connection); $barcode2 = strtolower(ltrim(rtrim($barcode))); $barcode2 = ereg_replace("\.","",$barcode2); $barcode = strtolower($barcode); $query = "SELECT * FROM XXXX WHERE LCASE(barcode) LIKE \"%$barcode\" OR LCASE(barcode) LIKE \"%$barcode2\""; $result = mysql_query($query, $connection); ?> |
Nu ben ik zelf nogal een ASP-er en niet zo'n PHP-er, maar zie ik hier geen mega-sql-injection mogelijkheden? Of mis ik iets?
(Los van het feit dat ik alle bovenstaande "stommiteiten" in 2 minuten tijd ontdekte en ik niet verder durf te kijken wat ik nog meer tegen kom...
[ Voor 12% gewijzigd door RobIII op 01-09-2005 15:58 ]
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
Iets ruimer denken. Zo'n lek is ideaal om bergen spam te versturen naar willekeurige personen.TXC schreef op donderdag 01 september 2005 @ 15:52:
[...]
Op zich niets mis mee want wat heb je eraan het from of to adres te veranderen? Je eigen e-mail naar jezelf sturen is niet echt nuttig en kan ook wel via outlook.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Mja, als je dat static maakt, dan kan je ook geen gebruik gaan maken van de polymorfische mogelijkheden die een OO taal je biedt.questa schreef op donderdag 01 september 2005 @ 15:44:
[...]
Als je het object nodig hebt... dan vind ik dat je gebruik moet maken van een method als Render oid.
Als alleen de ctor maar nodig is om HTML uit te spugen heb je het object niet nodig dus kan het static.
https://fgheysels.github.io/
Alleen als register globals aan staat, wat waarschijnlijk het geval is als alles default is (in nieuwere versies is dit niet zo, maar ik verwacht niet dat ze die hebben draaien).RobIII schreef op donderdag 01 september 2005 @ 15:55:
Nu ben ik zelf nogal een ASP-er en niet zo'n PHP-er, maar zie ik hier geen mega-sql-injection mogelijkheden? Of mis ik iets?
Dit lijkt mij op de constructie in JSP:Michali schreef op donderdag 01 september 2005 @ 15:21:
Ook hebben ze classes gemaakt voor het construeren van een box op een pagina. Helemaal niet verkeerd dus, behalve dat het aanroepen wordt op de volgende manier:
PHP:
1 new infoBox($content, $title);
Blijkt dus dat ze gewoon de HTML outputten in de constructor, erg slecht imo.
1
| <%= new Bla()%> |
Waarbij een anoniem object geïnstantieerd wordt en direct (impliciet) diens .toString() wordt aangeroepen. Daar is volgens mij niks mis mee als je die klasse gebruikt als een shortcut voor bepaalde opmaak die ook nog eens afhankelijk is van bepaalde state-informatie van de rest van het pakket.
[ Voor 16% gewijzigd door Remus op 01-09-2005 16:01 ]
Een constructor is voor initialisatie (hence de naam "constructor"), html output is geen initialisatie. Daarnaast, de gebruiker heeft duidelijk niets aan dit 'voordeel' (hij wordt immers niet geassigned aan een variabele dus je kunt er verder niets meer mee). Als de functie die de html uit moet spugen een object nodig heeft dan maakt ie er intern maar een, dit is niet iets om de gebruiker mee lastig te vallen.Erkens schreef op donderdag 01 september 2005 @ 15:42:
[...]
nee want dan mis je de voordelen van het gebruik van een object
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.
PHP 4.4.0Michali schreef op donderdag 01 september 2005 @ 15:58:
[...]
Alleen als register globals aan staat, wat waarschijnlijk het geval is als alles default is (in nieuwere versies is dit niet zo, maar ik verwacht niet dat ze die hebben draaien).
Waar vind ik dat register globals? In C:\Windows\PHP.ini? Want daar staat in: register_globals = Off
Is het dan "SQL-injection-proof"
Ook een leuke: DB Admin naam en pass zijn gelijk. En nog leuker: Beide zijn gewoon de bedrijfsnaam...




Wat een @*!%(&%!@ lopen er toch rond....
Edit: ik heb het even gelezen, maar hoe beschermt register_globals dan tegen SQL injection
[ Voor 35% gewijzigd door RobIII op 01-09-2005 16:06 ]
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
Als de variabel van een veilige locatie komt natuurlijk niet. Maar dat zal wel niet het geval zijn. Dit bestand wordt zeker geinclude door een ander bestand. Het staat idd in je php.ini. Hier wat meer info: http://nl3.php.net/register_globalsRobIII schreef op donderdag 01 september 2005 @ 16:00:
[...]
PHP 4.4.0
offtopic:
Waar vind ik dat register globals? In C:\Windows\PHP.ini? Want daar staat in: register_globals = Off
Is het dan "SQL-injection-proof"
Zie mijn edit. Ik had het al gevonden en gelezen, maar ik zie niet hoe register_globals beschermt tegen SQL injection (in het geval van voorgaande code). De code zoekt in de DB naar een (zoals je kunt zien) barcode. De "input" komt van een ge-POST form van de *kuch* site... Maar nogmaals: Ik ben niet zo'n PHP-er, ASP is meer mijn koekjeMichali schreef op donderdag 01 september 2005 @ 16:05:
[...]
Als de variabel van een veilige locatie komt natuurlijk niet. Maar dat zal wel niet het geval zijn. Dit bestand wordt zeker geinclude door een ander bestand. Het staat idd in je php.ini. Hier wat meer info: http://nl3.php.net/register_globals
(En dit is misschien niet helemaal het juiste topic ervoor
[ Voor 27% gewijzigd door RobIII op 01-09-2005 16:10 ]
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
Daar is ook weinig mis mee, want het is direct duidelijk dat er iets ge-output wordt. In het geval waar ik het over had stond die statement gewoon alleen zo, op 1 regel.Remus schreef op donderdag 01 september 2005 @ 15:59:
[...]
Dit lijkt mij op de constructie in JSP:
code:
1 <%= new Bla()%>
Waarbij een anoniem object geïnstantieerd wordt en direct (impliciet) diens .toString() wordt aangeroepen. Daar is volgens mij niks mis mee als je die klasse gebruikt als een shortcut voor bepaalde opmaak die ook nog eens afhankelijk is van bepaalde state-informatie van de rest van het pakket.
Ik neem aan dat die code in een apart bestand staat. In het geval dat register globals aan zou staan, zou je dit bestand zo kunnen aanroepen: "bestand.php?barcode={SQLInjectieCode}". Puur omdat barcode direct beschikbaar is als variabel in bestand.php. Als register globals uit zou staan echter, dan heb je nog kans dat het allemaal goed kan gaan. Stel dat $barcode eerst uitgebreid getest wordt in het bestand dat bestand.php include, dan is er niets aan de hand. Als er geen controle of escape is, en $barcode wordt gevuld met een input waarde, dan heb je dus wel weer mogelijkheid tot SQL injectie.RobIII schreef op donderdag 01 september 2005 @ 16:07:
[...]
Zie mijn edit. Ik had het al gevonden en gelezen, maar ik zie niet hoe register_globals beschermt tegen SQL injection (in het geval van voorgaande code).
1
2
3
4
5
6
7
8
9
10
11
12
| public abstract class AbstractA { public void doIets() { if (this instanceof B) { // do B specific stuff here } else { // do normal stuff here } } } public class B extends AbstractA { } |
en het moet natuurlijk zijn:
1
2
3
4
5
6
7
8
9
10
11
| public abstract class AbstractA { public void doIets() { // do normal stuff here } } public class B extends AbstractA { public void doIets() { // do B specific stuff here } } |
Het form waar de website bezoeker de barcode invult word gewoon direct gepost. Niks geen controles, het hobbelt zo meteen die query in. Net wat ik dacht dus... Nog een WTF (op een toch al f*cked-up server) dus. En maar janken dat ze steeds "gehacked" worden...Michali schreef op donderdag 01 september 2005 @ 16:10:
[...]
Ik neem aan dat die code in een apart bestand staat. In het geval dat register globals aan zou staan, zou je dit bestand zo kunnen aanroepen: "bestand.php?barcode={SQLInjectieCode}". Puur omdat barcode direct beschikbaar is als variabel in bestand.php. Als register globals uit zou staan echter, dan heb je nog kans dat het allemaal goed kan gaan. Stel dat $barcode eerst uitgebreid getest wordt in het bestand dat bestand.php include, dan is er niets aan de hand. Als er geen controle of escape is, en $barcode wordt gevuld met een input waarde, dan heb je dus wel weer mogelijkheid tot SQL injectie.
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
Gewoon eerlijk uitleggen wat er aan de hand is dusRobIII schreef op donderdag 01 september 2005 @ 16:21:
[...]
Het form waar de website bezoeker de barcode invult word gewoon direct gepost. Niks geen controles, het hobbelt zo meteen die query in. Net wat ik dacht dus... Nog een WTF (op een toch al f*cked-up server) dus. En maar janken dat ze steeds "gehacked" worden...
Huisnummer is numeriek (NEN 5825) 0...99999tomatoman schreef op woensdag 17 augustus 2005 @ 11:02:
...
Kortom: een huisnummer moet je in een string opslaan.
Huisletter is alfanumeriek a..z
Huisnummertoevoeging (Die letters of tekens die noodzakelijk zijn om naast huisnummer en -letter
de brievenbus te vinden.) alfanumeriek dus
Aanduiding bij huisnummer: by of to
En tenslotte is er een lokatieomschrijving (Een al dan niet aanvullende omschrijving van de ligging van een object,indien deze niet of onvoldoende kan worden aangegeven door middel van de adresgegevens.)
Je kunt allerlei methodes gebruiken natuurlijk, maar deze methode wordt gehanteerd bij de overheid.
Siditamentis astuentis pactum.
pffff, uitleggen aan zo'n leken is niet leuk... ik fix0r het wel gewoon allemaal.... en dan de rekening er achter aanMichali schreef op donderdag 01 september 2005 @ 16:30:
[...]
Gewoon eerlijk uitleggen wat er aan de hand is dus
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
Hoe voorkom je het dan?Michali schreef op donderdag 01 september 2005 @ 16:10:
[...]
Ik neem aan dat die code in een apart bestand staat. In het geval dat register globals aan zou staan, zou je dit bestand zo kunnen aanroepen: "bestand.php?barcode={SQLInjectieCode}". Puur omdat barcode direct beschikbaar is als variabel in bestand.php. Als register globals uit zou staan echter, dan heb je nog kans dat het allemaal goed kan gaan. Stel dat $barcode eerst uitgebreid getest wordt in het bestand dat bestand.php include, dan is er niets aan de hand. Als er geen controle of escape is, en $barcode wordt gevuld met een input waarde, dan heb je dus wel weer mogelijkheid tot SQL injectie.
mysql_real_escape_string
Zie deze pagina ook voor wat meer info.
[ Voor 21% gewijzigd door Michali op 01-09-2005 16:44 ]
Maar om daar allemaal apparate veldjes voor te maken gaat imo ook weer een beetje ver (tenzij het dus over een gemeente/overheid/kadaster DB gaatVarienaja schreef op donderdag 01 september 2005 @ 16:36:
[...]
Huisnummer is numeriek (NEN 5825) 0...99999
Huisletter is alfanumeriek a..z
Huisnummertoevoeging (Die letters of tekens die noodzakelijk zijn om naast huisnummer en -letter
de brievenbus te vinden.) alfanumeriek dus
Aanduiding bij huisnummer: by of to
En tenslotte is er een lokatieomschrijving (Een al dan niet aanvullende omschrijving van de ligging van een object,indien deze niet of onvoldoende kan worden aangegeven door middel van de adresgegevens.)
Je kunt allerlei methodes gebruiken natuurlijk, maar deze methode wordt gehanteerd bij de overheid.
[ Voor 4% gewijzigd door Voutloos op 01-09-2005 16:45 ]
{signature}
Het sleutelwoord is hier natuurlijk magic_quotes, niet register_globals. Want of hij nou direct in een variabele wordt opgeslagen of hij pleurt een $_GET["barcode"] in een query, dat maakt geen zak uit. Als magic_quotes uitstaat (wat ik persoonlijk wel prefereer overigens, wie zegt dat ik de inhoud in een db wil gooien? Ik convert 'm dus zelf wel als dat nodig is) kun je SQL injecten, anders niet echt.Michali schreef op donderdag 01 september 2005 @ 16:10:
[...]
Ik neem aan dat die code in een apart bestand staat. In het geval dat register globals aan zou staan, zou je dit bestand zo kunnen aanroepen: "bestand.php?barcode={SQLInjectieCode}". Puur omdat barcode direct beschikbaar is als variabel in bestand.php. Als register globals uit zou staan echter, dan heb je nog kans dat het allemaal goed kan gaan. Stel dat $barcode eerst uitgebreid getest wordt in het bestand dat bestand.php include, dan is er niets aan de hand. Als er geen controle of escape is, en $barcode wordt gevuld met een input waarde, dan heb je dus wel weer mogelijkheid tot SQL injectie.
Die globals kunnen uiteraard ook in fouten resulteren, maar alleen als het script kijkt of een niet van buitenaf komende variabele al gezet is of niet en daar z'n logic op baseert. Als jij bijvoorbeeld een $login_name hebt die alleen door een stukje login code alleen gezet is als je ingelogd bent, dan kun je natuurlijk met een bla.php?login_name=randomuser het script voor de gek houden.
[ Voor 3% gewijzigd door .oisyn op 01-09-2005 16:47 ]
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.
Verwijderd
Bedankt!Michali schreef op donderdag 01 september 2005 @ 16:42:
[...]
mysql_real_escape_string
Zie deze pagina ook voor wat meer info.
Ik was benieuwd of macromedia icm PHAkt wel goede code creeerde of dat ik alles nog moest nalopen. Maar het lijkt goed te gaan.
1
2
3
4
5
6
7
8
9
| // begin Recordset $table__recursive2 = 'TABLE_1'; if (isset($HTTP_GET_VARS['google'])) { $table__recursive2 = $HTTP_GET_VARS['google']; } $query_recursive2 = sprintf("SELECT * FROM x_tables WHERE TABLE_NAME='%s'", $table__recursive2); $recursive2 = $test->SelectLimit($query_recursive2) or die($test->ErrorMsg()); $totalRows_recursive2 = $recursive2->RecordCount(); // end Recordset |
Natuurlijk, maar het ging er even om of er uberhaubt een mogelijkheid was dat er SQL injection kon plaats vinden. Als $barcode direct een waarde krijgt uit $_REQUEST ed., dan heb je dus altijd die mogelijkheid. Toen ik het stukje schreef wist ik namelijk nog niet waar $barcode vandaan kwam, en als register globals uit staat, dan zou er niets aan de hand hoeven zijn (kwa veiligheids probleem dan, kwa ranzige code wel natuurlijk.oisyn schreef op donderdag 01 september 2005 @ 16:46:
[...]
Het sleutelwoord is hier natuurlijk magic_quotes, niet register_globals. Want of hij nou direct in een variabele wordt opgeslagen of hij pleurt een $_GET["barcode"] in een query, dat maakt geen zak uit. Als magic_quotes uitstaat (wat ik persoonlijk wel prefereer overigens, wie zegt dat ik de inhoud in een db wil gooien? Ik convert 'm dus zelf wel als dat nodig is) kun je SQL injecten, anders niet echt.
Die globals kunnen uiteraard ook in fouten resulteren, maar alleen als het script kijkt of een niet van buitenaf komende variabele al gezet is of niet en daar z'n logic op baseert. Als jij bijvoorbeeld een $login_name hebt die alleen door een stukje login code alleen gezet is als je ingelogd bent, dan kun je natuurlijk met een bla.php?login_name=randomuser het script voor de gek houden.
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.
Maar als register globals aan zou staan en het bestand met het stukje code (waarvan ik aanneem dat het in een apart bestand staat) direct aangeroepen wordt (met bijvoorbeeld script.php?barcode={SQL}), dan wordt $barcode dus niet overschreven en is direct geinitialiseerd beschikbaar met die gevaarlijke SQL code er in. Dan maakt dus weldegelijk uit of register globals aan staat. Als register globals uit zou staan, heeft het direct aanroepen van het bestandje geen zin, omdat het onmogelijk is om $barcode gevuld te krijgen. Dat bedoelde ik. Uiteraard, als een ander bestand $barcode vult met $_REQUEST['barcode'], en dan zonder escape direct die andere code include, dan heb je wel een probleem (behalve als magic quotes aan staan dus.oisyn schreef op donderdag 01 september 2005 @ 17:15:
Mijn punt is dat er in de code vanuit wordt gegaan dat $barcode bestaat. Dan komt hij dus óf uit een request, óf wordt hij vanuit een script gezet. In het eerste geval bestaat er een injection gevaar, maar ook zonder globals zou dat bestaan aangezien je dan idd $_REQUEST zou gebruiken. In het tweede geval bestaat er sowieso geen gevaar, omdat de requestvariabelen gezet worden voordat je script gerund wordt, en de $barcode variabele weer overschreven wordt. Ergo, register_globals maakt in dit geval geen enkele reet uit
Verwijderd
Daar was ik dus al bang voor. Maar daarom is dit Topic dus zo interessant, van "domme fouten" van een ander kun je veel van leren. Nu kan ik tenminste verder met het ontwikkelen van mijn site en proberen hem hackproof te maken.Michali schreef op donderdag 01 september 2005 @ 17:06:
Die code lijkt duidelijk gevoelig voor SQL injection. Als parameter google gevult wordt met gevaarlijke SQL code, dan heb je dus een probleem.
Nu nog ergens 120 vrije uren zien te vinden.
1
| IIf(LenB(someString), someString, vbNullString) |
en
1
| if (someString.length != '') |
En het gebruik van LenB() en .length was waarschijnlijk i.v.m. snelheid

En als de teerbeminde collega inmiddels vertrokken is?Verwijderd schreef op dinsdag 16 augustus 2005 @ 09:54:
Alleen in het geval dat je toch een bug moet fixen in de code of echt groot (radicaal) onderhoud moet plegen, kun je overwegen een WTF weg te halen, maar dan moet je wel eerst met de grootste voorzichtigheid en diplomatie je WTF'ende collega benaderen.
Dan pas je met de grootste omzichtigheid alsnog de code aan en documenteer je dat uitvoerig.klinz schreef op woensdag 07 september 2005 @ 18:03:
[...]
En als de teerbeminde collega inmiddels vertrokken is?
1
2
3
4
5
| // --------------------------------------------------------------------------- // Tomatoman @ 7-9-2005: // Hier stond een enorme WTF van onze teerbeminde ex-collega Piet de Prutser. // Nu hij eindelijk is vertrokken heb ik er wat leesbaars van gemaakt. // --------------------------------------------------------------------------- |
Een goede grap mag vrienden kosten.
Dit topic is gesloten.
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.
