Let op: Mijn post bevat meningen, aannames of onwaarheden
Je kunt ze oefenen op de website, 20 vragen per onderdeel.Bv202 schreef op dinsdag 25 januari 2011 @ 23:07:
Ik vraag me nu wel af wat zo'n w3schools-examen inhoudt
Wel grappig, maar niet echt bijster interessant.
Hoe maak je bijvoorbeeld iets dikgedrukt, met <b> of <bold> of nog een andere optie.
Hoe maak je een textbox, etc.
Niet echt hoog niveau vragen.
Battle.net - Jandev#2601 / XBOX: VriesDeJ
Goed toch, anders komen er van die rare streepjes of bolletjes voorGamebuster schreef op dinsdag 25 januari 2011 @ 23:55:
Ik kwam net zoiets tegen:
Cascading Stylesheet:
1 2 3 ul li { list-style: none; }HTML:
1 2 3 4 <ul> <li>1: Koe</li> <li>2: Paard</li> </ul>
Trouwens, als je hier de <ol> tag voor zou gebruiken zou er toch 1. Koe, 2. Paard uitkomen, of kun je ook aangeven dat je een : wilt gebruiken... Dacht namelijk dat dat niet kon in HTML, of je krijgt iets als:
1
2
3
4
| <ol> <li>: Koe</li> <li>: Paard</li> </ol> |
Dat lijkt me niet veel beter
[ Voor 30% gewijzigd door .Gertjan. op 26-01-2011 07:44 ]
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.
1
2
3
4
5
6
7
8
9
10
11
12
| ol { counter-reset: listitem; } ol>li { counter-increment: listitem; list-style: none inside; } ol>li:before { content: counters(listitem, ".") ": "; } |
[ Voor 10% gewijzigd door .oisyn op 26-01-2011 10:05 ]
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.
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 stond waarlijk met een bek vol tanden. Hij heeft wel vaker vage ideeën, terwijl hij denk een uitstekend programmeur is (hij wordt hier samen met mij senior developer genoemd). Ik hoop dat ik hem een beetje ervan heb weten te weerhouden. Maar ik vrees het ergste.
Even een C# voorbeeld hoe sterk het kan zijn:Naj_Geetsrev schreef op woensdag 26 januari 2011 @ 15:49:
Collega...8)7.
1
2
| void DoIets(object o)
{// implementatie} |
Eerst het probleem, dan de oplossing
En hoe weet de functie (ik neem aan dat het PHP is) dan wat deze met die extra parameter moet doen? Zal hij nog steeds de (body van de) functie aan moeten passen... Overigens ken ik ook van zulke genieën. Die hebben ook vooral moeite met het onderscheiden van statische klassen of niet-statische objecten, en wat daarvan de impact is op de applicatie.Naj_Geetsrev schreef op woensdag 26 januari 2011 @ 15:49:
Collega stelde gisteren met een stalen gezicht voor om in plaats van parameters te definiëren bij functies voortaan alleen een array mee te geven waarin de key's dan de parameters zijn. Op deze manier kon hij eenvoudig een extra parameter gebruiken in een functie zonder de functie definitie aan te passen.
[...]
Ik heb geprobeerd niet al te veel naar de technische uitvoering te vragen. Geheel uit zelfbescherming. Uiteraard gaat het om PHP (PHP vind ik een fantastische taal, maar in de handen van de verkeerde persoon kan het ook enorme poep opleveren).alex3305 schreef op woensdag 26 januari 2011 @ 16:00:
[...]
En hoe weet de functie (ik neem aan dat het PHP is) dan wat deze met die extra parameter moet doen? Zal hij nog steeds de (body van de) functie aan moeten passen... Overigens ken ik ook van zulke genieën. Die hebben ook vooral moeite met het onderscheiden van statische klassen of niet-statische objecten, en wat daarvan de impact is op de applicatie.
Maar als ik mag filosoferen, ik denk een switch/case welke variabelen set.
Misschien wordt het toch echt een keer tijd dat ik overstap naar een organisatie waar wel echte programmeurs werken. Ik zeg niet dat ik perfect/best practice werk op lever, maar erger dan dit kan het niet.
[ Voor 11% gewijzigd door Naj_Geetsrev op 26-01-2011 16:19 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Foo { public $prop1; public $prop2; // ... } function doSomething($foo) { // Doe iets met $foo->prop1; // Doe iets met $foo->prop2; // ... } |
Hoewel het niet mijn keuze zou zijn, ben ik eigenlijk wel benieuwd wat eigenlijk het bezwaar is in jouw ogen.Naj_Geetsrev schreef op woensdag 26 januari 2011 @ 15:49:
Collega stelde gisteren met een stalen gezicht voor om in plaats van parameters te definiëren bij functies voortaan alleen een array mee te geven waarin de key's dan de parameters zijn. Op deze manier kon hij eenvoudig een extra parameter gebruiken in een functie zonder de functie definitie aan te passen.
Ik stond waarlijk met een bek vol tanden. Hij heeft wel vaker vage ideeën, terwijl hij denk een uitstekend programmeur is (hij wordt hier samen met mij senior developer genoemd). Ik hoop dat ik hem een beetje ervan heb weten te weerhouden. Maar ik vrees het ergste..
Ik gebruik het zelf weleens enkel indien er flags meegegeven worden (anders krijg je soms een lijst van 20 parameters met enkel true en false, dat helpt ook niet altijd met overzicht
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| public boolean verifieer(int reknr) { int d1 = reknr % 10; reknr /= 10; int d2 = reknr % 10; reknr /= 10; int d3 = reknr % 10; reknr /= 10; int d4 = reknr % 10; reknr /= 10; int d5 = reknr % 10; reknr /= 10; int d6 = reknr % 10; reknr /= 10; int d7 = reknr % 10; reknr /= 10; int d8 = reknr % 10; reknr /= 10; int d9 = reknr % 10; return (1 * d1 + 2 * d2 + 3 * d3 + 4 * d4 + 5 * d5 + 6 * d6 + 7 * d7 + 8 * d8 + 9 * d9) % 11 == 0; } |
"Schijf je code zo efficiënt en uitbreidbaar mogelijk" zeggen ze ons dan
En omdat er bij bijvoorbeeld gironummers soms een "P" voor staat?
Dat iets in de praktijk vaak uit getallen bestaat, betekent niet automatisch dat je het geheel als een getal moet behandelen.
En dan had je het met een for-loopje en substr op kunnen lossen.
Daarnaast kan ik mijzelf voorstellen dat die formule niet op alle platformen even lekker zal lopen in verband met de verwerkingsvolgorde. Persoonlijk - mocht ik het zo hebben gedaan - zou ik er haakjes om hebben gezet.Bv202 schreef op woensdag 26 januari 2011 @ 16:41:
Een stuk code dat ik tegenkwam in een oefening dat dit semester tijdens een les is besproken:
Java:
1 2 3 4 5 public boolean verifieer(int reknr) { ... lompe code ... return (1 * d1 + 2 * d2 + 3 * d3 + 4 * d4 + 5 * d5 + 6 * d6 + 7 * d7 + 8 * d8 + 9 * d9) % 11 == 0; }
"Schijf je code zo efficiënt en uitbreidbaar mogelijk" zeggen ze ons dan
Volgens mij is dat hetzelfde als telefoonnummers als een int opslaan. Iets met leading zero's ofzo.Davio schreef op woensdag 26 januari 2011 @ 16:48:
Kun je een rekeningnummer niet beter als string opslaan, omdat het niet de bedoeling is dat er mee gerekend wordt?
[... onderbouwing ...]
Ik heb weinig verstand van dependency injection, maar had wel laatst gelezen over verschillende vormen. Een manier is direct:Bender schreef op woensdag 26 januari 2011 @ 16:34:
[...]
Hoewel het niet mijn keuze zou zijn, ben ik eigenlijk wel benieuwd wat eigenlijk het bezwaar is in jouw ogen.
Ik gebruik het zelf weleens enkel indien er flags meegegeven worden (anders krijg je soms een lijst van 20 parameters met enkel true en false, dat helpt ook niet altijd met overzicht).
1
2
3
4
| class Foo { public function __construct (Bar $bar, Baz $baz, Bat $bat) {} } |
Een tweede methode was een fuzzy manier van DI:
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
| class Foo { public function __construct (array $options) { $this->setOptions($options); } public function setOptions (array $options) { $methods = get_class_methods($this); foreach ($options as $key => $value) { $method = 'set' . ucfirst($key); if (in_array($method, $methods)) { $this->$method($value); } } return $this; } public function setBar (Bar $bar) { } // etc } |
Wat? Beweer je nou dat operator precedence afhangt van het platform?alex3305 schreef op woensdag 26 januari 2011 @ 17:03:
[...]
Daarnaast kan ik mijzelf voorstellen dat die formule niet op alle platformen even lekker zal lopen in verband met de verwerkingsvolgorde.
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.
En dat kan niet als het een getal is?Davio schreef op woensdag 26 januari 2011 @ 16:48:
En dan had je het met een for-loopje en substr op kunnen lossen.
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Verwijderd
PHP zeker?Naj_Geetsrev schreef op woensdag 26 januari 2011 @ 15:49:
Collega stelde gisteren met een stalen gezicht voor om in plaats van parameters te definiëren bij functies voortaan alleen een array mee te geven waarin de key's dan de parameters zijn. Op deze manier kon hij eenvoudig een extra parameter gebruiken in een functie zonder de functie definitie aan te passen.
Ik stond waarlijk met een bek vol tanden. Hij heeft wel vaker vage ideeën, terwijl hij denk een uitstekend programmeur is (hij wordt hier samen met mij senior developer genoemd). Ik hoop dat ik hem een beetje ervan heb weten te weerhouden. Maar ik vrees het ergste..
Wanneer komen ze nou eens met echte overloading in die taal? Men schreeuwt er al zo lang om...
De tweede vind ik persoonlijk niet zo prettig vanwege al die eval achtige code. Er is echter wel een 'derde', en dat is de dependicies injecteren middels setters (of properties). Eigenlijk is dat wat er intern in je 2e optie gebeurt.mithras schreef op woensdag 26 januari 2011 @ 17:05:
iets over DI
Het voordeel van de eerste methode is dat je altijd gegarandeerd alles vult aangezien dit bij het aanmaken al gebeurt, daarnaast kun je in je constructor acties uitvoeren die afhankelijk zijn van de dependecies. Het nadeel hiervan is wel dat alle dependecies al beschikbaar moeten zijn op het moment dat het object aangemaakt wordt. Bij de 'derde' mogelijkheid kun je eerst alle objecten aanmaken en dan later de properties vullen. Je zult dan echter wel een andere manier moeten gebruiken om de valideren dat alles gevuld is en een soort 'postInitialize' methode moeten gebruiken om initialisatie acties uit te voeren die afhankelijk zijn van de dependecies.
Persoonlijk vind ik de laatste methode wel een stuk leesbaarder. In de constructor zie je niet goed welke parameters op welke plek moet terwijl de naam van de setter een extra stukje self documenting code is.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
[ Voor 78% gewijzigd door Davio op 27-01-2011 11:11 ]
Ik dacht dat er misschien een deel 5 zou komen...
Jawel, maar dan moet je eerst een .toString() doen op de integer en dan moet je opletten dat er een werkbare string uitkomt.Grijze Vos schreef op donderdag 27 januari 2011 @ 08:59:
[...]
En dat kan niet als het een getal is?
We are shaping the future
Alex) schreef op donderdag 27 januari 2011 @ 11:12:
Misschien een modje dat een verkeerd vinkje aanzetteknopje indrukte?!
[ Voor 7% gewijzigd door Janoz op 27-01-2011 11:13 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Je kunt keurig op een wiskundige manier een digit uit een getal halen ((x % 10000)/1000), dus dat is geen reden. De andere reden die je aangeeft is echter de enige juiste en wordt helaas vaak met voeten getreden. Nog heel vaak kom ik de 'het veld is numeriek dus een long/int'-argumentatie tegen voor rekeningnummers, bsn nummers, correspondentie nummers, productnummers.Davio schreef op donderdag 27 januari 2011 @ 11:10:
Jawel, maar dan moet je eerst een .toString() doen op de integer en dan moet je opletten dat er een werkbare string uitkomt.
Eigenlijk is de stelregel voor ontwerp: Wanneer een numeriek veld een meetwaarde aangeeft (hoeveelheid, afstand) dan is het een long/int/float. In alle andere gevallen is het een string met een restrictie op de te gebruiken tekens.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Kater? Eerst water, de rest komt later
Heb ik dus gehad met ISBN nummers. Nooit bij stil gestaan datHaan schreef op donderdag 27 januari 2011 @ 11:28:
Grappig, kwam deze week toevallig nog een database inrichting tegen waar het BSN als int werd opgeslagen. Dat bleek dus problemen te geven bij nummers die met een 0 beginnen
a) voorloopnullen ineens weg waren in de database
b) conflicten onstonden in de database omdat isbn 2147483647 al in gebruik was
Gelukkig in een alpha-fase ontdekt en snel de applicatie aangepast. Hoefde maar iets van 20 boeken te wijzigen. Had anders een mega aantal boeken mogen checken op isbn
[ Voor 15% gewijzigd door mithras op 27-01-2011 11:32 ]
Ik geloof dat ik weleens gelezen heb dat in verschillende programmeertalen de operator precedence anders kan zijn, ja..oisyn schreef op woensdag 26 januari 2011 @ 17:05:
[...]
Wat? Beweer je nou dat operator precedence afhangt van het platform?
Ik zal het je sterker vertellen.Haan schreef op donderdag 27 januari 2011 @ 11:28:
Grappig, kwam deze week toevallig nog een database inrichting tegen waar het BSN als int werd opgeslagen. Dat bleek dus problemen te geven bij nummers die met een 0 beginnen
Ik ken een database waarbij het BSN als decimal wordt opgeslagen, omdat het niet (altijd) in een int32 past.
En als je er een string of whatever van maakt, krijg je er zonder formatting "000000000,00" uit.
Binnen 1 bepaalde taal ligt de volgorde echter vast en is het niet platform afhankelijk.alex3305 schreef op donderdag 27 januari 2011 @ 11:39:
[...]
Ik geloof dat ik weleens gelezen heb dat in verschillende programmeertalen de operator precedence anders kan zijn, ja.
De operator precedence tussen verschillende talen is wel een ander verhaal. Dat is een keuze van de language designer. Meeste designers kiezen er wel voor om een Meneer Van Dale Wacht Op Antwoord precedence aan te houden.
(Uitzonderingen zijn er altijd, zoals bijv. Smalltalk
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Ik doelde op PHP op verschillende platforms. Waarom zou je een expressie zo opschrijven dat hij cross-language goed werktalex3305 schreef op donderdag 27 januari 2011 @ 11:39:
[...]
Ik geloof dat ik weleens gelezen heb dat in verschillende programmeertalen de operator precedence anders kan zijn, ja.
[ Voor 16% gewijzigd door .oisyn op 27-01-2011 12:15 ]
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.
En IP(v6)- adressen? Het is geen meetwaarde (en in zekere zin ook geen identifier), maar wordt in IP- headers altijd als 128- bits getal (struct in6_addr is een char[16]) verstuurd.Janoz schreef op donderdag 27 januari 2011 @ 11:19:
[...]
Je kunt keurig op een wiskundige manier een digit uit een getal halen ((x % 10000)/1000), dus dat is geen reden. De andere reden die je aangeeft is echter de enige juiste en wordt helaas vaak met voeten getreden. Nog heel vaak kom ik de 'het veld is numeriek dus een long/int'-argumentatie tegen voor rekeningnummers, bsn nummers, correspondentie nummers, productnummers.
Eigenlijk is de stelregel voor ontwerp: Wanneer een numeriek veld een meetwaarde aangeeft (hoeveelheid, afstand) dan is het een long/int/float. In alle andere gevallen is het een string met een restrictie op de te gebruiken tekens.
ISBN is rottig, want er bestaat een 10- cijferige variant voor boeken van voor 2007 en 13- cijferige variant voor boeken van na 1 januari 2007. Dan is het handiger om het op te slaan als string.
| 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
Het grootste verschil is dat je met de constructor-aanpak gegarandeerd geen parameters kunt vergeten (en dat wordt door je IDE gecontroleerd), bij de array-aanpak kun je die controle ook doen, maar dat gebeurt dan pas @ runtime. Vergelijk:mithras schreef op woensdag 26 januari 2011 @ 17:05:
[...]
Ik heb weinig verstand van dependency injection, maar had wel laatst gelezen over verschillende vormen. Een manier is direct:
[...]
Een tweede methode was een fuzzy manier van DI:
[...]
Zo kan je dus eenvoudig extra dependencies injecteren via een array. Iets wat ik niet als heel ongebruikelijk zie eigenlijk. Dus vraag ik me ook af wat hier het enorme bezwaar aan is, want het lijkt me meer case-gebonden dan in het algemeen geldend.
1
2
3
4
5
6
7
8
9
10
11
| // werkt: $obj = new Dinges(new EenParamObject(), new NogEenParamObject()); // foutmelding: ctor Dinges verwacht twee parameters. $obj2 = new Dinges(new EenParamObject()); // alternatief: $obj3 = new Dinges(array('eenobject' => new EenParamObject(), 'nogeenobject' => new NogEenParamObject()); // werkt ook gewoon, totdat het daadwerkelijk uitgevoerd wordt. $obj4 = new Dinges(array()); |
En met type hinting erbij kun je nog minder dingen stukmaken - je mag alles in een array pleuren wat je maar wilt, maar met type hinting kun je alleen aangeven dat er een array of objecttype in mag. Keuze / flexibiliteit is Het Kwaad en geeft mogelijkheden tot fouten. Typesafety ftw.
(Disclaimer: Bovenstaand kan volledig fout zijn, heb al tijden niks meer met PHP gedaan en pas nu gewoon Java logica toe op PHP)
Slecht voorbeeld, een IP adres is binary data. Net als bijvoorbeeld een MD5 hash. Binary data als binary data opslaan is natuurlijk een stuk efficienter dan die data opslaan in zijn textuele representatie.Jaap-Jan schreef op donderdag 27 januari 2011 @ 12:18:
[...]
En IP(v6)- adressen? Het is geen meetwaarde (en in zekere zin ook geen identifier), maar wordt in IP- headers altijd als 128- bits getal (struct in6_addr is een char\[16]) verstuurd.
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.
Klopt, dat is ook zeker waarYopY schreef op donderdag 27 januari 2011 @ 12:19:
[...]
Het grootste verschil is dat je met de constructor-aanpak gegarandeerd geen parameters kunt vergeten (en dat wordt door je IDE gecontroleerd), bij de array-aanpak kun je die controle ook doen, maar dat gebeurt dan pas @ runtime. Vergelijk:
[...]
En met type hinting erbij kun je nog minder dingen stukmaken - je mag alles in een array pleuren wat je maar wilt, maar met type hinting kun je alleen aangeven dat er een array of objecttype in mag. Keuze / flexibiliteit is Het Kwaad en geeft mogelijkheden tot fouten. Typesafety ftw.
(Disclaimer: Bovenstaand kan volledig fout zijn, heb al tijden niks meer met PHP gedaan en pas nu gewoon Java logica toe op PHP)
Over het typehinting: dat is ook de rede dat de array eigenlijk via setOptions() gaat en dan naar verschillende setters to. Omdat php niet kan type hinten op properties (of hoe je dat precies moet noemen) maar alleen in de argumenten van methodes dat kan afdwingen, valt of staat de constructie dus bij de verschillende set*() methodes.
Aan de andere kant: als je meerdere dependencies wilt injecteren, vind ik het altijd lastig om alles direct in de constructor te proppen. Lange regels, de volgorde maakt uit etc, ik zie de array wel als een mooie oplossing. Daarnaast, als een object bijvoorbeeld caching of logging ondersteunt, kan je eenvoudig in de array een extra optionele "dependency" meegeven (hij is dan niet echt afhankelijk in de letterlijke zin, maar goed). Juist met de array is dat enorm makkelijk te doen en kan dus de caller bepalen of het object aan caching/logging/etc doet
Natuurljk, dat kan je ook anders implementeren, maar het ging mij om de allereerste post: argumenten als array meegeven is absoluut not-done. Ik denk daar wat anders over
Dat doen ze niet, immers in de meeste talen zijn machtsverheffen en worteltrekken geimplementeerd als functies en niet als operators waardoor ze eigenlijk automatisch een hogere precedence hebben ten opzichte van vermenigvuldingen en optellen bijvoorbeeld. Verder is het nog een achterhaald ezelsbruggetje ook, Wikipedia: BewerkingsvolgordeRayNbow schreef op donderdag 27 januari 2011 @ 11:59:
[...]
De operator precedence tussen verschillende talen is wel een ander verhaal. Dat is een keuze van de language designer. Meeste designers kiezen er wel voor om een Meneer Van Dale Wacht Op Antwoord precedence aan te houden.
Je kan van ISBN ook een aparte tabel maken.Jaap-Jan schreef op donderdag 27 januari 2011 @ 12:18:
[...]
En IP(v6)- adressen? Het is geen meetwaarde (en in zekere zin ook geen identifier), maar wordt in IP- headers altijd als 128- bits getal (struct in6_addr is een char\[16]) verstuurd.
ISBN is rottig, want er bestaat een 10- cijferige variant voor boeken van voor 2007 en 13- cijferige variant voor boeken van na 1 januari 2007. Dan is het handiger om het op te slaan als string.
Een ISBN bestaat namelijk uit groepen van digits en per groep zou je dan een kolom aan kunnen maken.
ISBN-13 = ISBN-10 + een industry code (978 / 979), zou je eventueel een nullable kolom van kunnen maken.
Met een aparte tabel met kolommen per groep is het ook makkelijker zoeken naar bijvoorbeeld alle boeken uit hetzelfde land of van een specifieke uitgeverij.
Dan gebruik je tochDavio schreef op donderdag 27 januari 2011 @ 13:17:
[...]
Je kan van ISBN ook een aparte tabel maken.
Een ISBN bestaat namelijk uit groepen van digits en per groep zou je dan een kolom aan kunnen maken.
ISBN-13 = ISBN-10 + een industry code (978 / 979), zou je eventueel een nullable kolom van kunnen maken.
Met een aparte tabel met kolommen per groep is het ook makkelijker zoeken naar bijvoorbeeld alle boeken uit hetzelfde land of van een specifieke uitgeverij.
1
| select * from book where isbn like '%' + @lang + '%' |
et voila, geen lastige joins meer, alles lekker in 1 kolom en querien maar
In die aparte tabellen lekker auto increment gebruiken waardoor de id niet het deel van de ISBN is en je komt misschien nog wel terug in dit topic of op TDWTF
[ Voor 10% gewijzigd door .Gertjan. op 27-01-2011 13:58 ]
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.
Sommige nummers hebben een langere groepscode waardoor het aantal beschikbare digits voor uitgeverijen / titels kleiner is. Jouw query levert dan onverwachte resultaten op.
Dus mijn idee is zo gek nog niet en jij hebt er te weinig / simpel over nagedacht.
Davio schreef op donderdag 27 januari 2011 @ 14:10:
Ja, ware het niet dat niet elke ISBN op dezelfde manier is opgebouwd.
Sommige nummers hebben een langere groepscode waardoor het aantal beschikbare digits voor uitgeverijen / titels kleiner is. Jouw query levert dan onverwachte resultaten op.
Dus mijn idee is zo gek nog niet en jij hebt er te weinig / simpel over nagedacht.
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.
Dat doen ze wel. Dat ze sommige operaties niet als operators modelleren doet niets af aan de volgorde van de operaties die wél in operator-vorm beschikbaar zijn.
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.
2.50, 3.50, 4.50, 5.50, 6.50, 7.50, 8.50, 9.50, 10.50, 11.50, 12.50, 13.50, 14.50, 15.50, 16.50, 17.50, 43.50, 44.50, 45.50, 46.50, 47.50, 48.50, 49.50, 50.50, 51.50, 52.50, 53.50, 54.50, 55.50, 56.50, 57.50, 58.50, 59.50, 60.50, 61.50, 62.50, 63.50, 64.50, 65.50, 66.50, 67.50, 68.50, 69.50, 70.50, 71.50
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
Het zijn de bedragen tussen € 0.01 en € 100.00 die na het vermenigvuldigen met 0.19 en afronden op twee decimalen afwijken van het daadwerkelijke bedrag wanneer alle bedragen van die berekening in een float worden opgeslagen.
[ Voor 13% gewijzigd door CodeCaster op 27-01-2011 14:52 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Is dit gedrag consistent? Komt het altijd op die manier voor op iedere machine? Weet dat er in floats vervelende afrondings issues zitten, maar weet eigenlijk niet of die constant zijn...CodeCaster schreef op donderdag 27 januari 2011 @ 14:44:
Klopt.![]()
Het zijn de bedragen tussen € 0.01 en € 100.00 die na het vermenigvuldigen met 0.19 en afronden op twee decimalen afwijken van het daadwerkelijke bedrag wanneer alle bedragen van die berekening in een float worden opgeslagen.
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.
.edit: CodeCaster, wat voor rounding mode gebruik jij? Round to even, zoals het hoort?
Ik kom met doubles (53 bits mantissa) op dit lijstje: 1.50, 42.50, 53.50, 86.50, 91.50
En met floats (24 bits mantissa) op dit lijstje: 24.50, 43.50, 52.50, 92.50, 96.50, 99.50
[ Voor 51% gewijzigd door .oisyn op 27-01-2011 15:52 ]
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.
Je gaat mij niet vertellen dat pow() en sqrt() allebij verschillende precedence hebben (overeenkomstig aan Meneer Van Dale Wacht Op Antwoord). Dat de rest van de operatoren toevallig in dat lijstje zou passen, prima, maar in de meeste talen is dat ook niet zo. Daar hebben mul en div dezelfde precedence en worden ze van links naar rechts geëvalueerd. Ergo, daar word de moderne variant van de rekenregels gebruikt en niet het reeds genoemde ezelsbruggetje..oisyn schreef op donderdag 27 januari 2011 @ 14:15:
[...]
Dat doen ze wel. Dat ze sommige operaties niet als operators modelleren doet niets af aan de volgorde van de operaties die wél in operator-vorm beschikbaar zijn.
In theorie is dat prima, in de praktijk echter blijkt dat dergelijke afrondingsfouten niet deterministisch te reproduceren zijn op verschillende machines. (Sterker nog, er zijn wat dat betreft zelfs verschillen tussen de PPU en SPUs bijvoorbeeld). Zie ook,.oisyn schreef op donderdag 27 januari 2011 @ 14:59:
Ja, die zijn constant, gedocumenteerd, en volledig voorspelbaar. Voor IEEE-754 compatible systemen uiteraard.
http://gafferongames.com/...oating-point-determinism/
[ Voor 27% gewijzigd door PrisonerOfPain op 27-01-2011 15:47 ]
Misschien moet je mijn reactie nog een keer doorlezen. Dat zijn toch geen operatoren, of wel?PrisonerOfPain schreef op donderdag 27 januari 2011 @ 15:44:
Je gaat mij niet vertellen dat pow() en sqrt() allebij verschillende precedence hebben (overeenkomstig aan Meneer Van Dale Wacht Op Antwoord).
Ik heb met datzelfde ezelsbruggetje altijd geleerd dat vermenigvuldigen en delen, alsmede optellen en aftrekken, gelijkwaardig waren. De enige fout die er wat mij betreft dus instaat is worteltrekken. Bovendien ben je enorm aan het nitpicken, de kern van het verhaal waren de algemeen geldende wiskundige rekenregels, niet specifiek dat idd foute ezelsbruggetje. Dat ezelsbruggetje staat gewoon voor de meeste mensen synoniem met de officiele wiskundige regels.maar in de meeste talen is dat ook niet zo. Daar hebben mul en div dezelfde precedence en worden ze van links naar rechts geëvalueerd. Ergo, daar word de moderne variant van de rekenregels gebruikt en niet het reeds genoemde ezelsbruggetje.
Dan zijn ze óf niet IEEE-754 compliant, óf je compilers genereren voor dezelfde code niet altijd dezelfde operaties. C en C++ compilers passen nogal wat optimalisaties toe die ervoor zorgen dat de code die gegenereerd wordt niet exact overeenkomt met wat jij specificeert. Wiskundig is (a * b) / c hetzelfde als a * (b / c), maar binnen IEEE-754 is dat niet het geval. De compiler kan optimalisaties toepassen waardoor een andere variant eruitkomt dan dat je hebt opgeschreven. Nee, dan is je resultaat op het ene platform wellicht anders dan het resultaat op het andere platform. Maar dat wil niet zeggen dat IEEE-754 operaties ineens afhankelijk zijn van de stand van de maan ofzo.PrisonerOfPain schreef op donderdag 27 januari 2011 @ 15:44:
In theorie is dat prima, in de praktijk echter blijkt dat dergelijke afrondingsfouten niet deterministisch te reproduceren zijn op verschillende machines. (Sterker nog, er zijn wat dat betreft zelfs verschillen tussen de PPU en SPUs bijvoorbeeld).
Het artikel dat je aanhaalt gaat over physics engines in games. Hier hebben we het over banksoftware. Nou zal je voor banksoftware geen floating point getallen gebruiken, maar doe je dat wel dan heb je het wel over software die gecompiled wordt volgens de stricte FP regels, en niet eentje die enorm gaat optimaliseren omdat iets dat ongeveer klopt ook wel goed is, zoals in games.
[ Voor 65% gewijzigd door .oisyn op 27-01-2011 16:08 ]
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.
[ Voor 95% gewijzigd door .oisyn op 27-01-2011 15:56 ]
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 in excel of calc van open office en waarschijnlijk ook vele andere programma's het volgende doet :
cel a1 de waarde 1
cel a2 de waarde =a1/3
cel a3 de waarde =a2*4-1
cel a3 kopieer je naar beneden zodat hij telkens hetzelfde uitrekend.
Bij mijn default calc instellingen staat op a26 nog netjes 0,33 maar de cel eronder 0,31 en daarna nog grotere afwijkingen.
Of dit onder de naam bug valt weet ik niet, ik denk het eigenlijk niet omdat er altijd wel afrondingen gedaan moeten worden, maar het is wel erg onverwachts als je het niet weet.
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
Nee. En dat claim ik dan ook niet ;-) wellicht zitten we zelfs op een lijn..oisyn schreef op donderdag 27 januari 2011 @ 15:55:
[...]
Misschien moet je mijn reactie nog een keer doorlezen. Dat zijn toch geen operatoren, of wel?
Errr IEEE-754 geeft redelijk wat vrijheid met betrekking tot de implementaties van operators. Zo is het toegestaan dat een platform een hogere precisie gebruikt voor intermediate results (eg. fused multiply-add en anderen). Daarnaast heeft IEEE een aantal optionele operaties die je hardware kan implementeren (sin, sqrt et cetera). Kortom, deterministische resultaten gaan veel verder dan simpelweg /fp:strict gebruiken en de goede control registers instellen.Dan zijn ze óf niet IEEE-754 compliant, óf je compilers genereren voor dezelfde code niet altijd dezelfde operaties. C en C++ compilers passen nogal wat optimalisaties toe die ervoor zorgen dat de code die gegenereerd wordt niet exact overeenkomt met wat jij specificeert. Wiskundig is (a * b) / c hetzelfde als a * (b / c), maar binnen IEEE-754 is dat niet het geval. De compiler kan optimalisaties toepassen waardoor een andere variant eruitkomt dan dat je hebt opgeschreven. Nee, dan is je resultaat op het ene platform wellicht anders dan het resultaat op het andere platform. Maar dat wil niet zeggen dat IEEE-754 operaties ineens afhankelijk zijn van de stand van de maan ofzo.
Zie onder andere Wikipedia: IEEE 754 revision
[ Voor 13% gewijzigd door PrisonerOfPain op 27-01-2011 16:30 ]
Bij mij in Excel 2003 zit in A20 al een afwijking in de 6e decimaal (0,333332), en dan gaat het rap de mist in (-1.4e+09 in A45). Je doet er weinig aan, behalve altijd met gezond verstand naar je uitkomsten blijven kijken.PiepPiep schreef op donderdag 27 januari 2011 @ 16:04:
Ah, floats, geweldige dingen als je niet door hebt dat er kleine afronding foutjes in kunnen zitten.
Als je in excel of calc van open office en waarschijnlijk ook vele andere programma's het volgende doet :
cel a1 de waarde 1
cel a2 de waarde =a1/3
cel a3 de waarde =a2*4-1
cel a3 kopieer je naar beneden zodat hij telkens hetzelfde uitrekend.
Bij mijn default calc instellingen staat op a26 nog netjes 0,33 maar de cel eronder 0,31 en daarna nog grotere afwijkingen.
Of dit onder de naam bug valt weet ik niet, ik denk het eigenlijk niet omdat er altijd wel afrondingen gedaan moeten worden, maar het is wel erg onverwachts als je het niet weet.
Zo scherp als een voetbal!
Maar nog steeds bruikbaar:PrisonerOfPain schreef op donderdag 27 januari 2011 @ 13:02:
Verder is het nog een achterhaald ezelsbruggetje ook, Wikipedia: Bewerkingsvolgorde
Het oude ezelsbruggetje werd afgezworen, hoewel het nog enigszins bruikbaar zou blijven: de veranderde plaats van worteltrekken maakte in de praktijk weinig uit omdat de wortels in bijna alle boeken voorzien werden van een bovenstreep of haakjes.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Ik had een fout gemaakt in m'n code, zag dat ik in plaats van een currency als teller een double gebruikte. Drie keer raden wat daarmee gebeurt als je er tienduizend keer 0.01 bij optelt..oisyn schreef op donderdag 27 januari 2011 @ 14:59:
.edit: CodeCaster, wat voor rounding mode gebruik jij? Round to even, zoals het hoort?
Ik kom met doubles (53 bits mantissa) op dit lijstje: 1.50, 42.50, 53.50, 86.50, 91.50
En met floats (24 bits mantissa) op dit lijstje: 24.50, 43.50, 52.50, 92.50, 96.50, 99.50
Heb nu deze reeks uit weten te voeren:
Met de volgende code, feel free to comment:1.50, 2.50, 4.50, 5.50, 8.50, 9.50, 13.50, 14.50, 15.50, 16.50, 21.50, 23.50, 25.50, 27.50, 30.50, 32.50, 34.50, 36.50, 39.50, 41.50, 42.50, 45.50, 48.50, 49.50, 52.50, 53.50, 55.50, 56.50, 59.50, 60.50, 63.50, 66.50, 67.50, 70.50, 73.50, 74.50, 77.50, 78.50, 80.50, 81.50, 84.50, 86.50, 89.50, 92.50, 94.50, 95.50, 97.50, 98.50
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
| var floatBedrag: double; currencyBedrag: currency; floatBTW: double; floatBTWBedrag: double; currencyBTWBedrag: currency; begin DecimalSeparator := '.'; ProbleemGetallenMemo.Text := ''; floatBTW := 19.00; currencyBedrag := 0.00; repeat floatBedrag := currencyBedrag; floatBTWBedrag := floatBedrag * (floatBTW / 100); currencyBTWBedrag := floatBedrag * (floatBTW / 100); if (FormatFloat('#0.00', floatBTWBedrag) <> FormatFloat('#0.00', currencyBTWBedrag)) then begin ProbleemGetallenMemo.Text := ProbleemGetallenMemo.Text + FormatFloat('#0.00', currencyBedrag) + ', '; end; currencyBedrag := currencyBedrag + 0.01; until (currencyBedrag > 100); end; |
Het zou ook best aan de FormatFloat-functie kunnen liggen in dit geval (en dan is de oorzaak van het probleem van m'n oorspronkelijke post, hoewel ik het probleem niet bij name noem, niet direct te wijten aan het gebruik van floats maar meer aan de methode van afronding, maar in de oorspronkelijke code wordt die op exact deze wijze gebruikt), maar hoe die precies werkt volg ik niet, want die roept uiteindelijk zo'n 300 regels assembly aan in FloatToTextFmt.
In C# krijg ik inderdaad dezelfde getallen als jij bij een double. 1,50, 42,50, 53,50, 86,50, 91,50:
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
| double floatBedrag; decimal decimalBedrag; double floatBTW; double floatBTWBedrag; decimal decimalBTWBedrag; floatBTW = 19.00f; decimalBedrag = 0.00m; do { floatBedrag = (double)decimalBedrag; floatBTWBedrag = floatBedrag * (floatBTW / 100); decimalBTWBedrag = (decimal)(floatBedrag * (floatBTW / 100)); if ((decimal)Math.Round(floatBTWBedrag, 2) != (Math.Round(decimalBTWBedrag, 2))) { Console.Write(decimalBedrag + ", "); } decimalBedrag = decimalBedrag + 0.01m; } while (decimalBedrag <= 100); |
Bij gebruik van een float wel weer een aanzienlijk langere reeks, maar anders dan in Delphi. Waar zijn die zwevendekommagetallen nou eigenlijk goed voor, behalve 3D-berekeningen?
[ Voor 15% gewijzigd door CodeCaster op 27-01-2011 23:26 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Betere vraag vind ik eigenlijk : Waarom niet? ( behalve als het grote performance voordelen biedt).oisyn schreef op donderdag 27 januari 2011 @ 12:13:
Waarom zou je een expressie zo opschrijven dat hij cross-language goed werkt
Ik probeer ook gewoon 1 coding standard cross-language te hanteren. Ik wil een functie in een andere taal op mijn manier kunnen lezen, niet op 30 verschillende manieren omdat dezelfde elf-proef in 30 talen gemaakt is. ( behalve dus als het een grote performance boost inhoudt )
Maarja, bij ons zijn dan ook de algemene haakjes noteringen onderdeel van de coding standaard...
1
2
| char countryCode[2] = {'N', 'L'}; int c = countryCode[0] << 8 + countryCode[1]; |
Tja, het zal wel gewoon de wiskundige in mij zijn dat ik het onzin vind dat je a + b * c op een andere manier kan lezen dan a + (b * c). Ik heb het niet over operators als &, he. Al kan ik die ook wel lezen (bitwize operators hebben doorgaans een vrij lage precedence)Gomez12 schreef op donderdag 27 januari 2011 @ 23:25:
[...]
Betere vraag vind ik eigenlijk : Waarom niet? ( behalve als het grote performance voordelen biedt)
Ik probeer ook gewoon 1 coding standard cross-language te hanteren. Ik wil een functie in een andere taal op mijn manier kunnen lezen, niet op 30 verschillende manieren omdat dezelfde elf-proef in 30 talen gemaakt is. ( behalve dus als het een grote performance boost inhoudt )
Maarja, bij ons zijn dan ook de algemene haakjes noteringen onderdeel van de coding standaard...
[ Voor 5% gewijzigd door .oisyn op 28-01-2011 00:05 ]
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.
Dat lijkt me nog steeds fout. Jij convert het btw bedrag na decimal nádat je het als double hebt uitgerekend. Waarom er toevallig exact dezelfde uitkomst uit komt is me nog niet helemaal duidelijk. Maar in ieder geval, je moet beide apart uitrekenen, en dan het verschil bekijken.CodeCaster schreef op donderdag 27 januari 2011 @ 22:55:
[...]
Ik had een fout gemaakt in m'n code, zag dat ik in plaats van een currency als teller een double gebruikte. Drie keer raden wat daarmee gebeurt als je er tienduizend keer 0.01 bij optelt.![]()
Heb nu deze reeks uit weten te voeren:
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
| #include <stdio.h> #include <float.h> template<class T> int roundeven(T value) { int i = (int)value; T f = value - i; if ((i & 1) && f >= (T)0.5 || !(i & 1) && f > (T)0.5) i++; return i; } int main() { _controlfp(_PC_53, _MCW_PC); for (int i = 0; i < 10000; i++) { int ivalue = (i * 19 + ((i*19/100&1) ? 50 : 49)) / 100; int dvalue = roundeven((i / 100.0 * 0.19) * 100.0); if (ivalue != dvalue) printf("%.2f: %d / %d / %g\n", i / 100.0f, ivalue, dvalue, ((i / 100.0 * 0.19 * 100.0 * 100.0)) - (i * 19)); } } |
(wel compilen zonder optimalisaties).
Output:
1.50: 28 / 29 / 4.54747e-013 42.50: 808 / 807 / -1.45519e-011 53.50: 1016 / 1017 / 1.45519e-011 86.50: 1644 / 1643 / -2.91038e-011 91.50: 1738 / 1739 / 2.91038e-011
Je ziet hier: "geldbedrag: juiste BTW in centen / BTW in centen uitgerekend met een double / de afrondingsfout van de double in kwestie"
Het probleem ligt puur bij het feit dat bedragen niet exact op een halve cent uitkomen, wat in sommige gevallen betekent dat er de verkeerde kant op afgerond wordt. Zoals bijvoorbeeld bij 1.50 kom je op een btw in centen van ~28.500000000000454747, afgerond dus 29 cent, ipv exact op 28.5 ofwel afgerond 28 cent. Bij 42.50 is dat ~807.4999999999854481 afgerond 807 in plaats van 807.5 afgerond 808.
[ Voor 26% gewijzigd door .oisyn op 28-01-2011 03:19 ]
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.
De elfproef is trouwens nog fout ook. Het accepteert 0000.00.000 als een geldig bankrekeningnummer.Bv202 schreef op woensdag 26 januari 2011 @ 16:41:
Een stuk code dat ik tegenkwam in een oefening dat dit semester tijdens een les is besproken:
Java:
1 2 3 4 public boolean verifieer(int reknr) { / *snip */ return (1 * d1 + 2 * d2 + 3 * d3 + 4 * d4 + 5 * d5 + 6 * d6 + 7 * d7 + 8 * d8 + 9 * d9) % 11 == 0; }
"Schijf je code zo efficiënt en uitbreidbaar mogelijk" zeggen ze ons dan
* RayNbow kon het trouwens niet laten om een Haskell versie te produceren...
ghci> elfproef (account "736160221") True ghci> elfproef (account "000000000") False
1
2
3
4
5
6
7
8
9
10
11
12
| {-# LANGUAGE ParallelListComp #-} import Data.Char type Digit = Int newtype Account = Account [Digit] account :: String -> Account account = Account . reverse . map digitToInt elfproef :: Account -> Bool elfproef (Account ns) = q > 0 && r == 0 where (q,r) = sum [i*a | a <- ns | i <- [1..]] `quotRem` 11 |
(Code is niet robuust... de functie account blaast zichzelf op met non-numerieke strings
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Dat heb ik gedaan:.oisyn schreef op vrijdag 28 januari 2011 @ 00:28:
[...]
Dat lijkt me nog steeds fout. Jij convert het btw bedrag na decimal nádat je het als double hebt uitgerekend. Waarom er toevallig exact dezelfde uitkomst uit komt is me nog niet helemaal duidelijk. Maar in ieder geval, je moet beide apart uitrekenen, en dan het verschil bekijken.
1
2
3
4
| floatBTWBedrag := floatBedrag * (floatBTW / 100); currencyBTWBedrag := currencyBedrag * (currencyBTW / 100); if (FormatFloat('#0.00', floatBTWBedrag) <> FormatFloat('#0.00', currencyBTWBedrag)) then |
En dan krijg ik nog steeds dezelfde rij getallen. Vandaag als ik tijd heb maar eens meer lezen over floats (en afronden in Delphi), heb er zelf zelden mee gewerkt.
Dat het bedrag niet correct is op te slaan in een float en daardoor "verkeerd" wordt afgerond wordt snap ik, dat is inherent aan bepaalde (de meeste?) breuken in floats.
Gelukkig heeft, volledig volgens de stijl van dit topic, een slimme php'er al een oplossing voor mij bedacht:
1
2
3
4
5
6
7
8
9
| $numberToRound = 1.5; //Convert to string. $numberToRound = "$numberToRound"; //iff number ends in a "5", add fuzz if (eregi("$5", $pages)) $pages += .000001; $round = round($pages, 0); |
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Ik heb toch de mensen van die site hier even over gemailed. De fout zit in het platform wat ze gebruiken (*slik*). Maar het wordt naar boven toe ge-escaleerd. Wel positief dat ze hier heel goed op in gingen en niet meteen "WTF HEB JE GEDAAN MET ONZE SITE"ppx17 schreef op donderdag 06 januari 2011 @ 18:20:
[...]
Als we dan toch bezig zijn:
http://www.medicatieoverdracht.nl/Logging/message.asp?MessageID=998&MessageStr=%3Cscript%3Ealert%28%27hoi%27%29%3C/script%3E&button=none&url=
Wel heel basic...
(in reactie op de hack)roy-t schreef op vrijdag 28 januari 2011 @ 12:35:
[...]
Ik heb toch de mensen van die site hier even over gemailed. De fout zit in het platform wat ze gebruiken (*slik*). Maar het wordt naar boven toe ge-escaleerd. Wel positief dat ze hier heel goed op in gingen en niet meteen "WTF HEB JE GEDAAN MET ONZE SITE".
Wtf.. dat is toch wel heel slecht. Welke brakke frot platform is het eigenlijk?
| 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
Neej
Uit de opmerking van roy-t maakte ik op dat er een of ander cms(?) gebruikt werd, vandaar de vraag
Verwijderd
[ Voor 9% gewijzigd door Verwijderd op 28-01-2011 13:32 ]
Dan zou het .aspx geweest zijn. Het lijkt dus meer op classic asp
edit:
mmm, misschien toch maar refreshen voordat ik post
[ Voor 14% gewijzigd door Woy op 28-01-2011 13:34 ]
“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 snap niet dat-ie eerst omzet naar een String.CodeCaster schreef op vrijdag 28 januari 2011 @ 08:26:
[...]
PHP:
1 2 3 4 5 6 7 8 9 $numberToRound = 1.5; //Convert to string. $numberToRound = "$numberToRound"; //iff number ends in a "5", add fuzz if (eregi("$5", $pages)) $pages += .000001; $round = round($pages, 0);
Bovenstaande is toch exact hetzelfde als:
$x = round($x+0.000001);
[ Voor 47% gewijzigd door Gamebuster op 28-01-2011 17:31 ]
Let op: Mijn post bevat meningen, aannames of onwaarheden
Nee want als het input getal c.499999 krijg je round(c.5) = c ipv het hier blijkbaar gewenste (c+1).Gamebuster schreef op vrijdag 28 januari 2011 @ 17:31:
[...]
Ik snap niet dat-ie eerst omzet naar een String.
Bovenstaande is toch exact hetzelfde als:
$x = round($x+0.000001);
Het valt me eigenlijk op dat er bedrijven zijn die honderden euro's voor een website vragen terwijl die code vol lekken en onlogische dingen staat. Overal de mogelijkheid tot SQL injecties (een excuus was "magic quotes staan aan"), op elke plaats mogelijkheden tot XSS attacks en het absolute dieptepunt: het wachtwoord van het cms stond ergens als plain-text opgesagen in een bestandje waar iedereen bij kon.D-Raven schreef op vrijdag 28 januari 2011 @ 13:31:
[...]
Neejhet is classic asp. dat had ik al wel gezien. Maar in classic asp is niet verantwoordelijk voor deze exploit de clueless kabouter die die site gemaakt heeft wel.
Uit de opmerking van roy-t maakte ik op dat er een of ander cms(?) gebruikt werd, vandaar de vraag
Deze laatste was eenmalig, maar dit soort dingen heb ik wel al vaker tegengekomen. Ok, PHP staat misschien wel bekend als de taal met veel amateurs die slechte code schrijven, maar als je jezelf PHP-developer noemt en honderden euro's voor je werk vraagt, zou je toch wel een basiskennis mogen hebben.
Nu ben ik zelf ook maar een beginner en zeker geen ervaren programmeur/webdeveloper, maar aan dit soort dingen stoor ik me wel
Honderden? Als het een overheidsproject betreft heb je het snel over tienduizenden euro's tot tonnen/miljoenen. Maar helaas zegt dat totaal niets over de opgeleverde kwaliteit.Bv202 schreef op vrijdag 28 januari 2011 @ 20:28:
[...]
Het valt me eigenlijk op dat er bedrijven zijn die honderden euro's voor een website vragen terwijl die code vol lekken en onlogische dingen staat.
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 dat allemaal nav een lam tellertje wat er nog steeds op staat. Het is zowat februariroy-t schreef op vrijdag 28 januari 2011 @ 12:35:
[...]
Ik heb toch de mensen van die site hier even over gemailed. De fout zit in het platform wat ze gebruiken (*slik*). Maar het wordt naar boven toe ge-escaleerd. Wel positief dat ze hier heel goed op in gingen en niet meteen "WTF HEB JE GEDAAN MET ONZE SITE".
Verwijderd
Onder PHP-basiskennis verstaan veel mensen 3 tutorials gelezen...Bv202 schreef op vrijdag 28 januari 2011 @ 20:28:
[...]
Het valt me eigenlijk op dat er bedrijven zijn die honderden euro's voor een website vragen terwijl die code vol lekken en onlogische dingen staat. Overal de mogelijkheid tot SQL injecties (een excuus was "magic quotes staan aan"), op elke plaats mogelijkheden tot XSS attacks en het absolute dieptepunt: het wachtwoord van het cms stond ergens als plain-text opgesagen in een bestandje waar iedereen bij kon.
Deze laatste was eenmalig, maar dit soort dingen heb ik wel al vaker tegengekomen. Ok, PHP staat misschien wel bekend als de taal met veel amateurs die slechte code schrijven, maar als je jezelf PHP-developer noemt en honderden euro's voor je werk vraagt, zou je toch wel een basiskennis mogen hebben.
[ Voor 12% gewijzigd door Freeaqingme op 29-01-2011 01:13 ]
No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.
In toevoeging op Gertjan, honderden euro's is niks. Eenvoudige websites bij een fatsoenlijk bedrijf beginnen zo ongeveer vanaf 3000 euro.Bv202 schreef op vrijdag 28 januari 2011 @ 20:28:
[...]
... maar als je jezelf PHP-developer noemt en honderden euro's voor je werk vraagt, zou je toch wel een basiskennis mogen hebben.
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Een tientje per uur vind ik nog vrij weining. Zeker als het een niet-vriendenprijs is. Veelal heeft zo'n bedrijf financieel belang bij een goede website. Dat is het eerste waarover je moet beginnen bij de onderhandelingen over de prijs.MBV schreef op zaterdag 29 januari 2011 @ 12:25:
Niet zo gek ook. Wat wil je doen voor honderden euro's? Zelfs als student rekende ik als vriendenprijs voor 2 weken ontwikkeltijd nog meer dan 1000 euro... niet-vriendenprijs was toen 10 euro/uur, en een paar dagen ben je toch echt wel bezig voor het maken van welke website dan ook.
Ik heb in mijn studententijd ook veel sites opgeleverd gebaseerd op Joomla. Het enige dat ik hoefde te doen was een geschikt template te verzorgen en de kant-en-klare content te embedden. Vaak waren die templates gebaseerd op rechtenvrije-templates die all-over-the-web te vinden zijn.
Al me al kostte me dat een uurtje of 40. En ik rekende daar al snel 1500 euro excl. voor. Het onderhouden van hun website kon op twee manieren gekocht worden. 100 euro per maand, of 1000 euro voor een jaar.
Het onderhouden kostte me ongeveer twee uur per maand.
En dan nog nagaande dat een website voor 1000 euro vrij weinig kost. Gerenommeerde bedrijven vragen gerust twee tot vijf keer zoveel.
Er waren jaren bij dat ik zo twee of drie klanten had, die ieder ook elke maand 100 euro extra inbrachten naast de 1500 euro ontwikkelingskosten.
5400 euro in een jaar bijverdienen is niet slecht voor een student
Edit; ik moet hier wel aan toevoegen dat het grote bedrijven waren die ik bediende. Twee dierenklinieken, restaurants en een camping bij ons in de buurt.
[ Voor 5% gewijzigd door Matis op 29-01-2011 12:37 ]
If money talks then I'm a mime
If time is money then I'm out of time
Het antwoord staat al in je zin,Bv202 schreef op vrijdag 28 januari 2011 @ 20:28:
Het valt me eigenlijk op dat er bedrijven zijn die honderden euro's voor een website vragen terwijl die code vol lekken en onlogische dingen staat.
Nee, voor honderden euro's moet je ook niet veel verwachten. Het kan wel, maar minimaal.
Een opdrachtgever moet ook geen PHP-er zoeken, maar een webontwikkelaar die weet wat er nodig is om een site op te zetten. Wil niet generaliseren, maar veel mensen die zichzelf websitebouwers noemen zijn gefrustreerde PHP-ontwikkelaars die liever hun eigen CMS in elkaar prutsen (nadat ze een paar sites met 'losse' scripts gemaakt hebben) dan dat ze eens logisch kijken - wat wil de klant, welk product waar jaren ontwikkeling en bugfixes in zitten voldoet daaraan, en pas als dat laatste niet van toepassing is, dán pas kunnen ze zelf gaan programmeren. Is niet zo leuk als je eigen ding in elkaar prutsen, maar voor de opdrachtgever is het uiteindelijk veel beter.
http://www.telegraaf.nl/b...e_Breda_kost_4_ton__.htmlquote: .GertjanHonderden? Als het een overheidsproject betreft heb je het snel over tienduizenden euro's tot tonnen/miljoenen. Maar helaas zegt dat totaal niets over de opgeleverde kwaliteit.
Veel props voor mensen die op die site (van Breda) nu beveiligingslekken kunnen ontdekken, gewoon om ze dwars te zitten en aan te wijzen dat veel geld inversteren != een veilige site. Is trouwens ook gewoon een Drupal site, lijkt het (zit iets over Drupal in een stukje inline JS.)Volgens de stad is de site zo duur geworden vanwege "hoge eisen van veiligheid en privacy", zo meldt het blad Binnenlands Bestuur.
@hierboven: Het lijkt mij ook het verstandigste om een bestaand, veilig CMS te gebruiken dan zelf iets in elkaar zetten. En privacy != veiligheid: facebook is 99% veilig, maar heeft geen privacy. Als je er maatwerk modules in moet zetten omdat de linkerhand van de rechterhand niet mag weten wat hij doet (i.v.m. privacy), dan kost dat erg veel ontwikkeltijd. En vergeet niet dat testen op veiligheid erg kostbaar kan worden.
[edit]
1
2
3
4
5
6
7
| jQuery.extend(Drupal.settings, { "basePath":"\/", "googleanalytics":"trackOutgoing":1, "trackMailto":1, "trackDownload":1, "trackDownloadExtensions":"7z|aac|arc|arj|asf|asx|avi|bin|csv|doc|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|msi|msp|pdf|phps|png|ppt|qtm?|ra(m|r)?|sea|sit|tar|tgz|torrent|txt|wav|wma|wmv|wpd|xls|xml|z|zip"}, //snip |
privacy?
[ Voor 62% gewijzigd door MBV op 29-01-2011 14:22 ]
Uit datzelfde artikel
Onder het kopje veiligheid kun je een zo groot bedrag zetten als je wilt. Sommige mensen zijn zo ontzettend panisch.Volgens de stad is de site zo duur geworden vanwege "hoge eisen van veiligheid en privacy", zo meldt het blad Binnenlands Bestuur.
Daarnaast heb ik zelf ook nog wel een mooi voorbeeld in het weggooien van (publiekelijk) geld, een beetje in lijn met de OVCK: Wikipedia: Stichting Mechanische Registratie en Administratie
Mijn vader is zelf diaken van een PKN-kerk; Hij heeft zich sinds het begin van de fusie al en-public zorgen gemaakt over de kans van slagen van de SMRA.
If money talks then I'm a mime
If time is money then I'm out of time
1
2
3
4
5
| <select name="register_geboortejaar"> <option value="1940">1940</option> <option value="1941">1941</option> (..) </select> |
Je mag blijkbaar niet ouder zijn dan 71 om te registreren daar.
| 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
Verwijderd
Mocht het dan ooit voorkomen dat een ouder iemand zich wil registreren dan kan men altijd indien nodig het veld aanpassen, maar de kans dat dat gebeurd is natuurlijk zeer klein.
| 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
[ Voor 33% gewijzigd door .oisyn op 30-01-2011 13:35 ]
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.
Bij een overheidswebsite komt daar ook wel iets meer bij kijken weet ik uit ervaring. Dat zijn (doorgaans) niet standaard drupal systemen maar uitgebreide CMS + CRM + externe datalinks, inclusief publicatie trajecten (persoon A schrijft content, persoon B controleert inhoud, persoon C publiceert op specifieke pagina's op een bepaald moment, etc), logging (wie heeft wat op welk moment aangepast?), opties voor verschillende content-types (publiceren van word en PDF documenten, content-extractie daarvan zodat ze ook in HTML versies beschikbaar zijn), uitgebreide search engines, controle van beveiliging door een extern bureau, voldoen aan de webrichtlijnen van de overheid, etc.Matis schreef op zaterdag 29 januari 2011 @ 15:10:
Onder het kopje veiligheid kun je een zo groot bedrag zetten als je wilt. Sommige mensen zijn zo ontzettend panisch.
Plus, als we het over de overheid hebben praten we ook bijna automatisch over lange, tijdrovende aanbestedingsprocedures met meerdere rondes, verschillende offertes en demonstraties, etc. En als het eenmaal geimplementeerd is moet er ook haast altijd nog een tijd trainingen gegeven worden omdat de systemen best complex zijn voor de gemiddelde ambtenaar. Tel je dat allemaal bijelkaar op dan komt er een aardig bedrag uit rollen. Nu is 400k wel wat veel, maar dat een overheidswebsite een stuk duurder is dan een gemiddelde drupal installatie voor een klein bedrijfje is echt niet zo verwonderlijk.
En @ hierboven: typisch een fout die een gespecialiseerd bureau niet zo snel zal maken. Ik heb wel eens wat geanonimiseerde testdata gezien, je zou verbaasd staan over hoeveel mensen van rond de 100 er nog zijn
Nice, een dropdown met jaren die je bestand van burgers (realtime) gaat nalopen om te bepalen welke geboortejaren toe zijn gestaanJegorex schreef op zondag 30 januari 2011 @ 13:45:
Als gemeente zou je toch wel moeten weten hoe oud de oudste inwoner is?
Ook is het bij sommige sites/applicaties zo dat je voor het jaartal slechts 2 getallen gebuikt ziet worden (soms alleen in de frontend/invul velden, maar soms zelfs in de database), dan moet een ontwikkelaar ergens het omslagpunt bepalen (bijv < 25 = toekomst > 25 = verleden) en moet je dus of ieder jaar je applicatie aanpassen (kan natuurlijk ook geautomatiseerd) of dus een vast punt nemen. En geloof me de "business" is soms zo koppig dat je ze niet van de 2 digit jaartallen af kunt krijgen...
Daarnaast zijn er toch nog wel wat bestandsspecificaties die bedrijven gebruiken waar ook slechts 2 digits gebruikt worden (vooral bij oude platte tekst specificaties, om ruimte te besparen dacht men slim te zijn door slechts 2 digits te gebruiken)... En die moet je dan maar op goed geluk vertalen naar een 4 cijferig jaartal, maar wanneer je datums in zowel verleden als toekomst hebt kan dat best vervelend zijn (want voor een product is het vanzelfsprekend at 03 voor 2003 staat maar voor een geboorte jaar kan 03 zowel 1903 als 2003 zijn). Daarnaast wil je niet iemand van 103 importeren als iemand van slechts 3 jaar.
Stel dat je overigens een "schuivende" grens gebruikt dan heb je kans dat het inlezen van historische files weer mis kan gaan...
Heb er soms nog nachtmerries van
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.
De gemeente zelf waarschijnlijk wel, maar de software leverancier die de opdracht heeft gekregen misschien niet.Jegorex schreef op zondag 30 januari 2011 @ 13:45:
Als gemeente zou je toch wel moeten weten hoe oud de oudste inwoner is?
Zou ook leuk zijn als het direct uit de database komt.
Als er dan wel iemand in 1930 geboren is en nog leeft maar niet uit 1931 zie je een 'gat' tussen de jaartallen
[ Voor 22% gewijzigd door PiepPiep op 30-01-2011 16:20 ]
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
{signature}
haha, inderdaadPiepPiep schreef op zondag 30 januari 2011 @ 16:19:
[...]
De gemeente zelf waarschijnlijk wel, maar de software leverancier die de opdracht heeft gekregen misschien niet.
Zou ook leuk zijn als het direct uit de database komt.
Als er dan wel iemand in 1930 geboren is en nog leeft maar niet uit 1931 zie je een 'gat' tussen de jaartallen
of je kiest een jaar waarna via AJAX alle geboortedatums van de inwoners in dat jaar worden opgehaald en maand/dag selectievelden worden geupdate.
Let op: Mijn post bevat meningen, aannames of onwaarheden
We are shaping the future
"Beauty is the ultimate defence against complexity." David Gelernter
Niet als je nog niet in die gemeente ingeschreven bent en je dit via een formuliertje kunt doenMacros schreef op zondag 30 januari 2011 @ 18:30:
De gemeente weet toch wat je geboortedatum is? Zou je nooit in hoeven vullen als je een inwoner van die gemeente bent of zelfs inwoner van Nederland.
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.
Een BSN mag je niet zomaar vragen van gebruikers (staat volgens mij wel ergens in een privacywet), zeker niet voor een site die niet direct gekoppeld is aan de overheid.YopY schreef op zondag 30 januari 2011 @ 20:21:
[...]
Niet als je nog niet in die gemeente ingeschreven bent en je dit via een formuliertje kunt doen. Maar nee, een BSN invullen zou afdoende moeten zijn, in theorie.
We hebben daarvoor wel DigiD waar overheidsinstellingen gebruik van kunnen maken en wat ze ook steeds meer doen.
Inderdaad, want voor zover ik weet schrijft de gemeente waar je je inschrijft je automatisch uit bij je oude gemeente, die zullen dan wel jouw gegevens kunnen verstrekken. Mogelijk mag dat niet om privacy redenen?YopY schreef op zondag 30 januari 2011 @ 20:21:
[...]
Niet als je nog niet in die gemeente ingeschreven bent en je dit via een formuliertje kunt doen. Maar nee, een BSN invullen zou afdoende moeten zijn, in theorie.
"Beauty is the ultimate defence against complexity." David Gelernter
Ligt er natuurlijk aan wat voor registratie..oisyn schreef op zondag 30 januari 2011 @ 20:31:
Volgens mij is registratie helemaal niet gelimiteerd aan inwoners van de gemeente.
Als ik een nieuwe vuilniscontainer wil aanvragen moet ik dat bij mijn eigen gemeente doen.
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
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.