☎ Telecommunicatie van vroeger
🚅Alles over spoor en treintjes
Volgens mij bedoelde 'ie het als eenmalige actie. Lijkt me simpeler om de fout uit 't script te halen dan om een aparte job te starten om die fout te corrigerenAW_Bos schreef op woensdag 5 juni 2019 @ 16:42:
Maar killt hij dan niet alle PHP-scripts? Dat lijkt mij ook niet de bedoeling? Wat als iemand op dat moment een request op mijn site doet?
https://niels.nu
Verder in: cURL requests zonder timeout in cronjobsAW_Bos schreef op woensdag 5 juni 2019 @ 16:42:
Maar killt hij dan niet alle PHP-scripts? Dat lijkt mij ook niet de bedoeling? Wat als iemand op dat moment een request op mijn site doet?
If money talks then I'm a mime
If time is money then I'm out of time
Scary stuff.Matis schreef op woensdag 5 juni 2019 @ 16:28:
[...]
?kill $(ps aux | grep '[p]hp' | awk '{print $2}')
Ten eerste killt het potentieel - alle - php scripts op het systeem.
Ten tweede neemt het ook alles mee dat toevallig met php begint.
Ik zou filteren op de naam van het script, zoals "waarom-is-die-trein-er-nou-niet.php"
Ask yourself if you are happy and then you cease to be.
En terechtLethalis schreef op woensdag 5 juni 2019 @ 16:54:
[...]
Scary stuff.
Ten eerste killt het potentieel - alle - php scripts op het systeem.
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.
Zou inderdaad standaard scheduled moeten draaien op servers elke seconde ofzo.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
KloptLethalis schreef op woensdag 5 juni 2019 @ 16:54:
Scary stuff.
Ten eerste killt het potentieel - alle - php scripts op het systeem.
Ten tweede neemt het ook alles mee dat toevallig met php begint.
Ik zou filteren op de naam van het script, zoals "waarom-is-die-trein-er-nou-niet.php"
Zie daarom ook mijn verbeterde post Matis in "cURL requests zonder timeout in cronjobs"
If money talks then I'm a mime
If time is money then I'm out of time
Ik ben zo blij dat mijn werkgever paar jaar geleden heeft geïnvesteerd in een airco systeem! Nu is het makkelijk uit te houden (alleen dan naar huis fietsen is zo zwaar
Denk ook zonder de airco dat het op het kantoor bloedheet was geworden (kantoor zit aan zonkant, en dan hebben wij ook nog dat 'anti-inkijkfolie' dat veel hitte binnenhoudt)
Met de prive airco unit die ik heb op het werk houd ik het altijd volRyur schreef op woensdag 5 juni 2019 @ 19:33:
Houden jullie het nog een beetje uit met de hitte?
Ik ben zo blij dat mijn werkgever paar jaar geleden heeft geïnvesteerd in een airco systeem! Nu is het makkelijk uit te houden (alleen dan naar huis fietsen is zo zwaar).
Denk ook zonder de airco dat het op het kantoor bloedheet was geworden (kantoor zit aan zonkant, en dan hebben wij ook nog dat 'anti-inkijkfolie' dat veel hitte binnenhoudt)
In 2017 is een nieuwe airco unit op het dak gezet boven mijn werkplek. De bedoeling was om hierop 8 kantoren en een groot magazijn aan te sluiten. Echter ging dit allemaal niet door door te hoge kosten, vandaar dat ik nu een hele airco unit voor mijzelf heb
[ Voor 19% gewijzigd door BladeSlayer1000 op 05-06-2019 19:54 ]
Van de vier werklocaties heb ik er twee met uitstekende airco, eentje gaat wel en een is vrij matig.Ryur schreef op woensdag 5 juni 2019 @ 19:33:
Houden jullie het nog een beetje uit met de hitte?
Ik ben zo blij dat mijn werkgever paar jaar geleden heeft geïnvesteerd in een airco systeem! Nu is het makkelijk uit te houden (alleen dan naar huis fietsen is zo zwaar).
Denk ook zonder de airco dat het op het kantoor bloedheet was geworden (kantoor zit aan zonkant, en dan hebben wij ook nog dat 'anti-inkijkfolie' dat veel hitte binnenhoudt)
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Zijn er dan nog kantoren plekken waar geen airco is?Ryur schreef op woensdag 5 juni 2019 @ 19:33:
Houden jullie het nog een beetje uit met de hitte?
Ik ben zo blij dat mijn werkgever paar jaar geleden heeft geïnvesteerd in een airco systeem! Nu is het makkelijk uit te houden (alleen dan naar huis fietsen is zo zwaar).
Denk ook zonder de airco dat het op het kantoor bloedheet was geworden (kantoor zit aan zonkant, en dan hebben wij ook nog dat 'anti-inkijkfolie' dat veel hitte binnenhoudt)
Going for adventure, lots of sun and a convertible! | GMT-8
Het probleem van zulke kantoren is vaak niet eens dat er geen airco is. De ruimtes zijn gewoon niet goed geventileerd voor de hoeveelheid mensen die er in zitten.Snake schreef op woensdag 5 juni 2019 @ 20:05:
[...]
Zijn er dan nog kantoren plekken waar geen airco is?
Welke hitte?Ryur schreef op woensdag 5 juni 2019 @ 19:33:
Houden jullie het nog een beetje uit met de hitte?
Ik ben zo blij dat mijn werkgever paar jaar geleden heeft geïnvesteerd in een airco systeem! Nu is het makkelijk uit te houden (alleen dan naar huis fietsen is zo zwaar).
Denk ook zonder de airco dat het op het kantoor bloedheet was geworden (kantoor zit aan zonkant, en dan hebben wij ook nog dat 'anti-inkijkfolie' dat veel hitte binnenhoudt)
]|[ Apple Macbook Pro Retina 13" ]|[
Engineering is like Tetris. Succes disappears and errors accumulate.
Ik heb gehoord dat het vet is (maar snap niet helemaal waarom, ben wel benieuwd), maar heb ook gehoord dat je erg moet oppassen met de queries omdat die schijnbaar infinite recursion kunnen bevatten...armageddon_2k1 schreef op donderdag 6 juni 2019 @ 10:02:
Ben nu bezig met GraphQL te testen. Best gaaf spul. Onze hele XML-based REST API kan een stuk simpeler nu.
Ik wilde dat ik daar een beetje tijd voor kon vinden om naar te kijken.armageddon_2k1 schreef op donderdag 6 juni 2019 @ 10:02:
Ben nu bezig met GraphQL te testen. Best gaaf spul. Onze hele XML-based REST API kan een stuk simpeler nu.
Ben heel benieuwd hoe het werkt, hoor zulke goede berichten erover!
Wel een paar keer een GraphQL endpoint aangeroepen (Facebook API & Office Flow (?)) maar nog nooit echt mee gewerkt.
Ja, inderdaad. Het gaat hier toch gewoon over Nederland? Zondag was er een warme dag maar daarna was het toch gewoon over?
Lekker op de bank
Was dat maar zo. Ik vond het tot gister bloedheet hier in Nederland/Twente.ZaZ schreef op donderdag 6 juni 2019 @ 10:54:
[...]
Ja, inderdaad. Het gaat hier toch gewoon over Nederland? Zondag was er een warme dag maar daarna was het toch gewoon over?
Vooral gister was zo'n benauwde dag (eigenlijk alles > 25 graden vind ik te warm)
Oh, hier in Alkmaar 18 of 19 graden ofzoRyur schreef op donderdag 6 juni 2019 @ 10:59:
[...]
Was dat maar zo. Ik vond het tot gister bloedheet hier in Nederland/Twente.
Vooral gister was zo'n benauwde dag (eigenlijk alles > 25 graden vind ik te warm)
Lekker op de bank
Wij zijn het ook aan het overwegen voor wat bestaande REST / SOAP APIs. Die zijn vooral gericht op redelijk flexibel zoeken en dan is REST niet ideaal. Je gaat toch wat gekunsteld zaken doen om het in een resource structuur te rammen.armageddon_2k1 schreef op donderdag 6 juni 2019 @ 10:02:
Ben nu bezig met GraphQL te testen. Best gaaf spul. Onze hele XML-based REST API kan een stuk simpeler nu.
SOAP is sowieso ellende.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Juist dat is het stuk waar ik vanaf wil. Dat werkt namelijk niet lekker met de dev middleware.RagingPenguin schreef op dinsdag 4 juni 2019 @ 19:48:
[...]
Als ik meerdere builds will hebben maak ik vaak 2 webpack config bestanden en geef aan het webpack command mee welke ik wil. Dan moet je nog wel iets doen om de juiste te selecteren.
Ben er nog op aan het puzzelen.
Je moet sowieso altijd heel goed oppassen met welke API dan ookGropah schreef op donderdag 6 juni 2019 @ 10:26:
[...]
Ik heb gehoord dat het vet is (maar snap niet helemaal waarom, ben wel benieuwd), maar heb ook gehoord dat je erg moet oppassen met de queries omdat die schijnbaar infinite recursion kunnen bevatten...
Infinite recursion zie ik niet meteen als een probleem, door gewoon je types goed te definieren.
Bijvoorbeeld, ik heb als definitie:
1
2
3
4
5
| type Entity { id: UUID, name: String, children: [Entity] } |
Dan zou je infinite recursion krijgen als de client z'n best doet. Maar ik los dat gewoon zo op:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| type Entity { id: UUID, name: String, children: [EntityRef] } type EntityRef { id: UUID, name: String } type Query { entity(id: UUID): Entity entities(ids: [UUID]): [Entity] } |
Dan kan de client in meerdere stappen de data ophalen, heel bewust. Onder water verwijzen EntityRef en Entity letterlijk naar dezelfde class, maar andere fields zijn beschikbaar.
In ons geval zijn we door de jaren heen van een single-user desktop app naar een multiuser webapp gegaan. De server draait nu de oude desktop code grotendeels in Kotlin welke serialized wordt als XML. Ons data model is echt een graph. Hele hiërarchieën, die ook nog eens horizontaal naar elkaar toe linken. Daarnaast genereren we ook nog eens SVG's aan de hand van de data in sommige gevallen.
Ons hele data-model is prima werkbaar vanuit Kotlin aangezien het typesafe is en je makkelijk door de objecten heen kan lopen.
Echter, de webapp is JS. We hebben dus meerdere endpoints die allemaal doorsnedes van de data in XML terugsturen. Door ons complexe datamodel krijg je dus hele complexe requests, met allemaal parameters die je aan en uit kan zetten om vooral niet teveel data terug te krijgen. Dit werkt helemaal door in de XML serialization. Onze projecten kunnen makkelijk 100MB aan ruwe XML worden, wat niet wenselijk is.
Dus, middels GraphQL kunnen we nu ons Kotlin data-model heel mooi mappen naar een nette type hierarchy in GraphQL, waardoor de client zo granulair mogelijk de data op kan halen. Daarnaast definieren we dus gewoon types als 'SVG':
1
2
3
4
5
6
7
8
9
10
11
12
| type Organogram { name: String! image: SVG! } type SVG { width: Float, height: Float, url: URL, contents: String, base64: ByteArray } |
ls een client dus een SVG oproept kan ie ervoor kiezen of ie de viewBox krijgt en de base64. Maar als ie de URL ophaalt is de gerenderde SVG tijdelijk beschikbaar onder een endpoint op de server en met contents krijgt de client puur de SVG-dom als string. Etc. Etc Etc
Erg leuk spul.
[ Voor 16% gewijzigd door armageddon_2k1 op 06-06-2019 12:13 ]
Engineering is like Tetris. Succes disappears and errors accumulate.
Zit nu midden in een pull request samen met een collega, wat al 2 maanden sleept.
Initieel krijg je gewoon geen antwoord en moet je nog eens extra gaan roepen of er iemand wil gaan kijken.
Vervolgens accepteren ze de pull-request niet omdat deze ook een aantal zaken aanpast die ze onder "chore-jobs" scharen. Maar ja; als je een stokoude pre-commit hook hebt die kapot is en commits blokkeert; wat dan? Die zul je toch moeten fixen om überhaupt een PR op te zetten, niet waar?
Na een hoop gezever alles er toch nog doorgefrut gekregen. (Creatief zijn met o.a. git reset en git push --force om enkel de wijzigingen aan die hook er after-the-fact weer af te slopen...)
Krijgt mijn collega vervolgens - weer weken later - commentaar dat deze PR 'bestaand gedrag aanpast' (uh nee... dat doet het niet) en dat het dingen stuk zou maken.
Wij: Wat dan?
Zij: Nou gewoon het maakt dingen stuk.
Wij: Ja, maar wat dan? De unit-tests zijn allemaal groen.
Zij: Ja; in de integratie-tests gaat er allemaal spul stuk.
Wij: Welke integratie-tests? Kun je die ergens laten zien? Of beschikbaar maken om te draaien?
Zij: Ja, nee, ja... uh... da's allemaal moeilijk op te zetten en niet voor gewone developers bedoeld.
Wij:
Echt. Het verbaasd me totaa-----l niets dat er aan die specifieke loader sinds 2017 niets meer gewijzigd is, als de aangewezen maintainer er zo mee omspringt.
Fucking hell zeg...
Webpack: Fantastische tool. Kut development team.
Denk dat we tegen betere etiquette in toch maar gewoon een fork aan gaan houden en een better-<foo>-loader package gaan maken.
[ Voor 5% gewijzigd door R4gnax op 06-06-2019 19:40 ]
Wel herkenbaar. Heb iets dergelijks aan 't handje gehad met Spring HATEOAS. Maintainer daarvan reageerde als een flinke eikel op eigenlijk alle communicatie dus uiteindelijk in overleg met de andere devs op dat project hebben we het eruit gesloopt en vervangen voor een simpele eigen library. Normaal probeer ik te voorkomen dat ik een wiel opnieuw uitvindt, maar soms is het nodig.
https://niels.nu
Heb tot nu toe alleen nog maar positieve ervaringen met het melden van issue's en PR's
[ Voor 13% gewijzigd door GrooV op 07-06-2019 08:46 ]
En uiteindelijk zegt dat ook niets.GrooV schreef op vrijdag 7 juni 2019 @ 08:43:
Sowieso altijd goed bij de keuze van een framework/library hoe (snel) issues op Github opgelost worden en wie de maintainers zijn. In het geval van Webpack heb je niet zo veel keuze kwa lib's maar als je die wel hebt is het goed om het mee te nemen.
Heb tot nu toe alleen nog maar positieve ervaringen met het melden van issue's en PR'sUiteindelijk doet iedereen ook gewoon z'n best en hebben maintainers van grote projecten het gewoon druk
Ik heb helaas soms heel diep in bepaalde materie gezeten en dan vind je soms bugs die van een bepaald niveau zijn dat eigenlijk niemand nog snapt wat er gebeurd. Dat was voor een heel goed maintained project met een grote (zelfs betaalde) core aan developers.
Ten eerste kan je het dan vergeten dat iemand zelf een fix maakt; want A: niemand snapt het en B: niemand boeit het.
En dan heb je zelf wat gemaakt maar dan blijft je PR daar open staan want A: niemand snapt het en B: niemand wilt zich er aan branden
Ik heb dit pas gefixed bij een soort community event in Duitsland waarbij ik domweg naar die core devs was gelopen, een stuk of 6 bij de lurven had gepakt en een PoC heb laten zien. Toen semi iemand "geforceerd" om mijn PR te approven
Het was super awkward en mijn eigen collega's lagen dubbel, maar na meer dan een half jaar had ik eindelijk mijn fix in de master zitten.

Engineering is like Tetris. Succes disappears and errors accumulate.
Het lastige is dat een test natuurlijk wel uitgaat van een waarde X aan de ene kant waar je op uit moet komen. Wat ik bedoel te zeggen is dat iemand links of rechtsom de logica moet snappen voor het resultaat. Of het nu uit een test komt of de code zelf.armageddon_2k1 schreef op maandag 10 juni 2019 @ 21:20:
Het hele idee dat 'niemand de fix snapt' verhelp je toch juist door een goede lading testcases te beschrijven die falen voor de fix en passen na de fix en alle andere unit/integration test die eventuele regressies in de gaten houden? Dan hoeft niemand zich eraan te branden... van een goed maintained project met een grote groep betaalde code devs zou je dat wel verwachten eigenlijk.....
* Matis is wel benieuwd naar de daadwerkelijke PR en/of code (wijzigen)Douweegbertje schreef op maandag 10 juni 2019 @ 21:58:
Het lastige is dat een test natuurlijk wel uitgaat van een waarde X aan de ene kant waar je op uit moet komen. Wat ik bedoel te zeggen is dat iemand links of rechtsom de logica moet snappen voor het resultaat. Of het nu uit een test komt of de code zelf.
If money talks then I'm a mime
If time is money then I'm out of time
Ik heb even gezocht maar kan het niet terug vinden. Dat was ook wel zeker 5 jaar geleden en het project staat inmiddels op github zonder al te veel historie.Matis schreef op dinsdag 11 juni 2019 @ 00:04:
[...]
* Matis is wel benieuwd naar de daadwerkelijke PR en/of code (wijzigen)
De case was iets frontend-like die gegenereerd werd vanuit een soort model. Als er in dat model een bepaalde setting/waarde aanwezig was en de gebruiker voerde een specifieke actie uit, dan kreeg je een duplicate entry.
De daadwerkelijke fix was het verwijderen van 1 line of code..
Mooi weer om de loonslaaf rustig binnen te houden toch ?alienfruit schreef op woensdag 12 juni 2019 @ 08:41:
Ik dacht het zomer wasWat een prutweer deze week zeg. Regen of ~16c
De zomer begint pas vrijdag 21 junialienfruit schreef op woensdag 12 juni 2019 @ 08:41:
Ik dacht het zomer wasWat een prutweer deze week zeg. Regen of ~16c
Goed voor de natoer jongen!alienfruit schreef op woensdag 12 juni 2019 @ 08:41:
Ik dacht het zomer wasWat een prutweer deze week zeg. Regen of ~16c
]|[ Apple Macbook Pro Retina 13" ]|[
1
2
3
| dbContext.Tabel.RemoveRange( dbContext.Tabel.Where(row => row.Year == year) ); |
Werd omgeschreven naar:
1
| DELETE FROM Tabel WHERE Year = @year |
Maar niet dus
*schrijft maar weer stored procedures*

We are shaping the future
Is dat serieus nog steeds zo? Ik gebruik Entity Framework al jaren niet meer, mede door dit soort dingen.Feanathiel schreef op donderdag 13 juni 2019 @ 20:51:
Ik maar denken dat het onderstaande (Entity Framework):
C#:
1 2 3 dbContext.Tabel.RemoveRange( dbContext.Tabel.Where(row => row.Year == year) );
Werd omgeschreven naar:
SQL:
1 DELETE FROM Tabel WHERE Year = @year
Maar niet dusSQL Profiler vol met losse delete statements.
*schrijft maar weer stored procedures*
De simpele queries zijn vaak geen probleem om te schrijven en de complexere queries heb ik niet vaak goed door een ORM/Framework geproduceerd zien worden als het gaat om performance. Nu heb ik daar ook geen jaren van ervaring in, dus wellicht mis ik het walhalla, maar ben nu wel benieuwd.
EF6 of EF Core?Feanathiel schreef op donderdag 13 juni 2019 @ 20:51:
Ik maar denken dat het onderstaande (Entity Framework):
C#:
1 2 3 dbContext.Tabel.RemoveRange( dbContext.Tabel.Where(row => row.Year == year) );
Werd omgeschreven naar:
SQL:
1 DELETE FROM Tabel WHERE Year = @year
Maar niet dusSQL Profiler vol met losse delete statements.
In EF Core zou RemoveRange() een single trip moeten zijn.
Misschien vanwege de LINQ Where die een Lazy statement meegeeft? Blinde gok hoor.Skyaero schreef op vrijdag 14 juni 2019 @ 10:09:
[...]
EF5 of EF6 (EF Core)?
In EF Core zou RemoveRange() een single trip moeten zijn.
Een hoop mensen pakken de "makkelijke" optie van een ORM. Zeker in ASP.NET MVC vanwege de integratie met authenticatie. Overigens zijn er inderdaad ook genoeg die dat niet doen. De Dapper-library is erg populair als middenweg die de controle geeft waar het nodig is.Gropah schreef op vrijdag 14 juni 2019 @ 10:00:
Is het dan zou ouderwets om zelf je queries te schrijven?
De simpele queries zijn vaak geen probleem om te schrijven en de complexere queries heb ik niet vaak goed door een ORM/Framework geproduceerd zien worden als het gaat om performance. Nu heb ik daar ook geen jaren van ervaring in, dus wellicht mis ik het walhalla, maar ben nu wel benieuwd.
* Matis heeft nu weer iets moois: De volgorde waarin unit tests worden gedraaid is afhankelijk van de uitkomst van de desbetreffend tests.
We maken (in PHP) een SoapClient aan. Wanneer deze een ongeldige wsdl krijgt, raakt het systeem / de unit tests zo over de zeik dat 1 specifieke volgende test niet goed gaat

Los draaien beide tests goed, ook de tussenliggende tests zijn prima, alleen die twee specifieke tests samen in deze volgorde laat het systeem stuk gaan...
Het resulteert dan in een
League\Csv\CannotInsertRecord : Unable to write record to the CSV document
[ Voor 10% gewijzigd door Matis op 14-06-2019 10:46 ]
If money talks then I'm a mime
If time is money then I'm out of time
Dat event is niet interessant, dat kan me gestolen worden. Wat interessant is, is dat het is verstuurd naar een emailadres dat ik puur en alleen gebruikt heb voor Fiddler. Lekker is dat. Dus dan browsen we even naar https://docs.telerik.com/fiddler/PersonalDataProtection
Leugens, dus.How personal data is used by Telerik Products
Progress Telerik Fiddler uses your account details, email address and a product usage data to better understand customer experience allowing us to focus development efforts on the products and features that matter most to our customers. Additionally, this information may be used by Marketing and / or Sales to ensure you receive relevant content updates, product news and materials to ensure your success with our products. Please see our Privacy Policy for more details.
This information is for our own purposes and do not sell or otherwise provide this information to any third-parties for a commercial purpose.
.edit: oh toch niet. Het event is van Progress zelf, en dat is blijkbaar tegenwoordig ook de eigenaar van Fiddler.

[ Voor 5% gewijzigd door .oisyn op 14-06-2019 10:51 ]
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.
Melding maken van hack/datalek.oisyn schreef op vrijdag 14 juni 2019 @ 10:49:
Interessant. Iemand ook een e-mail gehad over "20 Juni | Breda | Accelerating Enterprise, Web & Mobile Development Event"?
Dat event is niet interessant, dat kan me gestolen worden. Wat interessant is, is dat het is verstuurd naar een emailadres dat ik puur en alleen gebruikt heb voor Fiddler. Lekker is dat. Dus dan browsen we even naar https://docs.telerik.com/fiddler/PersonalDataProtection
[...]
Leugens, dus.
edit nav oisyn edit: het kan heel leuk onderdeel zijn van een reeks aan bedrijven, maar het bedrijf is eigenaar van de gegevens. Een zusterbedrijf mag dat niet zo maar gebruiken volgens mij.
[ Voor 14% gewijzigd door Gropah op 14-06-2019 10:53 ]
Ik weet het niet, maar misschien is het een dochterbedrijf? En dan kan ik me wel voorstellen dat het magGropah schreef op vrijdag 14 juni 2019 @ 10:52:
[...]
Melding maken van hack/datalek
edit nav oisyn edit: het kan heel leuk onderdeel zijn van een reeks aan bedrijven, maar het bedrijf is eigenaar van de gegevens. Een zusterbedrijf mag dat niet zo maar gebruiken volgens mij.
De wet van Murphy: Alles wat fout kan gaan zal fout gaan.
Fiddler is van Progress, Progress organiseert het event. Ik zie nergens verschillende bedrijven.Gropah schreef op vrijdag 14 juni 2019 @ 10:52:
edit nav oisyn edit: het kan heel leuk onderdeel zijn van een reeks aan bedrijven, maar het bedrijf is eigenaar van de gegevens. Een zusterbedrijf mag dat niet zo maar gebruiken volgens mij.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Lawrence heeft dat geaccepteerd en Fiddler werd eigendom van Telerik. In 2014 nam Progress Telerik over. Lawrence zelf is inmiddels weer teruggekeerd naar Microsoft.
We are shaping the future
EF6 inderdaad.
M'nee, queries schud ik zo uit mijn mouw, dat is het probleem niet. Zelf vind ik het wel lekker werken wanneer types uitgegenereerd worden. Zo hebben wij ook een tool die voor ons types uitgenereerd net zoals WCF dat doet, maar dan voor TypeScript (op basis van een interface in C# een request/response structuur genereren in TS). Uiteraard zijn er ondertussen ook wel tools beschikbaar die dat ook kunnen, echter was dat niet zo aan het begin van het TypeScript-tijdperk. Werkt wel goed, één keer een definitie schrijven, en daarna gewoon delen tussen de talen. Zo dus ook bij SQL (Server) en C#. Het grootste deel van code kloppen is toch het om-mappen van data of het tonen ervan.Gropah schreef op vrijdag 14 juni 2019 @ 10:00:
Is het dan zou ouderwets om zelf je queries te schrijven?
[...]
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Ik vind "al die ORM-ellende" niet zo'n ellende anders hoor. Maar hoe vermijdtje het dan?Mugwump schreef op vrijdag 14 juni 2019 @ 20:31:
Ben blij dat ik op het moment al die ORM-ellende kan vermijden.
Door simpelweg de de R uit je systemen te halen.sig69 schreef op zaterdag 15 juni 2019 @ 01:51:
[...]
Ik vind "al die ORM-ellende" niet zo'n ellende anders hoor. Maar hoe vermijdtje het dan?
Het is niet altijd aan te raden, maar als het kan scheelt het wel een hoop gedoe.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Mijn 2 cent: Ik gebruik zelf liever iets als JOOQ of anders gewoon Spring Data JDBC waarbij je gewoon SQL schrijft. ORMs voegen naar mijn mening heel weinig toe. Ze nemen je een klein beetje werk uit handen, maar je krijgt er vaak een zooi lastig te debuggen complexiteit voor terug. Als ik iedere keer moet gaan kijken wat voor'n SQL queries Hibernate verzint, kan ik 't net zo goed zelf doen.sig69 schreef op zaterdag 15 juni 2019 @ 01:51:
[...]
Ik vind "al die ORM-ellende" niet zo'n ellende anders hoor. Maar hoe vermijdtje het dan?
Helaas hebben veel Java developers de houding dat als ze met Hibernate werken niet meer naar de uiteindelijke queries hoeven te kijken. En dan heb je dus in no time het N+1 probleem.
https://niels.nu
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra

Gevolg; een deel van de website functioneerde niet meer zoals gewenst
Euhm, wat heb je dan gedaan? Gewoon een paar uur zitten typen ervanuitgaande dat alles dat je doet foutloos is?BladeSlayer1000 schreef op zondag 16 juni 2019 @ 17:29:
Vandaag eens een deel van mijn code herschreven, maar er niet bij stil gestaan om het tussendoor te testen![]()
Gevolg; een deel van de website functioneerde niet meer zoals gewenst
Engineering is like Tetris. Succes disappears and errors accumulate.
BladeSlayer1000 schreef op zondag 16 juni 2019 @ 17:29:
Vandaag eens een deel van mijn code herschreven, maar er niet bij stil gestaan om het tussendoor te testen![]()
Gevolg; een deel van de website functioneerde niet meer zoals gewenst

"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Ik zat een film te kijken en tergelijk code te herschrijven, waardoor ik niet in de gaten had hoeveel tijd vergaan was en hoeveel ik al had veranderdarmageddon_2k1 schreef op zondag 16 juni 2019 @ 17:43:
[...]
Euhm, wat heb je dan gedaan? Gewoon een paar uur zitten typen ervanuitgaande dat alles dat je doet foutloos is?

Gelukkig niet in productie
[ Voor 24% gewijzigd door BladeSlayer1000 op 16-06-2019 17:56 ]
Daarom bij refactoren altijd zorgen dat de randen automatisch worden afgetest, zodat je ongestraft de binnenkant kunt herschrijven.BladeSlayer1000 schreef op zondag 16 juni 2019 @ 17:55:
[...]
Ik zat een film te kijken en tergelijk code te herschrijven, waardoor ik niet in de gaten had hoeveel tijd vergaan was en hoeveel ik al had veranderd
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Dat je dat kan 2 dingen tegelijkBladeSlayer1000 schreef op zondag 16 juni 2019 @ 17:55:
[...]
Ik zat een film te kijken en tergelijk code te herschrijven, waardoor ik niet in de gaten had hoeveel tijd vergaan was en hoeveel ik al had veranderd

Als ik dat doe mis ik of de film of ik kan alle code dat ik die avond heb geschreven weggooien!
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Is dat een mannetje-vrouwtje-nicht-typje met erg glimmende tanden?gekkie schreef op zondag 16 juni 2019 @ 20:57:
hmm zitten er daarom zoveel transgender-fluoride types in de IT ... dat ze denken dat zich vrouw noemen ze in ineens helpt bij het wel kunnen multi-tasken ?
Zonder gaatjesBoudewijn schreef op zondag 16 juni 2019 @ 22:44:
[...]
Is dat een mannetje-vrouwtje-nicht-typje met erg glimmende tanden?
(Met praatjes)
[ Voor 6% gewijzigd door gekkie op 16-06-2019 22:49 ]
Dat vrouwen beter zijn in multi-tasken dan mannen is natuurlijk een leugen. Wij "mannen" verwachten gewoon dat vrouwen twee keer zo veel doen als wij mannen. Daarom hebben we die leugen de wereld in geholpen.gekkie schreef op zondag 16 juni 2019 @ 20:57:
hmm zitten er daarom zoveel transgender-fluoride types in de IT ... dat ze denken dat zich vrouw noemen ze in ineens helpt bij het wel kunnen multi-tasken ?
Gezien mijn bovenstaande opmerking als kwetsend ervaren kan worden...
Ik denk/hoop dat er binnen de IT zoveel ruimte is voor alle soorten mensen is omdat wij individuen meer beoordelen op hun vaardigheden en resultaten dan op hun gedrag. Hierdoor krijgen individuen meer ruimte om zichzelf te zijn en kunnen ze zich ook makkelijker als persoon ontwikkelen.
En laten we eerlijk zijn: Hoewel onze sector op dit moment voornamelijk bestaat uit mannen hebben wij ontzettend veel te danken gehad aan individuen die niet in de "klassieke" man/vrouw rol vallen.
Alan Turing, Sophie Wilson, Mary Ann Horton en vele andere hebben aan de krib gestaan van onze sector en zijn uitzonderlijke individuen met een ongebruikelijke achtergrond.
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
Trappen ze er toch allemaal mooi inDevWouter schreef op zondag 16 juni 2019 @ 22:49:
[...]
Dat vrouwen beter zijn in multi-tasken dan mannen is natuurlijk een leugen. Wij "mannen" verwachten gewoon dat vrouwen twee keer zo veel doen als wij mannen. Daarom hebben we die leugen de wereld in geholpen.
Niet om jou aan te vallen maar mijn ervaring is dat men ORM ellende vindt op het moment dat ze de meest bizare meuk uitvoeren omdat of A ) de dateset krom is of B ) de applicatie krom is.Mugwump schreef op vrijdag 14 juni 2019 @ 20:31:
Ben blij dat ik op het moment al die ORM-ellende kan vermijden.
Vandaar misschien ook jOOQ, ze zeggen niet voor niets: Je database eerst, of dat voor een nieuwe applicatie of legacy is
[ Voor 25% gewijzigd door Douweegbertje op 17-06-2019 06:23 ]
In zekere zin klopt het wel. Vrouwen doen veel dingen tegelijk, maar hebben daardoor minder focus per taak
In mijn geval meer omdat ik bijvoorbeeld met optimalisatie van complexe queries zit en dan zit ORM vaak eerder in de weg dan dat het helpt. Zoals ik in mijn vervolgpost aangaf is ORM best handig als je veelal complexe writes doet, maar daar zijn ook andere oplossingen denkbaar. Uiteindelijk is het probleem ook vaak inderdaad dat je een systeem hebt waarbij je bijvoorbeeld zowel complexe (real-time) writes als complexe reads op één datamodel probeert te doen. Dat vinden de meeste RDBMsen niet zo heel leuk.Douweegbertje schreef op maandag 17 juni 2019 @ 06:21:
[...]
Niet om jou aan te vallen maar mijn ervaring is dat men ORM ellende vindt op het moment dat ze de meest bizare meuk uitvoeren omdat of A ) de dateset krom is of B ) de applicatie krom is.
Vandaar misschien ook jOOQ, ze zeggen niet voor niets: Je database eerst, of dat voor een nieuwe applicatie of legacy isM.a.w. : Hoe krom je database ook is, het werkt. Mooi principe natuurlijk maar soms verhult het ook juist je echte probleem.
Daarom zit ik nu ook in een project om een complete rebuild / cloudmigratie te doen waarbij we ook veel meer gebruik maken van gescheiden schrijf- en leesmodellen ook in verschillende vormen van opslagtechnologie, of dat nou SQL, NoSQL, search engine, in-memory cache of wat dan ook is zolang het maar het juiste gereedschap voor de klus is.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Echt parellalisme is het toch niet ?ThomasG schreef op maandag 17 juni 2019 @ 09:35:
[...]
In zekere zin klopt het wel. Vrouwen doen veel dingen tegelijk, maar hebben daardoor minder focus per taakDat is ook deels de reden waarom vrouwen vooral voor socialere beroepen kiezen, en mannen gemiddeld genomen beter zijn op technisch vlak. En het een is niet per definitie beter dan het ander. Anders we het met computers vergelijken zijn mannen een CPU en vrouwen meer een GPU.
Is het niet meer Async met callbacks dan ?
Zolang het I/O waiting is dan winnen ze er wat mee, maar als het diehard number chrunching is niet en kan het een negatieve impact hebben ?
Daarnaast is het door de callback nesting volstrekt onmogelijk om er nog iets van te begrijpen laat staan er een handleiding van te maken
Moet nu wel oppassen, straks heb ik weer een bias, krijg ik er net als de TNO meneer dit weekend problemen mee
Ik bedoelde meer dat vrouwen hun focus beter kunnen verdelen over meerdere dingen tegelijk. Een gemiddelde man heeft daar meer moeite mee. Mannen zijn daarentegen gemiddeld wel beter in het gebruiken van al hun focus op een onderwerp.gekkie schreef op maandag 17 juni 2019 @ 09:49:
[...]
Echt parellalisme is het toch niet ?
Is het niet meer Async met callbacks dan ?
Zolang het I/O waiting is dan winnen ze er wat mee, maar als het diehard number chrunching is niet en kan het een negatieve impact hebben ?
Daarnaast is het door de callback nesting volstrekt onmogelijk om er nog iets van te begrijpen laat staan er een handleiding van te maken.
Moet nu wel oppassen, straks heb ik weer een bias, krijg ik er net als de TNO meneer dit weekend problemen mee
En dan zijn er vast mensen die zeggen dat dát seksisme e.d. is, maar dat is om evolutionaire redenen nu eenmaal zo (uitzonderingen daargelaten). Een gevolg daarvan is dat mannen en vrouwen in andere gebieden uitblinken. En het een is dus niet perse beter dan het ander.
Da's een heel slecht voorbeeld. Een GPU doet eigenlijk helemaal niet zoveel verschillende dingen tegelijk. Hij doet heel veel dezelfde dingen tegelijkThomasG schreef op maandag 17 juni 2019 @ 09:35:
[...]
Anders we het met computers vergelijken zijn mannen een CPU en vrouwen meer een GPU.
[ Voor 16% gewijzigd door .oisyn op 17-06-2019 11:54 ]
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.
Complexe objectstructuren opslaan is een van de dingen waar een ORM relatief goed in is. Maar in mijn ervaring zie je die usecase veel minder dan projecties op je data. En daar gaan ORMs vaak de mist in.Mugwump schreef op zaterdag 15 juni 2019 @ 18:20:
JOOQ werkt wel mooi ja, al zie ik wel een verschil in use cases tussen JOOQ en ORMs. JOOQ is heel geschikt voor complexe reads / read heavy loads. Als je veel / complexe writes doet, dan is een ORM wellicht geschikter. Aan de andere kant kun je je ook afvragen of je dan wel naar een relationeel model moet gaan wegschrijven of toch beter voor iets als een document store moet gaan.
ORMs zijn wat mij betreft een beetje gebaseerd op het idee van een enkel 'model' in memory dat van en naar een relationeel model gemapt moet worden. En da's in de huidige wereld van REST (micro) services meestal niet erg accuraat. Heb danook in de laatste 10 ofzo jaar niet of nauwelijks met ORMs gewerkt, en ik mis ze ook niet.
Of je bent gewoon zo ver in ervaring met verschillende manier van zaken aanpakken dat doorhebt dat ORMs een abstractielaag leggen op je data, die zowel voor als nadelen heeft, zonder te moeten doen alsof mensen die er anders over denken slechte programmeurs zijn.Douweegbertje schreef op maandag 17 juni 2019 @ 06:21:
Niet om jou aan te vallen maar mijn ervaring is dat men ORM ellende vindt op het moment dat ze de meest bizare meuk uitvoeren omdat of A ) de dateset krom is of B ) de applicatie krom is.
Niet alleen dat. Juist als je netjes, volgens de regels, je data modelleert heb je al snel te maken met compound keys. Die zijn al vrij lastig te modelleren in je code, je hebt dan meestal een aparte key class per compound key nodig. Dat in je code 'netjes' aan elkaar hangen levert je al snel een flinke annotation hell op. Da's dan nog voordat je uberhaupt gaat testen wat je ORM er van maakt onderwater; je bent dan misschien geen SQL aan het schrijven, je bent wel een hoop code aan het schrijven in plaats van SQL, waarna je ook nog eens moet gaan kijken wat de ORM er van bakt kwa SQL. Als dat niet klopt kun je vaak alsnog direct de SQL schrijven, of de code aanpassen op de SQL.Mugwump schreef op maandag 17 juni 2019 @ 09:44:
In mijn geval meer omdat ik bijvoorbeeld met optimalisatie van complexe queries zit en dan zit ORM vaak eerder in de weg dan dat het helpt.
Dit terwijl SQL ongeveer de meest expressieve taal is die je maar kunt bedenken: het is een declarative taal, dus je vertelt de server alleen maar wat je wil. In plaats van in code waarin je moet vertellen dat de machine allemaal moet doen.
Het enige wat die ORMs dus nog voor je oplossen is het mappen van de resultaten naar objecten. Daar heb je prima light-weight rowmappers voor. Dan heb je niet de problemen van de abstractielaag, want je schrijft direct SQL, maar wel het voordeel dat de software de kolommen rechtstreeks in de juiste velden van je objecten propt.
Maarja. Ik zal wel een slechte programmeur zijn...
Of we blijven gewoon weg van het hangen van dit soort eigenschappen aan een sekse. Nog makkelijker en neigt een stuk minder naar seksismeThomasG schreef op maandag 17 juni 2019 @ 09:35:
Anders we het met computers vergelijken zijn mannen een CPU en vrouwen meer een GPU.
[ Voor 59% gewijzigd door Hydra op 17-06-2019 15:02 ]
https://niels.nu
Ben zelf een beetje met Rust begonnen. Maar ik weet het nog niet.... vind het hele struct, trait en enum type systeem super, maar die borrow checker... man. Nou is het wel zo dat ik totaaaal 0.0 ervaring heb met C++ en echte low-level talen dus die mindset is er helemaal niet. Alleen maar wat C gedaan voor een projectje bij Philips ooit, embedded. Ik snap de voordelen van die borrower en moves etc wel, kwa mem-management. Maar nondeju, soms wring ik me wel in bochten zeg en dan heb ik niet echt het idee dat de tooling de ontwikkeling ondersteunt. Het lijkt er eerder op dat de tooling me forceert op een bepaalde manier te werken.
Maar nogmaals, ben wel een dikke n00b op dit gebied.
[ Voor 179% gewijzigd door armageddon_2k1 op 17-06-2019 18:24 . Reden: Beetje flauw misschien... ;) ]
Engineering is like Tetris. Succes disappears and errors accumulate.
Ik weet niet of je nu bewust verzint wat ik heb gezegd maar dat laatste is verre van wat ik zei.Hydra schreef op maandag 17 juni 2019 @ 14:53:
[...]
Of je bent gewoon zo ver in ervaring met verschillende manier van zaken aanpakken dat doorhebt dat ORMs een abstractielaag leggen op je data, die zowel voor als nadelen heeft, zonder te moeten doen alsof mensen die er anders over denken slechte programmeurs zijn.
Nogmaals: mijn ervaring, is dat mensen die er over zeuren, juist op zoveel andere vlakken het verpesten waardoor je maar ORM de schuld geeft "want het kan X niet". Het motto van jOOQ word inherent ook zo misbruikt. Zoals ik zei; "het maakt niet uit hoe krom het is, het werkt" - wat eigenlijk hetzelfde is als PHP met loosely typed, maar nu gaan we opeens wel in de verdediging hoe goed het is om structuur te vergeten
Want naar mijn inziens is ORM maar net een middel waar je niet op hoeft te zeuren aangezien het compleet logisch is om basis meuk via je ORM te doen en je special shit buiten ORM om voor de bulks, custom optimalisaties, etc.
Waar je mij wel op mag quoten als het gaat om "slechte programmeurs"; de gene die ontiegelijk lopen te ranten en te bitchen over prima technieken, omdat ze helemaal misbruikt worden. Overigens niet dat het hier in de devschuur daar nou over ging
Homo's zijn gewoon mannen hoor.DevWouter schreef op zondag 16 juni 2019 @ 22:49:
[...]
En laten we eerlijk zijn: Hoewel onze sector op dit moment voornamelijk bestaat uit mannen hebben wij ontzettend veel te danken gehad aan individuen die niet in de "klassieke" man/vrouw rol vallen.
Alan Turing
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Sorry dat ik het zeg hoor, maar is het echt nodig om na een flauw grapje van 3 zinnen een hele disclaimer van meerdere alinea's neer te zetten met een opsomming van achievements van "kwetsbare groepen" om maar niemand tegen het hoofd te stoten? Zijn we echt zo gevoelig geworden met z'n allen? Mijn inziens maak je het alleen maar erger.DevWouter schreef op zondag 16 juni 2019 @ 22:49:
[...]
Gezien mijn bovenstaande opmerking als kwetsend ervaren kan worden...
... Knip...
Je hebt gelijk met het feit dat de technologische staat van nu toe te schrijven is aan elke afkomst, gender, geloof en kleur, maar waarom schrijf je daar alleen maar over nadat je een grap hebt gemaakt? Volgens mij betwist echt niemand de geschiedenis hieromtrent en helemaal binnen dit topic en als iemand zich gekwetst voelt door jouw grapje dan zal die disclaimer echt helemaal niks uitmaken. Je hebt de grap immers al gemaakt. Als je mensen niet wil kwetsen moet je geen grappen maken waarvan *jij denkt* dat die mensen zouden kunnen kwetsen.
[ Voor 15% gewijzigd door armageddon_2k1 op 17-06-2019 21:21 ]
Engineering is like Tetris. Succes disappears and errors accumulate.

Vond het al wat wazig dat er een 5.1.11 uit kwam met alleen maar een paar netwerk patches, maar dit verklaard het wel aardig
[ Voor 21% gewijzigd door gekkie op 17-06-2019 22:54 ]
Ik ben niet een hele dikke n00b op dit gebied, maar ik heb precies hetzelfdearmageddon_2k1 schreef op maandag 17 juni 2019 @ 17:46:
...knip...
Ben zelf een beetje met Rust begonnen. Maar ik weet het nog niet.... vind het hele struct, trait en enum type systeem super, maar die borrow checker... man.
Maar nogmaals, ben wel een dikke n00b op dit gebied.
Later weer verder met Rust, nu eerst productief zijn...
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Je zegt letterlijk dat, in jouw ervaring, de programmeurs die klagen altijd die mensen zijn die er zelf een potje van gemaakt hebben. Misschien is het niet je bedoeling te stellen dat mensen die klagen over ORMs slechte devs zijn, maar zo komt het, in ieder geval op mij, wel over.Douweegbertje schreef op maandag 17 juni 2019 @ 19:19:
Ik weet niet of je nu bewust verzint wat ik heb gezegd maar dat laatste is verre van wat ik zei.
Jij stelt dat ORMs prima technieken zijn. Prima. Mag je vinden. Ik vind dat absoluut niet. In ons dagelijks werk passen we een hoop verschillende abstracties toe. Heck; zonder abstracties waren we allemaal letterlijk machine code aan het produceren. Maar elke transactie komt ook met een 'cost', dus het is altijd een afweging. In het geval van ORMs is er een hele grote hidden cost die vaak niet meegenomen wordt (N+1 en andere lastige te debuggen problemen) terwijl de benefit vrij minimaal is.
Als ik dat dan netjes probeer te beredeneren en er komt daarna iemand met een "Nou hurr durr alle developers die ik ken die klagen over ORMs zijn echt fucking slecht joh!" dan wordt ik daar wel enigzins chagerijning van.
No hard feelings verder, kan wel wat hebben hoor
Heb hetzelfde. Ben afgelopen jaar voor Advent of Code begonnen met Rust, maar al vrij snel naar Kotlin overgestapt omdat ik gewoon niks gedaan kreeg. Ben er nog steeds niet uit of ik nu te dom ben of dat Rust zo lastig in 't gebruik ik. Beetje van beiden vermoed ik. Ik hoor zelf van Rust-fans dat bijvoorbeeld een Game in Rust schrijven masochistisch is...armageddon_2k1 schreef op maandag 17 juni 2019 @ 17:46:
...knip...
Ben zelf een beetje met Rust begonnen. Maar ik weet het nog niet.... vind het hele struct, trait en enum type systeem super, maar die borrow checker... man. Nou is het wel zo dat ik totaaaal 0.0 ervaring heb met C++ en echte low-level talen dus die mindset is er helemaal niet. Alleen maar wat C gedaan voor een projectje bij Philips ooit, embedded. Ik snap de voordelen van die borrower en moves etc wel, kwa mem-management. Maar nondeju, soms wring ik me wel in bochten zeg en dan heb ik niet echt het idee dat de tooling de ontwikkeling ondersteunt. Het lijkt er eerder op dat de tooling me forceert op een bepaalde manier te werken.
Maar nogmaals, ben wel een dikke n00b op dit gebied.
Denk erover het dit jaar in C++ te doen, gewoon back naar de roots. En dan in plaats van een focus op 'mooie' FP code, code die gewoon zo snel mogelijk is. Hoop wel dat komend jaar de opdrachten leuker zijn, op een gegeven moment was het vooral een complexe set instructies die gevolgd moest worden i.p.v. zelf een oplossing uitvogelen.
[ Voor 37% gewijzigd door Hydra op 18-06-2019 08:39 ]
https://niels.nu
Als je het hebt over "letterlijk", quote mij dan gewoon en probeer niet steeds iets toe te voegen aan mijn mening als ik dat niet "letterlijk" zo heb gezegd. Want nu doe je het exact weer net zoals je vorig bericht waar je een stukje van iemand pakt, je eigen negatieve mening er aan vast plakt en dan semi gestrekt erin terug reageert.Hydra schreef op dinsdag 18 juni 2019 @ 08:35:
[...]
Je zegt letterlijk dat, in jouw ervaring, de programmeurs die klagen altijd die mensen zijn die er zelf een potje van gemaakt hebben.
[...]
Wat klopt hier nou niet aan. Dit is toch puur de definitie waarop ORM niet ok is. Als je dataset niet goed is of dat bizare meuk uitvoert. Want anders is ORM prima voor zijn doel (bijv. simpele CRUD). Opnieuw met aannames wat iemand bedoelt die je op jezelf reflecteert. Ik heb helemaal niet letterlijk gezegd dat ze er zelf een potje van hebben gemaakt.Douweegbertje schreef op maandag 17 juni 2019 @ 06:21:
[...]
Niet om jou aan te vallen maar mijn ervaring is dat men ORM ellende vindt op het moment dat ze de meest bizare meuk uitvoeren omdat of A ) de dateset krom is of B ) de applicatie krom is.
Volwassen."Nou hurr durr alle developers die ik ken die klagen over ORMs zijn echt fucking slecht joh!"
Nou, laten we dan even agree to disagree. Zolang je steeds een stukje van iemand pakt en totaal niet snapt wat iemand bedoelt te zeggen en dat verdraait, maak je het jezelf wel erg moeilijk.No hard feelings verder, kan wel wat hebben 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!
Mijn bezwaar tegen ORM is ook helemaal niet zozeer dat het principe van ORM of specifieke ORM frameworks per definitie slecht zou moeten zijn, maar juist dat 'one size fits all' relationele opslag een slecht idee is en dit vaak ook de consequentie is van ORM frameworks.Douweegbertje schreef op dinsdag 18 juni 2019 @ 09:20:
Wat klopt hier nou niet aan. Dit is toch puur de definitie waarop ORM niet ok is. Als je dataset niet goed is of dat bizare meuk uitvoert. Want anders is ORM prima voor zijn doel (bijv. simpele CRUD). Opnieuw met aannames wat iemand bedoelt die je op jezelf reflecteert. Ik heb helemaal niet letterlijk gezegd dat ze er zelf een potje van hebben gemaakt.
Hanteer je bijvoorbeeld een eventsourced architectuur, dan moet je je met ORM ook in allerlei bochten wringen omdat de daadwerkelijke state van je aggregates transient is en je transactionele bulkopslag van events wilt hebben.
Je geeft zelf al aan dat ORM prima use cases kennen zoals simpele CRUD. In dat soort gevallen moet je ook lekker een ORM framework gebruiken.
Er zit echter een verschil tussen 'er zijn prima use cases voor een ORM' en 'als ORM niet voor je werkt, dan is je applicatie of je datamodel krom'. Bovendien kun je voor simpele CRUD ook gewoon een Postgres databaseje gebruiken met een key veld en een content veld met type JSON (of iets als Mongo) en weg is de O-R impedence mismatch.
Je kunt dan natuurlijk geen complexe read queries gaan draaien op je model, maar dat is nou juist ook vaak waar het misgaat bij ORM gebruik en architectuur in het algemeen.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Firesphere schreef op dinsdag 18 juni 2019 @ 09:36:
rant
Members only:
Alleen zichtbaar voor ingelogde gebruikers. Inloggen
/rant
Read the code, write the code, be the code!
wackmaniac schreef op dinsdag 18 juni 2019 @ 09:54:
[...]
Members only:
Alleen zichtbaar voor ingelogde gebruikers. Inloggen
[ Voor 7% gewijzigd door Firesphere op 18-06-2019 09:57 ]
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!
Meestal betekent dit dat je mogelijk problematische blokken omsluit met een lock / unlock. Dus lock - logica - unlock.
Is het nu zo dat je vrij simpel die locks kan vervangen door de STM __transaction_atomic blokken? Of denk ik nu te makkelijk?
Ik richt me hier specifiek even op de normale lock / unlock en niet op de signals, trylock toepassingen. Daarvan kan ik me voorstellen dat STM geen oplossing biedt.
Sinds de 2 dagen regel reageer ik hier niet meer
Je zegt hier toch echt dat het de schuld van de developer is. De applicatie is 'krom' of de dataset is 'krom'? Beiden zijn de verantwoordelijkheid van de developer.Douweegbertje schreef op dinsdag 18 juni 2019 @ 09:20:
Wat klopt hier nou niet aan. Dit is toch puur de definitie waarop ORM niet ok is. Als je dataset niet goed is of dat bizare meuk uitvoert. Want anders is ORM prima voor zijn doel (bijv. simpele CRUD). Opnieuw met aannames wat iemand bedoelt die je op jezelf reflecteert. Ik heb helemaal niet letterlijk gezegd dat ze er zelf een potje van hebben gemaakt.
Ik ben het daar dus compleet mee oneens. Het N+1 probleem kan op de meest onverwachte momenten optreden dus je moet vrijwel altijd in de gaten houden wat je ORM er van bakt. Erger nog; je moet dat iedere keer bij een upgrade doen; een andere Hibernate versie kan prima het gedrag opeens veranderen. En dan heb je nog het probleem dat juist als je database-first werkt je vaak met compound keys komt te zitten waarmee het via een ORM, omdat alles naar objecten gemapped moet worden, behoorlijk omslachtig werken is.
Ook ben ik het niet met je eens dat een ORM een goeie match is voor simpele CRUD. Juist daar kun je prima uit de voeten met een simpele rowmapper library, of JOOQ ofzo. Het theoretische 'best fit' model voor een ORM is juist het laden / saven van complexe objectstructuren. In theorie kan het je juist daar enorm veel tijd schelen. En in de praktijk gaat het nu dus juist daar vaak mis.
Dan stellen dat de dataset vast 'krom' is of anders de applicatie 'krom' moet zijn, vind ik gewoon lomp. Ik heb hier jarenlang ervaring mee en vaak dit soort shit moeten fixen.
Ik vond je reactie nogal extreem ongenuanceerd en nogal denigrerend overkomen. Daarnaast zitten ORM aanhangers al snel in m'n allergie-zone met dat soort dooddoeners. Vandaar m'n ongenuanceerde reactie terug
https://niels.nu
Firesphere schreef op dinsdag 18 juni 2019 @ 09:36:
rant
Members only:
Alleen zichtbaar voor ingelogde gebruikers. Inloggen
/rant
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
STM is optimistic. Er kunnen dus meerdere threads tegelijkertijd in de __transaction_atomic blokken bezig zijn. Aan het einde kijkt het of er een race condition is, en zo ja dan worden een of meerdere transacties opnieuw gedaan. Als race conditions zeldzaam zijn heeft STM een voordeel. Is er een grote kans op race conditions dan heeft het geen en/of minder nut en kan het zelfs langzamer zijn. En natuurlijk heel erg oppassen bij IO.CurlyMo schreef op dinsdag 18 juni 2019 @ 10:13:
Vandaag las ik voor het eerst over STM (Software Transactional Memory) in C. Nu gebruik ik in mijn multi-threaded applicatie vooral mutex locks om multi-threaded problemen te voorkomen of compare-and-swap.
Meestal betekent dit dat je mogelijk problematische blokken omsluit met een lock / unlock. Dus lock - logica - unlock.
Is het nu zo dat je vrij simpel die locks kan vervangen door de STM __transaction_atomic blokken? Of denk ik nu te makkelijk?
Ik richt me hier specifiek even op de normale lock / unlock en niet op de signals, trylock toepassingen. Daarvan kan ik me voorstellen dat STM geen oplossing biedt.
De valkuilen bij IO begreep ik. Wat ik verder las is dat bij bijv. het updated van een linked list een STM slim genoeg is om daadwerkelijk alleen een lock te leggen op de nodes die worden bijgewerkt, waarbij je als luie programmeur gewoon de hele list zou locken. Dat zou het thread-safe bijwerken van globale data-structuren veel makkelijker maken.ThomasG schreef op dinsdag 18 juni 2019 @ 11:17:
[...]
STM is optimistic. Er kunnen dus meerdere threads tegelijkertijd in de __transaction_atomic blokken bezig zijn. Aan het einde kijkt het of er een race condition is, en zo ja dan worden een of meerdere transacties opnieuw gedaan. Als race conditions zeldzaam zijn heeft STM een voordeel. Is er een grote kans op race conditions dan heeft het geen en/of minder nut en kan het zelfs langzamer zijn. En natuurlijk heel erg oppassen bij IO.
Moet ik de vertraging en herhaling als gevolg van zo'n race-condition voorstellen als een busy-wait i.p.v. een interrupt of een sem_wait?
Klopt het dan verder dat veel van die standaard lock - logica - unlock blokken dus vervangen kunnen worden door zo'n __transaction_atomic?
Ik zit nog wel even hardop na te denken over wat je zegt over STM is optimistic. Is het verschil met STM t.o.v. mutex-locks, dat STM een FIFO uitvoer garandeert waarbij bij een mutex-lock alleen van de eerste thread die een code block raakt gegarandeerd die mag uitvoeren, maar elke volgende thread in willekeurige volgorde toegang krijgen tot een code block zodra de lock wordt opgeheven?
Sinds de 2 dagen regel reageer ik hier niet meer
Het omgekeerde gebeurt gelukkig ookHydra schreef op dinsdag 18 juni 2019 @ 10:18:
[...]
Ik ben het daar dus compleet mee oneens. Het N+1 probleem kan op de meest onverwachte momenten optreden dus je moet vrijwel altijd in de gaten houden wat je ORM er van bakt. Erger nog; je moet dat iedere keer bij een upgrade doen; een andere Hibernate versie kan prima het gedrag opeens veranderen.
Ik had (jaren geleden) een LINQ-query die Entity Framework omsmurfte in een SQL-statement dat dermate complex was dat SQL Server zich erin verslikte. Toen ik eens in de package manager keek zag ik dat er een minor update was voor EF. In de changelogs kon ik eigenlijk niks noemenswaardigs vinden over veranderingen aan de query interpreter.
Na het installeren van de update werd er echter een heel andere SQL-query gegenereerd, en daar had SQL Server geen moeite meer mee.
We are shaping the future
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
De eiken buiten 't gebouw hier zitten vol met eikenprocessierups-clusters. Telt dat ook?
[ Voor 51% gewijzigd door Hydra op 18-06-2019 15:50 ]
https://niels.nu
Even advocaat van de duivel / knuppel in het hoenderhokHydra schreef op dinsdag 18 juni 2019 @ 15:49:
@Alex) mja, dat soort geneuzel is dus voor mij een argument tegen ORMs, ook als het wel de goeie kant opgaat. Regressies komen vaak voor bij updates.
Ik doe (in mijn professionele leven) weinig aan echte software development, maar meer met data-warehouses / data-management en data-analyse, dus zeer zeker gekleurd door de database bril
Sinds de 2 dagen regel reageer ik hier niet meer
Onlangs heb ik een keer Petapoco gebruikt om af te zijn van het geestdodend saaie mappen (het probleem waarvoor ORMs meestal gebruikt worden), het schrijven van SQL-queries doe ik wel liever met de hand.
Een tijd geleden heb ik een keer een oplossing gemaakt waarbij ik een stored procedure gemaakt heb, die een table accepteert (user defined table type). De stored procedure gebruikt vervolgens T-SQL's MERGE-command om data in bulk te upserten in de target table. Dat werkte verrassend goed, en lekker snel. Zo'n oplossing bouwen met een ORM leidt dan tot een hoop losse queries, nu is het in één keer klaar
We are shaping the future
Dat was dan weer niet het antwoord waar ik op hoopteAlex) schreef op dinsdag 18 juni 2019 @ 16:11:
De stored procedure gebruikt vervolgens T-SQL's MERGE-command om data in bulk te upserten in de target table.
Sinds de 2 dagen regel reageer ik hier niet meer
Waarom views (dat zijn ook maar gewoon queries) bouwen in je database als je diezelfde queries gewoon vanuit je code kan doen?CurlyMo schreef op dinsdag 18 juni 2019 @ 16:03:
Even advocaat van de duivel / knuppel in het hoenderhok, maar als je model dusdanig complex is dat ORM's niet lekker meer werken, waarom dan niet gewoon makkelijkere representaties van de data voorschotelen middels views en CRUD op die views weer binnen de database afhandelen met triggers?
Ik volg je vraag niet; de complexiteit komt meestal vanuit de ORM zelf. SQL is best wel simpel over 't algemeen (rare schema's daargelaten). Een schema kan heel netjes genormaliseerd zijn, maar waarbij je toch door hoepels moet springen in een ORM (JPA met compound keys is een PITA bijvoorbeeld). Het N+1 probleem is een complexiteit van de ORM zelf; je weet zelf nooit wanneer 't precies gaat gebeuren (meestal niet, soms wel). Je weet nooit of een update roet in het eten gooit.
Dit terwijl een SQL query in je code gewoon een query blijft.
Mijn punt is dus dat een ORM voor simpel CRUD werk eigenlijk niks toevoegt (geen tijdswinst) en alleen bij complexere entity trees up-front tijdswinst oplevert. Maar die tijd die je wint, verlies je vaak aan de achterkant dubbel en dwars als je weer eens performance issues met Hibernate (daar zijn serieus boeken over geschreven) op moet lossen.
Wat mij betreft zijn ORMs gewoon altijd een slecht idee geweest. Ik heb er in al die jaren dat ik in de Java hoek zit nooit echt profijt van gehad.
Dus ik doe eigenlijk wat @Alex) doet; gewoon een rowmapper library gebruiken en klaar. Die SQL queries schrijven is niet erg interessant, maar da's die entity annotations e.d. op objecten plakken ook niet.
[ Voor 5% gewijzigd door Hydra op 18-06-2019 16:20 ]
https://niels.nu
Dit topic is gesloten.
Dit topic is niet de plaats om te lopen helpdesken. De Coffee Corner is primair bedoeld als uitlaatklep voor iedereen in de Devschuur® en niet als vraagbaak.