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 infinite loop zou ik ergens verwachten ja, maar treedt niet op. Misschien omdat DeleteInstance() effectief niet wordt aangeroepen, misschien omdat VC++ en GCC daartegen beschermen. I'll never know, die overduidelijke fouten heb ik weggehaald zonder te testen met wat print-statements
Ergens heb ik toch het gevoel dat ik dit vorig jaar beter niet zo genoemd had... Maar ik heb nog steeds niet direct een idee hoe ik hem wel zou kunnen noemen

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Trileanazerty schreef op maandag 31 augustus 2015 @ 17:08:
[afbeelding]
Ergens heb ik toch het gevoel dat ik dit vorig jaar beter niet zo genoemd had... Maar ik heb nog steeds niet direct een idee hoe ik hem wel zou kunnen noemen
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.
Mijn ervaringen met outsourcing naar India zijn best positief, het kost wat tijd qua opstarten maar zodra je eenmaal een paar developers hebt waarin je geïnvesteerd hebt en die je taal/domein begrijpen zijn ze erg goed. Die paar developers kunnen het vervolgens uitleggen aan hun collega's en uiteindelijk heb je een prima team.ajakkes schreef op dinsdag 23 juni 2015 @ 10:42:
Niet om alles goed te praten. Maar vergeten we hier niet dat India een groot land is met veel inwoners.
En dat je ook in zo'n land betaald voor kwaliteit?
Geef je project aan een Nederlandse kleine ontwikkelaar en je krijgt mogelijk ook een draak van een product terug.
Bepaalde zaken zijn zeker waar, zoals cultuur verschillen en minder communicatie door afstand. Maar afspraken moeten gewoon duidelijk gemaakt worden. Zoals opleveren van werkende modules. En niet eindeloos bij dezelfde ontwikkelaars blijven hangen terwijl problemen open blijven staan.
Maar dat gebeurd in Nederland zelf ook te vaak.
Je moet alleen niet de verwachting hebben dat de eerste opdracht goed zal gaan, net zoals je die verwachting niet bij een junior of een stagiair hebt.
I think there is a world market for maybe five computers. - Thomas Watson (1874-1956), Directeur van IBM (1943)
Tja, mijn ervaringen zijn totaal anders. Situatie: een ex-Philips-manager vond het een leuk idee om wat werk in India te laten doen. Dat was bij Philips ook hopeloos mis gegaan, dus dat zou bij het volgende bedrijf vast helemaal goed gaanXyritZz schreef op maandag 31 augustus 2015 @ 17:16:
[...]
Mijn ervaringen met outsourcing naar India zijn best positief, het kost wat tijd qua opstarten maar zodra je eenmaal een paar developers hebt waarin je geïnvesteerd hebt en die je taal/domein begrijpen zijn ze erg goed. Die paar developers kunnen het vervolgens uitleggen aan hun collega's en uiteindelijk heb je een prima team.
Je moet alleen niet de verwachting hebben dat de eerste opdracht goed zal gaan, net zoals je die verwachting niet bij een junior of een stagiair hebt.

Uiteraard zaten er grote verschillen tussen de developers daar, maar gemiddeld...
Ik heb daarnaast wel meer gedetailleerde verhalen gehoord van betrouwbare personen, maar die durf ik niet op te schrijven
Mijn ervaring is vrij simpel: als je als Nederlander een opdracht zo duidelijk gaat omschrijven dat het in India gemaakt kan worden, en genoeg project-management doet om te zorgen dat het af komt, en genoeg doet om onderhoudbaarheid te waarborgen, dan kost dat zoveel tijd dat je het beter hier kunt maken.
[ Voor 4% gewijzigd door MBV op 31-08-2015 23:20 ]
Even een XSD importeren is de heer in kwestie werkelijk 2 weken bezig geweest omdat zijn tools haperden. Uiteindelijk meerdere versies opgeleverd op verschillende SOAP versies, met zijn eigen toolset (Eclipse) aangetoond dat de import prima werkt, stap voor stap voor hem uitgeschreven hoe het moest, en nog lukte het hem niet. Hij bleef ook maar vragen waarom de namespaces (tempuri.org) geen geldige URL waren en dat hij daar 404's van kreeg.
Een andere waar mijn klomp wel om brak was dat we een export hadden aangeleverd van een paar miljoen records, volgens hun eigen specificaties in een .csv file, kregen we het verzoek of we er een .txt van wilde maken want nu opende het verkeerde programma als ze erop dubbel klikte...
Er komen hier vast nog veel meer hilariteit uit. We hebben nu maar besloten gewoon zoveel mogelijk voor te kouwen om het proces niet te verstoren, maar zelfs daar hebben ze dus nog moeite mee.
Ik neem aan C# als ik de syntax en alles zo zie? Dan maak ik altijd gebruik van een nullable boolean.azerty schreef op maandag 31 augustus 2015 @ 17:08:
[afbeelding]
Ergens heb ik toch het gevoel dat ik dit vorig jaar beter niet zo genoemd had... Maar ik heb nog steeds niet direct een idee hoe ik hem wel zou kunnen noemen
1
2
3
| public class Some { public bool? IsActive; // True: Active, False: Not Active, Unset: Inherit } |
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
Dat is misschien wel de grootste fout die je kan maken. Het team ondergeschikt maken aan het proces. Laat het maar pijnlijk duidelijk worden waar de problemen zitten. Nooit een mank proces proberen verdoezelen.LennardF1989 schreef op dinsdag 01 september 2015 @ 12:40:
We hebben nu maar besloten gewoon zoveel mogelijk voor te kouwen om het proces niet te verstoren
Dan moet ik weer gaan checken als ik ze wil afprinten op mogelijke null values... Nu is het met de enum juist iets gemakkelijker (moet er toch geen true/false statements mee uitvoeren).F.West98 schreef op dinsdag 01 september 2015 @ 17:44:
[...]
Ik neem aan C# als ik de syntax en alles zo zie? Dan maak ik altijd gebruik van een nullable boolean.
C#:
1 2 3 public class Some { public bool? IsActive; // True: Active, False: Not Active, Unset: Inherit }
Ja ok. ALs je het nu al zo hebt is dat wel makkelijker. Maar voor in de DB is dit volgens mij makkelijker (iig duidelijker als je in de db gaat snuffelen)azerty schreef op dinsdag 01 september 2015 @ 18:00:
[...]
Dan moet ik weer gaan checken als ik ze wil afprinten op mogelijke null values... Nu is het met de enum juist iets gemakkelijker (moet er toch geen true/false statements mee uitvoeren).
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
Dat lijkt mij ook. Je riskeert anders dat management een succes ziet waar in werkelijkheid alleen maar mislukking is. Op basis daarvan kunnen dan weer verkeerde beslissingen worden genomen.Kwistnix schreef op dinsdag 01 september 2015 @ 17:53:
Dat is misschien wel de grootste fout die je kan maken. Het team ondergeschikt maken aan het proces. Laat het maar pijnlijk duidelijk worden waar de problemen zitten. Nooit een mank proces proberen verdoezelen.
Als over een tijd een collega vertrekt (nieuwe baan bijvoorbeeld) wordt het gat dat hij achterlaat niet opgevuld met een lokale slimmerik, in plaats daarvan komt er een resource bij in India. "Want," aldus de verantwoordelijke manager, "tot nu toe hebben ze altijd prima werk geleverd." En kom dan maar eens aan met het tegendeel, je wordt gewoon niet meer geloofd.
We are shaping the future
Oh, we laten het ook zeker wel merken en alle communicatie naar de partij gaat ook naar projectmanagers. Dus op het moment dat meneer 30 mailtjes stuurt dat het niet lukt, terwijl het bij ons wel werkt, ziet management dat. Maar helaas er gaat aan de situatie niks veranderen want er is geen ander team beschikbaar, en wij hebben er dan als bedrijf niks aan dat wij 2 weken moeten wachten tot één of andere lummel eindelijk aan de slag kan. We gaan ze iig. geen code sturen, dat is hun eigen zorg, wij willen alleen horen of een API draait en goed reageertKwistnix schreef op dinsdag 01 september 2015 @ 17:53:
[...]
Dat is misschien wel de grootste fout die je kan maken. Het team ondergeschikt maken aan het proces. Laat het maar pijnlijk duidelijk worden waar de problemen zitten. Nooit een mank proces proberen verdoezelen.
[ Voor 20% gewijzigd door LennardF1989 op 01-09-2015 20:21 ]
We are shaping the future
Dat doen we ook wel, maar vanuit management willen ze bepaalde zaken geregeld hebben die wij door onkunde van andere niet kunnen waarmaken. En dat verdoezelen we absoluut niet.Alex) schreef op dinsdag 01 september 2015 @ 20:21:
Natuurlijk heb je daar wel wat aan. In de tijd dat je zit te wachten kun je andere dingen doen (refactoren bijvoorbeeld) en je kunt het als leverage gebruiken wanneer er een beoordelingsmoment komt.
Ook niet in een DB opgeslagen, dus allemaal geen probleemF.West98 schreef op dinsdag 01 september 2015 @ 18:02:
[...]
Ja ok. ALs je het nu al zo hebt is dat wel makkelijker. Maar voor in de DB is dit volgens mij makkelijker (iig duidelijker als je in de db gaat snuffelen)
(Output van ander programma die geparset moet worden (of er iets ofwel voorkomt, niet voorkomt of afwezig is), en het wordt ook onmiddelijk verder verwerkt en opgeslagen in tekstueel formaat (html pagina). De enum voldoet dus perfect hiervoor, maar de benaming was dus niet ideaal...
Situatie: grote klant, "India" doet bugfixing en deployments en "wij" doen nieuwe functionaliteit.
Na 2 maanden ontwikkelen en testen staat de nieuwe versie eindelijk op productie. En warempel, het werkt niet. Velden verschijnen niet in de UI en op pagina's. Degene die de deployments doet kwam er niet aan uit en vroeg mij om hulp. Wat bleek? Hun oplossing voor merge conflicts is standaard "Keep my version".
We are shaping the future
Alex) schreef op dinsdag 01 september 2015 @ 20:27:
Wat bleek? Hun oplossing voor merge conflicts is standaard "Keep my version".

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Dat weet ik. Veel.Sebazzz schreef op woensdag 02 september 2015 @ 08:27:
[...]
Wie weet wat voor wijzigingen nog meer verloren zijn gegaan...
En als je daar vervolgens wat van zei (tegen hun, of tegen de opdrachtgever) kreeg je het lid op de neus "want dit is niet constructief".
We are shaping the future
1
2
3
4
| public static double ToPositive(this double value) { return value >= 0 ? value : -value; } |
En dan ergens anders, in dezelfde class...
1
| return Math.Abs(value - value2).ToPositive(); |
Wait... wut?

Soms wil je het gewoon zeker wetenOZ-Gump schreef op woensdag 02 september 2015 @ 16:07:
C#:
1 2 3 4 public static double ToPositive(this double value) { return value >= 0 ? value : -value; }
En dan ergens anders, in dezelfde class...
C#:
1 return Math.Abs(value - value2).ToPositive();
Wait... wut?
1
2
3
4
5
| uint32_t Altitude; Altitude = TinyGPSPlus::altitude.meters(); if(Altitude <0) return 1; |
Een bug waar we alleen in Nederland last van hebben
Valt mee.mcDavid schreef op maandag 14 september 2015 @ 15:55:
Een bug waar we alleen in Nederland last van hebben

Volgens mij werkt deze zelfs averechts in edge cases: +0.0000 wordt -0.0000, dat kan toch met doubles
Inderdaad, zeker vanaf het bijna 2 km hoger gelegen Dante's view echt adembenemend.
“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.”
[ Voor 93% gewijzigd door NMe op 14-09-2015 18:31 ]
[edit] NMe is me voor...
[ Voor 26% gewijzigd door Creepy op 14-09-2015 18:32 ]
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
azerty schreef op maandag 21 december 2015 @ 20:19:
[afbeelding]
Die moet dringend onder handen genomen worden
Wat ik fout had gedaan was dat ik een variable had waar ik van uit ging dat het een boolean was, maar het bleek een string te zijn. Een kort voorbeeldje:
Dit heeft me behoorlijk wat hoofdpijn gebracht, en nog meer toen ik er achter kwam wat er aan de hand wasvar deVariable = "true";
//stond er niet letterlijk, had het uit de url gehaald.
if(deVariable === true) {
alert("dit stukje zal nooit draaien");
} else {
errorFunc();
}
1
2
3
4
5
6
7
| $.post('/save/something', { id: 1, title: 'Test' }, function(response) { if(response == '{"success": true}') { alert('Success'); } else { alert('Fail'); } }); |
Bijna echt JSON!VeQVQUCjsxagUCH schreef op dinsdag 22 december 2015 @ 21:08:
Tja...
JavaScript:
1 2 3 4 5 6 7 $.post('/save/something', { id: 1, title: 'Test' }, function(response) { if(response == '{"success": true}') { alert('Success'); } else { alert('Fail'); } });
I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!
Ik had ook zo'n mooie derp vandaag. Collega kwam met een bug aanzetten met local storage. Wat had ik gedaan, boolean in de local storage opgeslagen. Alleen jammer dat de string 'false' truthy is.AtlasDev schreef op dinsdag 22 december 2015 @ 12:15:
Deze vond ik wel mooi: https://twitter.com/Atlas...s/632217435769315328?s=09
Wat ik fout had gedaan was dat ik een variable had waar ik van uit ging dat het een boolean was, maar het bleek een string te zijn. Een kort voorbeeldje:
[...]
Dit heeft me behoorlijk wat hoofdpijn gebracht, en nog meer toen ik er achter kwam wat er aan de hand was.
(Overigens achterlijk dat local storage alleen strings aan kan, en niet andere primitives.)
[ Voor 6% gewijzigd door Grijze Vos op 22-12-2015 21:24 ]
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
constructor en destructor als private?Woy schreef op maandag 29 juni 2015 @ 18:37:
[...]
Krijg je niet überhaupt een compiler error dat je een non-static field gebruikt in een static context?
Een private constructor is niet zo vreemd bij een Singleton, je wil immers niet dat iemand zelf instances aan gaat maken.BoringDay schreef op woensdag 23 december 2015 @ 00:17:
[...]
constructor en destructor als private?
“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.”
Dat kan idd met doubles, maar wat je zegt zal niet optreden. ToPositive() maakt alles kleiner dan 0 negatief. +0 zal dus nooit -0 worden, want +0 >= 0. Overigens ook -0 >= +0, want -0 == +0, en niet -0 < +0.ZaPPZion schreef op maandag 14 september 2015 @ 17:08:
[...]
Volgens mij werkt deze zelfs averechts in edge cases: +0.0000 wordt -0.0000, dat kan toch met doubles
Je kunt hooguit zeggen dat -0 ook -0 blijft, terwijl dat met Abs() waarschijnlijk niet het geval is (aangezien een typische abs operatie op de CPU gewoon de sign bit op 0 zet). Maar dat kan natuurlijk alleen als je direct ToPositive() aanroept zonder eerst Abs() aan te roepen.
[ Voor 21% gewijzigd door .oisyn op 23-12-2015 10:16 ]
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.
Wellicht voor C++ (of compiler afhankelijk), maar mij is geleerd dat dit altijd public moet zijn.Woy schreef op woensdag 23 december 2015 @ 08:11:
[...]
Een private constructor is niet zo vreemd bij een Singleton, je wil immers niet dat iemand zelf instances aan gaat maken.
Dat heb je verkeerd geleerd. Ook in C#, Java en vast een dozijn andere OO-talen mag een ctor private zijn.BoringDay schreef op woensdag 23 december 2015 @ 12:10:
[...]
Wellicht voor C++ (of compiler afhankelijk), maar mij is geleerd dat dit altijd public moet zijn.
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Als je de klasse in kwestie van buitenaf wil kunnen instantiëren, ja.BoringDay schreef op woensdag 23 december 2015 @ 12:10:
[...]
Wellicht voor C++ (of compiler afhankelijk), maar mij is geleerd dat dit altijd public moet zijn.
Een ctor moet niet public zijn. Mag private of protected, denk aan factories en inheritance waarbij je de (base) constructor niet van buitenaf wil laten aanroepen. Uiteraard gebruik je daar in het geval van inheritance ook een abstracte base class voor.
[ Voor 31% gewijzigd door CodeCaster op 23-12-2015 12:15 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Leuke discussie op een forum m.b.t. februari...
Code:
code:
1 strtotime("+1 month",$date);
>> Ja, maar dan komt er ' 02-03-2013' uit, dat kan niet.
<< Dacht jij dan 30 feb.
>> Dat vraag ik toch'?
<< Pak je kalender er eens bij....
☎ Telecommunicatie van vroeger
🚅Alles over spoor en treintjes
Maar het scheelt wel een extra queryazerty schreef op maandag 21 december 2015 @ 20:19:
[afbeelding]
Die moet dringend onder handen genomen worden
azerty schreef op maandag 21 december 2015 @ 20:19:
[afbeelding]
Die moet dringend onder handen genomen worden
I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!
Ha, zo werkte het rechtensysteem van mijn vorige site ook:azerty schreef op maandag 21 december 2015 @ 20:19:
[afbeelding]
Die moet dringend onder handen genomen worden
edit_users, delete_users, read_usernotes, delete_usernotes, write_usernotes, add_news, edit_news, delete_news, add_reviews, edit_reviews, delete_reviews etc..... dan nog 20 velden verder ofzo
Nu heb ik een mooie CRUD-implementatie gemaakt op een vindsel hier in de diepe krochten van GoT
☎ Telecommunicatie van vroeger
🚅Alles over spoor en treintjes
1
2
3
4
5
6
7
8
9
10
| def doe_iets_specifiek_voor_1_toestel(...): initialisatie = blah do_device_reboot=False for i in list_of_device_properties: vanalles_en_nog_wat() do_device_reboot = True if do_device_reboot: trigger_reboot() sleep(10) |
In heel veel gevallen is die list_of_device_properties leeg en doet de functie niet meer dan sleep(10).
Saillant detail: deze code werd opgeroepen tijdens het begin van elke aanroep van het script.
Met andere woorden: elke developer (grootteorde enkele tientallen) werd bij elke aanroep 10s beziggehouden.
Mijn echte probleem hiermee:
- dat dit überhaupt geschreven is
- in code die verplicht gereviewed moet worden
- en dat geen van die tientallen developers denkt: "godverdomme, dit duurt lang! ik zoek ff uit waarom..."
Samen met wat andere opstart optimalisaties (30s opstarttijd -> 5s) heb ik dus grosso modo 2-3 manweken per jaar aan tijd bespaard! Beste baas, bij deze neem ik 2 weken verlof op
ASSUME makes an ASS out of U and ME
Hmm, voor invoegen van nieuws misschien wel, maar niet noodzakelijk voor andere zaken... Ah well, het gaat eruit in de volgende versie
Ha maar dat is overal hetzelfde. Zijn van die klusjes die je 'een keer' wil doen maar zo lang mogelijk uitstelt. Terwijl er eventjes de tijd voor nemen je bakken tijd danwel irritaties bespaartH!GHGuY schreef op zaterdag 30 januari 2016 @ 20:05:
Gisteren ook weer wat tegengekomen:
Python:
1 2 3 4 5 6 7 8 9 10 def doe_iets_specifiek_voor_1_toestel(...): initialisatie = blah do_device_reboot=False for i in list_of_device_properties: vanalles_en_nog_wat() do_device_reboot = True if do_device_reboot: trigger_reboot() sleep(10)
In heel veel gevallen is die list_of_device_properties leeg en doet de functie niet meer dan sleep(10).
Saillant detail: deze code werd opgeroepen tijdens het begin van elke aanroep van het script.
Met andere woorden: elke developer (grootteorde enkele tientallen) werd bij elke aanroep 10s beziggehouden.
Mijn echte probleem hiermee:
- dat dit überhaupt geschreven is
- in code die verplicht gereviewed moet worden
- en dat geen van die tientallen developers denkt: "godverdomme, dit duurt lang! ik zoek ff uit waarom..."
Samen met wat andere opstart optimalisaties (30s opstarttijd -> 5s) heb ik dus grosso modo 2-3 manweken per jaar aan tijd bespaard! Beste baas, bij deze neem ik 2 weken verlof op
En bij elke INSERT natuurlijk een stukje code die de velden telt om de 'column count doesn't match' meldingen tegen te gaan
[ Voor 10% gewijzigd door AW_Bos op 31-01-2016 13:32 ]
☎ Telecommunicatie van vroeger
🚅Alles over spoor en treintjes
Insert is er nog niet zo te zienAW_Bos schreef op zondag 31 januari 2016 @ 13:31:
[...]
En bij elke INSERT natuurlijk een stukje code die de velden telt om de 'column count doesn't match' meldingen tegen te gaan![]()
En natuurlijk gaat het updaten in een php loopje... Als je ze alle 50 aanpast zijn dat 50 update queries

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| try { // need to circumvent json_decode by calling _oauthRequest // directly, since response isn't JSON format. $access_token_response = $this->_oauthRequest( $this->getUrl('graph', '/oauth/access_token'), $params = array('client_id' => $this->getAppId(), 'client_secret' => $this->getAppSecret(), 'redirect_uri' => $redirect_uri, 'code' => $code)); } catch (FacebookApiException $e) { // most likely that user very recently revoked authorization. // In any event, we don't have an access token, so say so. return false; } |
Systeem werkte niet omdat er dus een exception optrad (die natuurlijk niet zichbaar was en enkel bugs veroorzaakte). En wat gebeurt er dan? Niks, nada, noppes. Niet eens de exception loggen. De fout had ook niks te maken met de dingen die in de commentaar vermeld staan.
[ Voor 5% gewijzigd door Bv202 op 01-02-2016 14:11 ]
En je oplossing was om de try/catch weg te halen? Of logging toe te voegen?
Daarna ben ik wel benieuwd hoe je dan om gaat met evt. update van je dependencies, want dan wordt de wijziging weer weggehaald...
{signature}
Grepje voor gebruikt uiteraard
1
| $objWrongEvent | Add-Member -MemberType NoteProperty -Name SourceComputer -Value $("[System.Net.Dns]::GetHostEntry($($($arrWrong[0].ReplacementStrings[5]))).HostName.Split(".")[0] ($($($arrWrong[0].ReplacementStrings[5])))") |
Het moment dat ik zelf niet meer zeker ben waar de haakjes openen en stoppen is het moment dat ik het leesbaarder moet schrijven waarschijnlijk
[ Voor 4% gewijzigd door YellowOnline op 04-02-2016 14:02 ]
Ik ben zelf ook geen fan van $variabelen in een string. Het wordt al snel onleesbaar. Ik gebruik liever formatted strings zodat je tekst en variabelen duidelijk scheidt.YellowOnline schreef op donderdag 04 februari 2016 @ 14:01:
Het moment dat ik zelf niet meer zeker ben waar de haakjes openen en stoppen is het moment dat ik het leesbaarder moet schrijven waarschijnlijk
1
| $password = addslashes(strip_tags(md5($_POST['sPassword']))); |
Jup, zo gaan er zeker geen sql injecties mogelijk zijn
uiteraard zwijgen we maar over het feit dat het plain md5 is

Niet alleen dat MD5 ..... Die volgorde ook .........azerty schreef op vrijdag 05 februari 2016 @ 00:18:
PHP:
1 $password = addslashes(strip_tags(md5($_POST['sPassword'])));
Jup, zo gaan er zeker geen sql injecties mogelijk zijn
uiteraard zwijgen we maar over het feit dat het plain md5 is
- Je hebt een wachtwoord.
- Gooit daar MD5 overheen
- Daar ga je tags uit strippen (die er niet zijn want het is een MD5 hash)
- En dan nog slashes toevoegen aan aanhalingstekens die er niet zijn (want het is een MD5 hash)



Als het een class was, had ik die gewoon lekker extended met een eigen wrapper class die die functie override.mbarie schreef op dinsdag 02 februari 2016 @ 10:41:
[...]
En je oplossing was om de try/catch weg te halen? Of logging toe te voegen?
Daarna ben ik wel benieuwd hoe je dan om gaat met evt. update van je dependencies, want dan wordt de wijziging weer weggehaald...
En de oplossing is NIET om de try/catch weg te halen. Die exception is er niet voor niets. Dan ga iets naar een logsysteem toegooien (de trace + message) en laat je het script daar ophouden door een melding terug te geven aan de front-end dat er iets is mis gegaan en dat er een melding van gemaakt is met daarbij dat dit z.s.m. wordt opgelost. (Wat dus kan als je een wrapper gebruikt)
Waarom denk je dat ik hem hier post?CRXDelSol schreef op vrijdag 05 februari 2016 @ 00:39:
[...]
Niet alleen dat MD5 ..... Die volgorde ook .........
- Je hebt een wachtwoord.
- Gooit daar MD5 overheen
- Daar ga je tags uit strippen (die er niet zijn want het is een MD5 hash)
- En dan nog slashes toevoegen aan aanhalingstekens die er niet zijn (want het is een MD5 hash)
![]()
![]()
Ik vond 'm gewoon geniaal.
Het had net zo goed iets kunnen zijn als:
1
2
| $password = ''; $password = preg_replace('/\s*/', '', striptags(md5($password))); |
Mooie geordende wachtwoord kolom in de user tabel van de database
Opvolgertje:azerty schreef op vrijdag 05 februari 2016 @ 00:18:
PHP:
1 $password = addslashes(strip_tags(md5($_POST['sPassword'])));
Jup, zo gaan er zeker geen sql injecties mogelijk zijn
uiteraard zwijgen we maar over het feit dat het plain md5 is
1
2
3
| if (strlen($_POST['sPassword_New']) == strlen($_POST['sPassword_Current'])) { $sErrorMsg .= "- Je nieuwe wachtwoord mag niet gelijk zijn aan je huidig wachtwoord."; } |
Ja hoor
Wees blij dat 'ie zich in ieder geval bewust was van het gevaar van SQL injectieCRXDelSol schreef op vrijdag 05 februari 2016 @ 00:39:
[...]
Niet alleen dat MD5 ..... Die volgorde ook .........
- Je hebt een wachtwoord.
- Gooit daar MD5 overheen
- Daar ga je tags uit strippen (die er niet zijn want het is een MD5 hash)
- En dan nog slashes toevoegen aan aanhalingstekens die er niet zijn (want het is een MD5 hash)
![]()
![]()
Ah, als ze even lang zijn zijn ze automatisch hetzelfdeazerty schreef op vrijdag 12 februari 2016 @ 22:07:
[...]
Opvolgertje:
PHP:
1 2 3 if (strlen($_POST['sPassword_New']) == strlen($_POST['sPassword_Current'])) { $sErrorMsg .= "- Je nieuwe wachtwoord mag niet gelijk zijn aan je huidig wachtwoord."; }
Ja hoor
I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!
Uiteraard, wat kan het anders zijn?Firesphere schreef op vrijdag 12 februari 2016 @ 23:03:
[...]
Ah, als ze even lang zijn zijn ze automatisch hetzelfde
[ Voor 97% gewijzigd door azerty op 13-02-2016 05:35 ]
I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Die is goedZerfox schreef op zaterdag 13 februari 2016 @ 14:45:
Afgelopen kwartiel op school een groepsproject moeten doen met drie medestudenten. Midden in de nacht (uiteraard vlak voor de deadline) kwam ik deze code van iemand tegen:
[afbeelding]
Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag
1
2
3
4
| private ISomeDBContext dbContext; ... SomeIOC.register<ISomeDBContext>().Instance(SomeDBContext); this.dbContext = new SomeDBContext(); |
Als je dan vraagt wat men denkt dat dit doet is het antwoord "ach, het werkt"

Voeg daarbij een standaard write-only oracle DB, een implementatie van NHibernate waarin SessionFactory wordt gebruikt om een singleton Session aan te maken en het idee dat EF slecht idee "omdat dat problemen geeft", en je wordt heel inventief als het gaat om database I/O
Dacht eerst dat het z'n methode was om te controleren of de wachtwoorden gelijk waren, om toegang te verlenenFiresphere schreef op vrijdag 12 februari 2016 @ 23:03:
[...]
Ah, als ze even lang zijn zijn ze automatisch hetzelfde
👑
Ach, het is beter dan wat die programmeur van de Facebook SDK deed. Ik weet alleen niet of ik daarom moet lachen of huilen.Zerfox schreef op zaterdag 13 februari 2016 @ 14:45:
Afgelopen kwartiel op school een groepsproject moeten doen met drie medestudenten. Midden in de nacht (uiteraard vlak voor de deadline) kwam ik deze code van iemand tegen:
[afbeelding]
In principe kan hij daar natuurlijk dezelfde logica voor gebruikenajakkes schreef op zaterdag 13 februari 2016 @ 16:32:
Dacht eerst dat het z'n methode was om te controleren of de wachtwoorden gelijk waren, om toegang te verlenen
Hoewel het dan nog veel veiliger kan: vergelijk de lengte van de MD5 hashes met elkaar

[ Voor 13% gewijzigd door Dido op 13-02-2016 16:38 ]
Geziend de code (waarschijnlijk) onderuit gaat is connection.close() nu niet echt heel erg om aan te roepenZerfox schreef op zaterdag 13 februari 2016 @ 14:45:
Afgelopen kwartiel op school een groepsproject moeten doen met drie medestudenten. Midden in de nacht (uiteraard vlak voor de deadline) kwam ik deze code van iemand tegen:
[afbeelding]
d'r is maar één ding in het leven wat moet, en dat is dood gaan.
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.
if (bla...bla....)
{
// do nothing
} else
{
*code die iets doet*
}
Waar ik het meeste mee zat was het comentaar //do nothing......
WP: ME SUZ-SWM80VA + ERST20D-VM2D || PV: 4500Wp ZWW || BENG, Rc6 rondom, tripple glas, WTW, 165m2 verwarmd || Gasloos sinds sep 2023
1
2
3
4
5
6
7
8
9
10
11
12
13
| foreach (var f in foo) { if (f.id == x) { foreach (var b in bar) { if (b.id == y) { // do something with foo with id: x and bar with id: y } } } } |
Zelf ben ik meer van de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| f = null; foreach (var item in foo) { if (item.id == x) { f = item; break; } } b = null; foreach (var item in bar) { if (item.id == y) { b = item; break; } } if (f != null && b != null) { // do something with foo with id: x and bar with id: y } |
of met Linq
1
2
3
4
5
6
7
| f = foo.SingleOrDefault(item => item.id == x); b = bar.SingleOrDefault(item => item.id == y); if (f != null && b != null) { // do something with foo with id: x and bar with id: y } |
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 "goh je wil 250 nieuwe nummers toekennen - dat kan toch geen probleem zijn om vrije nummers te vinden in je database. Je moet eens een profiler gebruiken en kijken hoe vaak wat wordt aangeroepen."
Antwoord: "Profilewattuh?"
Uiteindelijk waren er wat geneste loops die heel leuk hetzelfde deden, waardoor het probleem van orde N^3 werd. Plus wat inefficient Java geneuzel...
Wel als de property "id" niet uniek is. Anders toch wel? Of mis ik iets?.oisyn schreef op zaterdag 13 februari 2016 @ 23:40:
Je bent je er bewust van dat die twee stukken code niet hetzelfde doen?
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
Die nesting in onze code is echt verschrikkelijk (soms 7-8 levels diep) en is met een beetje nadenken makkelijk te herschrijven.
Ander voorbeeld:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| if (foo) { if (bar) { if (baz) { // do something } else { throw new Exception("baz"); } } else { throw new Exception("bar"); } } else { throw new Exception("foo"); } |
vs.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| if (!foo) { throw new Exception("foo"); } if (!bar) { throw new Exception("bar"); } if (!baz) { throw new Exception("baz"); } // do something |
Misschien is 'bar' wel null als het id niet bestaat.F.West98 schreef op zondag 14 februari 2016 @ 00:01:
[...]
Wel als de property "id" niet uniek is. Anders toch wel? Of mis ik iets?
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.
Beide stukken code doen heel wat anders, al snap ik wel waar je op doelt.Daos schreef op zondag 14 februari 2016 @ 00:16:
Ik was vergeten te melden dat id uniek is.
Die nesting in onze code is echt verschrikkelijk (soms 7-8 levels diep) en is met een beetje nadenken makkelijk te herschrijven.
Ander voorbeeld:
[...]
Komt d'r in, dan kö-j d’r oet kieken
./projectdelete "../"?sympa schreef op zondag 14 februari 2016 @ 00:01:
Nog een: collega maakt een handige unix utility om een projectmapje naar keus te verwijderen. Iets als:
#!/bin/sh
rm -rf /docs/$1/*
Shell "programmeren" is echt gevaarlijk.
I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!
Je ziet ook vaakZerfox schreef op zaterdag 13 februari 2016 @ 14:45:
Afgelopen kwartiel op school een groepsproject moeten doen met drie medestudenten. Midden in de nacht (uiteraard vlak voor de deadline) kwam ik deze code van iemand tegen:
[afbeelding]
1
2
3
4
| catch(Exception e) { throw e; } |
Zo heb ik het ook vaak geschreven. Maar dan klopt de stack trace niet meer. Ik kwam er pas een jaar geleden achter dat de juiste manier zo is:
1
2
3
4
| catch(Exception e) { throw; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| #include <iostream> struct Foo { virtual const char * msg() { return "Luke without hand"; } }; struct Bar : Foo { virtual const char * msg() { return "Luke with hand"; } }; int main() { try { try { throw Bar(); } catch(Foo & f) { std::cout << f.msg() << std::endl; throw f; } } catch(Foo & f) { std::cout << f.msg() << std::endl; } } |
Output:
Luke with hand Luke without hand
NOOOoooo...
[ Voor 6% gewijzigd door .oisyn op 16-02-2016 10:20 ]
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 er verder toch niets mee doet kun je de hele catch ook gewoon weglaten, IMHOroy-t schreef op dinsdag 16 februari 2016 @ 09:27:
[...]
Zo heb ik het ook vaak geschreven. Maar dan klopt de stack trace niet meer. Ik kwam er pas een jaar geleden achter dat de juiste manier zo is:
code:
1 2 3 4 catch(Exception e) { throw; }
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
WTF?! Je geeft een referentie door, en toch wordt er een kopie gemaakt?.oisyn schreef op dinsdag 16 februari 2016 @ 10:10:
In C++ maak je op die manier ook slicing copies
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <iostream> struct Foo { virtual const char * msg() { return "Luke without hand"; } }; struct Bar : Foo { virtual const char * msg() { return "Luke with hand"; } }; int main() { try { try { throw Bar(); } catch(Foo & f) { std::cout << f.msg() << std::endl; throw f; } } catch(Foo & f) { std::cout << f.msg() << std::endl; } }
Output:
Luke with hand Luke without hand
NOOOoooo...

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 gok dat hij hier nog logging e.d. wil toevoegen, maar voor het gemak dit weggelaten heeft in z'n voorbeeldRobV schreef op dinsdag 16 februari 2016 @ 10:28:
[...]
Als je er verder toch niets mee doet kun je de hele catch ook gewoon weglaten, IMHO
Dat vermoeden heb ik ook, maar een voorbeeld geven waar je het doel van je voorbeeld weglaat (namelijk het loggen van de error op een goede manier) is niet het beste voorbeeld en past dan ook prima in dit topicMerethil schreef op dinsdag 16 februari 2016 @ 11:13:
[...]
Ik gok dat hij hier nog logging e.d. wil toevoegen, maar voor het gemak dit weggelaten heeft in z'n voorbeeld


[ Voor 17% gewijzigd door RobV op 16-02-2016 11:21 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Het enige wat hij toch aangeeft is dat je, als je je error mét stacktrace intact houden wilt throwen, je alleen throw hoeft te gebruiken? Wat hij verder daarin doet boeit niemand, het ging hem om dit specifieke stukje syntax.RobV schreef op dinsdag 16 februari 2016 @ 11:19:
[...]
Een voorbeeld geven waar je het doel van je voorbeeld weglaat (namelijk het loggen van de error op een goede manier) is niet het beste voorbeeld en past dan ook prima in dit topic
Zie mijn edit. Sorry als ik te vroeg was met posten, ik zag in dat mijn verwoording niet netjes en niet aardig was.Merethil schreef op dinsdag 16 februari 2016 @ 11:21:
[...]
Het enige wat hij toch aangeeft is dat je, als je je error mét stacktrace intact houden wilt throwen, je alleen throw hoeft te gebruiken? Wat hij verder daarin doet boeit niemand, het ging hem om dit specifieke stukje syntax.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Je edit is mijn reactieRobV schreef op dinsdag 16 februari 2016 @ 11:22:
[...]
Zie mijn edit. Sorry als ik te vroeg was met posten, ik zag in dat mijn verwoording niet netjes en niet aardig was.
Verwoording maakte mij niet zo uit, het ging me meer om het principe.
Het is eigenlijk hele rare syntax, want je zegt niets anders dan "throw", zonder aan te geven wat je precies gooit, maar goed...
Hoe vaak ik trouwens heb gezien dat er niets anders dan een println van de error gebeurt in de catch; op mijn werk waren ze daar echt heel erg fan van
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.