NodeJS deelt dan ook geen dependencies; tenzij je alles global installeert, maar dan heb je weer DLL Hell. Ieder NodeJS project download dus alle dependencies, en de dependencies van de dependencies, e.d. en dat loopt inderdaad al gouw in de honderde MBs.Gropah schreef op maandag 14 oktober 2019 @ 13:00:
[...]
Niet mee eens. Ik heb 256GB linux partitie voor devven. Als ik daar wat met Node op moet doen (helaas moet dat af en toe) dan is 600mb aan node dependancies niet zo raar. En met docker kan het ook snel uit de klauwen lopen als iemand zijn versies niet goed pinned/hergebruikt.
I know. Maar dat schijfruimte vreten is precies de reden waarom ik er op tegen ben om libraries niet meer te delen. Want 3 projecten die ik in Node had draaien, op een gegeven moment (ben er nu gelukkig van verlost), draaide voor een deel op dezelfde versies... En dus heb je het 3x op je systeem staan.ThomasG schreef op maandag 14 oktober 2019 @ 13:03:
[...]
NodeJS deelt dan ook geen dependencies; tenzij je alles global installeert, maar dan heb je weer DLL Hell. Ieder NodeJS project download dus alle dependencies, en de dependencies van de dependencies, e.d. en dat loopt inderdaad al gouw in de honderde MBs.
Weer een van die dingen die ze gewoon van Maven hadden moeten jatten:ThomasG schreef op maandag 14 oktober 2019 @ 13:03:
[...]
NodeJS deelt dan ook geen dependencies; tenzij je alles global installeert, maar dan heb je weer DLL Hell. Ieder NodeJS project download dus alle dependencies, en de dependencies van de dependencies, e.d. en dat loopt inderdaad al gouw in de honderde MBs.
code:
1
2
| $ du -sh ~/.m2/repository/ 2.6G |
Maar nee, wiel opnieuw uitvinder is 'beter'.
[ Voor 4% gewijzigd door Hydra op 14-10-2019 13:15 ]
https://niels.nu
Maar daar noem je dan ook 2 van de meest schijfruimte vretende dingen die er zijn zo ongeveer.Gropah schreef op maandag 14 oktober 2019 @ 13:00:
[...]
Niet mee eens. Ik heb 256GB linux partitie voor devven. Als ik daar wat met Node op moet doen (helaas moet dat af en toe) dan is 600mb aan node dependancies niet zo raar. En met docker kan het ook snel uit de klauwen lopen als iemand zijn versies niet goed pinned/hergebruikt.
Ik vind het eerlijk gezegd steeds lastiger om nog te genieten van mijn werk als programmeur (als minimalist zijnde).
[ Voor 10% gewijzigd door Lethalis op 14-10-2019 13:53 ]
Ask yourself if you are happy and then you cease to be.
Ik zei ook dat het nadelen had. Maar in principe is Docker een regelrecht resultaat van dit.Gropah schreef op maandag 14 oktober 2019 @ 13:00:
[...]
Niet mee eens. Ik heb 256GB linux partitie voor devven. Als ik daar wat met Node op moet doen (helaas moet dat af en toe) dan is 600mb aan node dependancies niet zo raar. En met docker kan het ook snel uit de klauwen lopen als iemand zijn versies niet goed pinned/hergebruikt.
Less alienation, more cooperation.
Omdat je aan het haten bent en Linux (net als Rust) perfect is, vat ik het ook even samen (same source):Lethalis schreef op maandag 14 oktober 2019 @ 12:15:
Ik wil niet haten op Linux, maar het volgende artikel vat het allemaal wel mooi samen:
Major Linux Problems on the Desktop, 2019 edition
[serious mode on]I want to make one thing crystal clear - Windows, in some regards, is even worse than Linux and it has its own share of critical problems.
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.
Ik ben sinds vandaag even met Mozilla DeepSpeech aan het pielen. Man o man wat een hoop tools je ook weer nodig hebt voordat je het eindelijk aan de praat hebt.
Om nog maar te zwijgen over om er dan ook nog eens tegenaan te programmeren.
Om nog maar te zwijgen over om er dan ook nog eens tegenaan te programmeren.
Less alienation, more cooperation.
Ik las DeepSpace. Waarom weet ik niet, misschien heeft het met het bezoek aan Space Expo van vandaag te makenSandor_Clegane schreef op maandag 14 oktober 2019 @ 22:48:
Ik ben sinds vandaag even met Mozilla DeepSpeech aan het pielen. Man o man wat een hoop tools je ook weer nodig hebt voordat je het eindelijk aan de praat hebt.
Om nog maar te zwijgen over om er dan ook nog eens tegenaan te programmeren.

If money talks then I'm a mime
If time is money then I'm out of time
Wat ben je van plan als ik 't vragen mag?Sandor_Clegane schreef op maandag 14 oktober 2019 @ 22:48:
Ik ben sinds vandaag even met Mozilla DeepSpeech aan het pielen. Man o man wat een hoop tools je ook weer nodig hebt voordat je het eindelijk aan de praat hebt.
Om nog maar te zwijgen over om er dan ook nog eens tegenaan te programmeren.
🠕 This side up
Zijn levensverhalen documenteren natuurlijk
Iemand nog tips om met Kubernetes op Azure (AKS) aan de slag te gaan? Ik zit nu met een docker-compose microservices omgeving.
Kun je iets specifieker zijn?plofkip schreef op dinsdag 15 oktober 2019 @ 09:02:
Iemand nog tips om met Kubernetes op Azure (AKS) aan de slag te gaan? Ik zit nu met een docker-compose microservices omgeving.
https://niels.nu
Ik heb toevallig wel iets leuks wat je kunt proberen op jouw Linux machines:farlane schreef op maandag 14 oktober 2019 @ 20:46:
[...]
Omdat je aan het haten bent en Linux (net als Rust) perfect is, vat ik het ook even samen (same source):
https://thehackernews.com...udo-run-as-root-flaw.html
(niet dat dit überhaupt iets met de discussie te maken heeft, maar ik vind het gewoon grappig... al moet je hiervoor wel een regel in de /etc/sudoers hebben met !root er in, dus als je een user hebt die andere users mag impersonaten behalve root, dan kan diegene toch root worden door sudo -u#-1 te doen).
[ Voor 29% gewijzigd door Lethalis op 15-10-2019 11:16 ]
Ask yourself if you are happy and then you cease to be.
Aan de slag als in "beetje spelen"?plofkip schreef op dinsdag 15 oktober 2019 @ 09:02:
Iemand nog tips om met Kubernetes op Azure (AKS) aan de slag te gaan? Ik zit nu met een docker-compose microservices omgeving.
Als je nog niets aan services bij Azure hebt zou ik meer bij GKE kijken (Google dus) en preemtible nodes gebruiken. Dan heb je voor een paar euro in de maand een cluster.
Anders dan dat mist het te veel context en is wellicht een nieuw topic zelfs beter
Snap dat het een vage vraag was ;-)
Nee het is niet een beetje spelen, een complete online omgeving migreren naar Azure. Draait nu op AWS met docker-compose.
Wil naar Azure vanwege de ervaring die er al is (o.a. Azure DevOps voor CI/CD) en de MS stack die aansluit (microservices draaien op .NET Core).
Ben eigenlijk op zoek naar alle tips die ik kan krijgen om dit om te zetten naar kubernetes op AKS ;-)
Nee het is niet een beetje spelen, een complete online omgeving migreren naar Azure. Draait nu op AWS met docker-compose.
Wil naar Azure vanwege de ervaring die er al is (o.a. Azure DevOps voor CI/CD) en de MS stack die aansluit (microservices draaien op .NET Core).
Ben eigenlijk op zoek naar alle tips die ik kan krijgen om dit om te zetten naar kubernetes op AKS ;-)
https://www.computable.nl...-van-32-miljard-euro.html
Oracle weer lekker bezig.
Oracle weer lekker bezig.
[ Voor 5% gewijzigd door Lethalis op 15-10-2019 12:38 ]
Ask yourself if you are happy and then you cease to be.
Kijk eens aan, Disney+ voldoet niet aan hun plicht om een unsubscribe-link op te nemen in hun emails met kijksuggesties. De klantenservice ging er een melding van maken
. Ondertussen heb ik er ook maar een melding van gemaakt, bij de ACM

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 heb nog een stuk code liggen wat gebruikt maakt van de Kinect SDK voor spraakherkenning. Ik was benieuwd of dit een beetje te doen is met DeepSpeech.
Die van de Kinect moet je namelijk helemaal voorkauwen met grammars en ik hoop dat deze wat meer freeflow is.
Edit: wow, het was wat gepruts met de juiste instellingen op de Kinect en Freenect op het Communisten OS (
Oh man, nu nog iets vinden hoe ik dus de stream van de Kinect op Linux .Net Core in krijg en dat dan DeepSpeech in kan jagen, die inference laten doen en het er dan weer uit krijgen,
Edit2: Hij kent mijn hotword ook nog!
Waarom zou je je willen unsubscriben?.oisyn schreef op dinsdag 15 oktober 2019 @ 16:44:
Kijk eens aan, Disney+ voldoet niet aan hun plicht om een unsubscribe-link op te nemen in hun emails met kijksuggesties. De klantenservice ging er een melding van maken. Ondertussen heb ik er ook maar een melding van gemaakt, bij de ACM
Edit3:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| // Learn more about F# at http://fsharp.org open System open OpenTK.Audio let getCaptureDevices () = AudioCapture.AvailableDevices |> Seq.cast |> Seq.iter(printfn "%s") [<EntryPoint>] let main argv = getCaptureDevices() Console.ReadLine() |> ignore printfn "Hello World from F#!" 0 // return an integer exit code |
Output:
code:
1
2
3
4
| Family 17h (Models 00h-0fh) HD Audio Controller Analog Stereo Kinect Audio 4 Channels Input Monitor of Family 17h (Models 00h-0fh) HD Audio Controller Digital Stereo (IEC958) Monitor of GP102 HDMI Audio Controller Digital Stereo (HDMI) |
Het begin is er.
[ Voor 70% gewijzigd door Sandor_Clegane op 15-10-2019 20:46 ]
Less alienation, more cooperation.
in het kort:plofkip schreef op dinsdag 15 oktober 2019 @ 12:04:
Snap dat het een vage vraag was ;-)
Nee het is niet een beetje spelen, een complete online omgeving migreren naar Azure. Draait nu op AWS met docker-compose.
Wil naar Azure vanwege de ervaring die er al is (o.a. Azure DevOps voor CI/CD) en de MS stack die aansluit (microservices draaien op .NET Core).
Ben eigenlijk op zoek naar alle tips die ik kan krijgen om dit om te zetten naar kubernetes op AKS ;-)
- AKS resource opzetten: https://stackify.com/azure-container-service-kubernetes/
- Ervoor zorgen dat jouw containers ergens in een container registry zitten
- yaml files maken voor jouw deployment naar K8s
- in je release pipeline een 'deploy to kubernetes' task gebruiken die je containers naar de gewenste pods in kubernetes
https://fgheysels.github.io/
Ja zover was ik inderdaad al wel 😉
Zit me vooral af te vragen hoe om te gaan met versionering en dus releasen naar ACC, staging en prod.
Zit me vooral af te vragen hoe om te gaan met versionering en dus releasen naar ACC, staging en prod.
Meer geval "overheid en ICT gaan moeilijk samen". Altijd maar voor een Oracle database gaan want dat is 'veilig' en er dan later achterkomen dat je er ook echt voor moet betalen, da's wel typisch overheid.Lethalis schreef op dinsdag 15 oktober 2019 @ 12:37:
https://www.computable.nl...-van-32-miljard-euro.html
Oracle weer lekker bezig.
Idem voor de Java JDK. Je hebt al jaren OpenJDK wat gewoon de standaard JDK voor Java is. De Oracle JDK is daar een commerciele distributie van. De overheid is 'bang' voor open source, en wil dus bij de Oracle JDK blijven. Tja, die is i.t.t. OpenJDK niet gratis. Dit terwijl de private sector al lang over is.
Ik werk al in een aardig aantal projecten met K8s en hoe we het meestal inrichten is dat we de docker image taggen met het build number. Meestal deployen we die tag automatisch naar een test cluster waarbij in de build pipeline handmatige stappen zijn om die specifieke tags naar een ACC en PRO cluster te deployen. De exacte implementatie verschilt per klant maar in grote lijnen komt 't hier op neer.plofkip schreef op dinsdag 15 oktober 2019 @ 23:27:
Ja zover was ik inderdaad al wel 😉
Zit me vooral af te vragen hoe om te gaan met versionering en dus releasen naar ACC, staging en prod.
Als je specifieke vragen hebt let me know, denk graag een beetje mee.
[ Voor 31% gewijzigd door Hydra op 16-10-2019 10:32 ]
https://niels.nu
Dat ligt niet alleen aan de overheid. Oracle maakt het opzettelijk zo makkelijk en vaag mogelijk om per ongeluk software/features te gebruiken waar eigenlijk een licentie voor nodig is. Om vervolens langs te komen en geld te innen. Het is niet voor niets dat steeds meer (grote) bedrijven Oracle aan het uitfaseren zijn; ze hebben hun eigen glazen ingegooid.Hydra schreef op woensdag 16 oktober 2019 @ 10:30:
[...]
Meer geval "overheid en ICT gaan moeilijk samen". Altijd maar voor een Oracle database gaan want dat is 'veilig' en er dan later achterkomen dat je er ook echt voor moet betalen, da's wel typisch overheid.
Idem voor de Java JDK. Je hebt al jaren OpenJDK wat gewoon de standaard JDK voor Java is. De Oracle JDK is daar een commerciele distributie van. De overheid is 'bang' voor open source, en wil dus bij de Oracle JDK blijven. Tja, die is i.t.t. OpenJDK niet gratis. Dit terwijl de private sector al lang over is.
Hoe ik het nu met docker-compose had ingericht; de omgeving heeft z'n eigen tag. Dus T heeft test, A heeft acceptance, S heeft staging en P heeft production.Hydra schreef op woensdag 16 oktober 2019 @ 10:30:
[...]
Ik werk al in een aardig aantal projecten met K8s en hoe we het meestal inrichten is dat we de docker image taggen met het build number. Meestal deployen we die tag automatisch naar een test cluster waarbij in de build pipeline handmatige stappen zijn om die specifieke tags naar een ACC en PRO cluster te deployen. De exacte implementatie verschilt per klant maar in grote lijnen komt 't hier op neer.
Als je specifieke vragen hebt let me know, denk graag een beetje mee.
De develop builds worden getagd met test. De release/* builds als acceptance, de hotfix/* en master builds als staging en dan een handmatige actie om staging te taggen als production.
Nadeel; het is niet heel makkelijk om een rollback uit te voeren. En je hebt niet echt weet van de versies, het is altijd de laatste versie van een bepaalde branch/build.
Sinds ik ook maar hobbymatige interesse heb in het vakgebied (begin jaren negentig) staat Oracle bekend als het bedrijf met tien juristen per developer en meer van dat soort grappen. Aan de ene kant vraag ik me af hoe zo'n bedrijf kan bestaan, aan de andere kant: als ze er al zo lang mee wegkomen, zal dat wel altijd zo blijven toch?ThomasG schreef op woensdag 16 oktober 2019 @ 10:33:
[...]
Dat ligt niet alleen aan de overheid. Oracle maakt het opzettelijk zo makkelijk en vaag mogelijk om per ongeluk software/features te gebruiken waar eigenlijk een licentie voor nodig is. Om vervolens langs te komen en geld te innen. Het is niet voor niets dat steeds meer (grote) bedrijven Oracle aan het uitfaseren zijn; ze hebben hun eigen glazen ingegooid.
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Nee, omdat de werkelijkheid ze inhaalt zoals bijv. de volwassenheid van PostgreSQL en Python.kenneth schreef op woensdag 16 oktober 2019 @ 10:41:
[...]
Aan de ene kant vraag ik me af hoe zo'n bedrijf kan bestaan, aan de andere kant: als ze er al zo lang mee wegkomen, zal dat wel altijd zo blijven toch?
Sinds de 2 dagen regel reageer ik hier niet meer
Python als alternatief van Java? Ik heb geen ervaring met Python, maar van wat ik er gezien heb zou ik het ook niet snel gaan gebruiken. Als alternatief van Java zou ikzelf dan echt veel eerder naar C# / .NET kijken. Zeker met .NET Core tegenwoordig wat gewoon overal op draait. Overigens heb ik C# ook al niet meer gebruikt sinds mijn schooltijd, en dat is ook alweer een jaar of 8 geleden dus van voor .NET Core. Maar als ik de C# syntax met Python moet vergelijken dan ga ik echt 100% voor C#, en met .NET Core ook nog eens cross platform.CurlyMo schreef op woensdag 16 oktober 2019 @ 10:44:
[...]
Nee, omdat de werkelijkheid ze inhaalt zoals bijv. de volwassenheid van PostgreSQL en Python.
Ik was inderdaad te kort door de bocht en dacht meer vanuit de CLI applicaties. Wat betreft GUI's heb je gelijk.RobertMe schreef op woensdag 16 oktober 2019 @ 10:48:
[...]
Python als alternatief van Java? Ik heb geen ervaring met Python, maar van wat ik er gezien heb zou ik het ook niet snel gaan gebruiken. Als alternatief van Java zou ikzelf dan echt veel eerder naar C# / .NET kijken. Zeker met .NET Core tegenwoordig wat gewoon overal op draait.
Sinds de 2 dagen regel reageer ik hier niet meer
Waarom zou je nog Python gebruiken als het ook met Rust kan?CurlyMo schreef op woensdag 16 oktober 2019 @ 10:51:
[...]
Ik was inderdaad te kort door de bocht en dacht meer vanuit de CLI applicaties. Wat betreft GUI's heb je gelijk.
Het is voor een kleine club vaak al lastig om van een commerciële database over te stappen naar Postgres, laat staan een gigantische overheid waar niemand van elkaar nog weet wat de ander doet. Zelfde voor grote bedrijven.CurlyMo schreef op woensdag 16 oktober 2019 @ 10:44:
[...]
Nee, omdat de werkelijkheid ze inhaalt zoals bijv. de volwassenheid van PostgreSQL en Python.
Ik heb voor mijn werk ook weleens gekeken naar een migratie van SQL Server naar Postgres en dat is best een kluif.
Het begint met simpele dingen, zoals dat Postgres case sensitive is, maar gaat met lastigere problemen verder zoals dat niet alle data types beschikbaar zijn / 1 op 1 mappen.
Ook werken stored procedures anders.
Hoe leuk ik het ook had gevonden, kon ik niet anders concluderen dan dat het goedkoper was om nieuwe SQL Server licenties aan te schaffen. Alles ombouwen had maanden / jaren aan programmeerwerk gekost met meerdere mensen.
Eens in de zoveel tijd komt dit terug bij ons op de zaak, omdat klanten SQL Server te duur vinden... deze - vaak kleinere - klanten bieden we tegenwoordig SQL Server Express aan.
Tsja. Oracle zal er dus - net als Microsoft - nog lang mee wegkomen.
En Python... tsja, niemand gaat decennia aan programmeerwerk in Java weggooien. Net zoals dat wij op de zaak simpelweg getrouwd zijn met Microsoft .NET.
Ask yourself if you are happy and then you cease to be.
Ik dacht meer aan alles, en niet aan GUI vs CLICurlyMo schreef op woensdag 16 oktober 2019 @ 10:51:
[...]
Ik was inderdaad te kort door de bocht en dacht meer vanuit de CLI applicaties. Wat betreft GUI's heb je gelijk.
Het is helemaal niet zo vaag hoor. We hebben bij mijn huidige klant ook een issue met dure oracle licenties (die zijn vaak nog op aantallen machines gebaseerd, wat 'in the cloud' nogal lastig is) en daar wordt actief vandaan van gemigreerd. Dat oracle te duur is, helemaal mee eens. Maar het is niet 'vaag'; dat ligt echt aan de overheid.ThomasG schreef op woensdag 16 oktober 2019 @ 10:33:
[...]
Dat ligt niet alleen aan de overheid. Oracle maakt het opzettelijk zo makkelijk en vaag mogelijk om per ongeluk software/features te gebruiken waar eigenlijk een licentie voor nodig is. Om vervolens langs te komen en geld te innen. Het is niet voor niets dat steeds meer (grote) bedrijven Oracle aan het uitfaseren zijn; ze hebben hun eigen glazen ingegooid.
Da's een beetje tegen het idee in dat je images immutable versies van je applicatie zijn die je op verschillende omgevingen deployed. Het is een beetje een anti-pattern. Je image is je executable; je deployed op Pro ook niet een executable die je nooit getest hebt toch?plofkip schreef op woensdag 16 oktober 2019 @ 10:35:
[...]
Hoe ik het nu met docker-compose had ingericht; de omgeving heeft z'n eigen tag. Dus T heeft test, A heeft acceptance, S heeft staging en P heeft production.
De develop builds worden getagd met test. De release/* builds als acceptance, de hotfix/* en master builds als staging en dan een handmatige actie om staging te taggen als production.
Nadeel; het is niet heel makkelijk om een rollback uit te voeren. En je hebt niet echt weet van de versies, het is altijd de laatste versie van een bepaalde branch/build.
Python wil je helemaal niet gebruiken voor 'echte' complexe software. Het is prima voor simpele scripts / prototypes die je wegflikkert, maar het performt enorm slecht en het is simpelweg makkelijker correcte software te schrijven in statically typed talen. Komt nog eens bij dat het Python ecosysteem door die 2/3 split een rotzooitje is.CurlyMo schreef op woensdag 16 oktober 2019 @ 10:44:
Nee, omdat de werkelijkheid ze inhaalt zoals bijv. de volwassenheid van PostgreSQL en Python.
[ Voor 44% gewijzigd door Hydra op 16-10-2019 11:20 ]
https://niels.nu
Precies. Het is echter niet zo dat het nooit getest is, want het is dezelfde image die je hebt gehad op staging, maar dan met een extra label eraan.Hydra schreef op woensdag 16 oktober 2019 @ 11:16:
[...]
Da's een beetje tegen het idee in dat je images immutable versies van je applicatie zijn die je op verschillende omgevingen deployed. Het is een beetje een anti-pattern. Je image is je executable; je deployed op Pro ook niet een executable die je nooit getest hebt toch?
Maar ik wil dit dus ook anders op gaan zetten, ben nog een beetje zoekende hoe.
Toch gebeurt het volopLethalis schreef op woensdag 16 oktober 2019 @ 10:55:
[...]
Het is voor een kleine club vaak al lastig om van een commerciële database over te stappen naar Postgres, laat staan een gigantische overheid waar niemand van elkaar nog weet wat de ander doet. Zelfde voor grote bedrijven.
Zeker waar, maar dat verplicht je niet je nieuwe dingen ook in Java te schrijven.En Python... tsja, niemand gaat decennia aan programmeerwerk in Java weggooien. Net zoals dat wij op de zaak simpelweg getrouwd zijn met Microsoft .NET.
Of het nu Python, C# of zelfs PHP is, punt blijft hetzelfde. Er zijn voldoende alternatieven.RobertMe schreef op woensdag 16 oktober 2019 @ 10:57:
[...]
Maar daarvan ken ik de exacte ins en outs ook niet en ik heb ook niet het idee dat ik in PHP (shoot me) iets mis of in C# iets miste wat potentieel met Python stukken makkelijker zou kunnen.
Zie hierboven.Hydra schreef op woensdag 16 oktober 2019 @ 11:16:
[...]
Python wil je helemaal niet gebruiken voor 'echte' complexe software. Het is prima voor simpele scripts / prototypes die je wegflikkert, maar het performt enorm slecht en het is simpelweg makkelijker correcte software te schrijven in statically typed talen. Komt nog eens bij dat het Python ecosysteem door die 2/3 split een rotzooitje is.
Sinds de 2 dagen regel reageer ik hier niet meer
Veel nieuwe ontwikkelingen bij bedrijven en overheden bouwen op bestaande software of sluiten daar tenminste op aan.CurlyMo schreef op woensdag 16 oktober 2019 @ 11:45:
[...]
Toch gebeurt het volop
Zeker waar, maar dat verplicht je niet je nieuwe dingen ook in Java te schrijven.
Of het nu Python, C# of zelfs PHP is, punt blijft hetzelfde. Er zijn voldoende alternatieven.
Een andere taal gebruiken is dan vaak onhandig, omdat je bijvoorbeeld bestaande libraries wil hergebruiken.
Op mijn werk is .NET Core gebruiken in veel situaties al lastig t.o.v. het .NET Framework

Ik probeer die libraries naar .NET Standard te krijgen met veel moeite en heb het in een paar gevallen zelfs al opgegeven en mij er maar bij neergelegd omdat het de tijd en energie simpelweg niet waard is.
Ask yourself if you are happy and then you cease to be.
Tja als je enorme codebases in Python beheersbaar wilt houden, dan ga je dus zoals bij Dropbox weer terugvallen op static typing.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Het ligt eraan wat je ermee doet.Hydra schreef op woensdag 16 oktober 2019 @ 11:16:
[...]
Python wil je helemaal niet gebruiken voor 'echte' complexe software. Het is prima voor simpele scripts / prototypes die je wegflikkert, maar het performt enorm slecht en het is simpelweg makkelijker correcte software te schrijven in statically typed talen. Komt nog eens bij dat het Python ecosysteem door die 2/3 split een rotzooitje is.
Voor betere performance gebruik je externe libraries, zoals numpy.
Die 2/3 split is mijn ogen echt verleden tijd, ik ken geen project wat nog niet over is naar 3.
Over static typing begin ik het inmiddels wel eens te worden. Python met static typing zou ik misschien zelfs wel prettig vinden
https://medium.com/@ageit...n-10-minutes-12c86d72677bTk55 schreef op woensdag 16 oktober 2019 @ 13:57:
Python met static typing zou ik misschien zelfs wel prettig vinden
Numpy verhelpt het GIL probleem niet.Tk55 schreef op woensdag 16 oktober 2019 @ 13:57:
Voor betere performance gebruik je externe libraries, zoals numpy.
https://niels.nu
https://wiki.python.org/moin/GlobalInterpreterLockHydra schreef op woensdag 16 oktober 2019 @ 14:33:
het GIL probleem
Voor wie net als ik de afkorting niet snapte
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Ik bedoelde meer het forceren van types in de taal zelf. Dit blijven type hints, die je later weer moet controleren met mypy. Maar dat zal uiteindelijk ook niet makkelijk zijn aangezien je het toch niet compileert.
Ben het vaak wel met je eens Hydra, maar hier toch echt niet mee eens. De Python ecosysteem split is echt al lang verleden tijd en een beetje vermoeiend dat mensen daar elke keer weer over beginnen. Ik kan me niet heugen dat ik in de afgelopen 5 jaar nog Python 2-only libs tegen ben gekomen.Hydra schreef op woensdag 16 oktober 2019 @ 11:16:
[...]
Python wil je helemaal niet gebruiken voor 'echte' complexe software. Het is prima voor simpele scripts / prototypes die je wegflikkert, maar het performt enorm slecht en het is simpelweg makkelijker correcte software te schrijven in statically typed talen. Komt nog eens bij dat het Python ecosysteem door die 2/3 split een rotzooitje is.
In Python3 is het perfect mogelijk hi-performance code te schrijven, alleen al vanwege het feit dat de meeste hi-performance libs gewoon naar onderliggende C-libs delegeren. Wat dat betreft is Python perfect. Het is een user-friendly taal die voor hi-perf werk een goede interface biedt naar hardcore libraries. Ook met standaard numbercrunching delegeert Numpy gewoon naar BLAS/LAPACK.
Nee, je moet er geen triple-A 60fps 3d shooter mee gaan maken nee. Maar 99% van de projecten hebben geen behoefte aan echte performance en dan is Python een goed compromis met een gemakkelijke syntax en een prima performance.
In mijn vorige functie bij Philips hadden we simulatiemodellen gemaakt in Python3 en testapparatuur die aangestuurd werd met Python3. De simulaties deden over 1 run gemiddeld 1s. Ik heb wel eens in Kotlin voor de lol het nagemaakt en toen deed ie het in 80ms. Echter, we draaien geen 1 miljoen simulaties, maar hooguit een paar honderd per dag. De winst met Kotlin valt in het niet met het feit dat ik de simulaties niet makkelijk kan overdragen naar mensen zonder Java/Kotlin kennis. Python leest gewoon heel logisch weg voor een leek. Onze testapparatuur was zeer makkelijk in te stellen op verschillende profielen middels een Python interface voor de gemiddelde test-engineer. De meeste engineers kenden Matlab. Om een of andere reden was Python een hele makkelijke overstap voor ze. Kotlin/Java niet. C# was ook lastig viel me op, net als C.
En nee, dit waren geen 'simpele scripts' en 'prototypes die je wegflikkert', maar gewoon nette gedocumenteerde software die nota bene geaudit werd en onderdeel was van ons medical verificatie proces. Als je denkt dat je audits gehad hebt met een of andere ISO auditje, maak je borst maar nat als de FDA op bezoek komt.
Zoals altijd weer. Right tool for the job. En de juiste keuze is het juiste compromis.
Nou, dan ben je echt verkeerd ingelicht:
Source: https://wiki.python.org/moin/GlobalInterpreterLockThe GIL is controversial because it prevents multithreaded CPython programs from taking full advantage of multiprocessor systems in certain situations. Note that potentially blocking or long-running operations, such as I/O, image processing, and NumPy number crunching, happen outside the GIL. Therefore it is only in multithreaded programs that spend a lot of time inside the GIL, interpreting CPython bytecode, that the GIL becomes a bottleneck.
En dan nog even over static typing. Ik ben er ook enorm fan van, maar dynamic typing heeft ook gewoon voordelen. Eentje ervan is dat, zoals bij Python, er Economy of Expression. Het kost gewoon heel weinig moeite om te zien wat er gebeurt en het kost heel weinig moeite om iets voor elkaar te krijgen. Die winst moet je afzetten tegen het verlies van static typing. Maar met goede tests en goede assertions vang je daar een deel mee af. Uiteraard kan een crappy coder ook Python veranderen in een teringzooi.
[ Voor 22% gewijzigd door armageddon_2k1 op 16-10-2019 15:49 ]
Engineering is like Tetris. Succes disappears and errors accumulate.
We kennen hopelijk allemaal de blog https://www.joelonsoftwar...u-should-never-do-part-i/. Ondanks dat dit 19 jaar geleden is geschreven is zijn boodschap volgens mij nog steeds actueel.
Hoe gaan jullie met zijn verhaal om wanneer je in een organisatie terecht komt met veel spaghetti code en andere anti-patterns? Doorgaan op de huidige voet is dan niet echt een optie, maar bij vernieuwen trap je snel in de door hem benoemde valkuilen.
Hoe gaan jullie met zijn verhaal om wanneer je in een organisatie terecht komt met veel spaghetti code en andere anti-patterns? Doorgaan op de huidige voet is dan niet echt een optie, maar bij vernieuwen trap je snel in de door hem benoemde valkuilen.
Sinds de 2 dagen regel reageer ik hier niet meer
Toevallig zitten wij in deze situatie. We hebben meerdere applicaties waarbij dit het geval is. Bij eentje zijn we aan het overwegen het te herschrijven van een custom PHP framework dat ooit door een programmeur (die weg is) bedacht is naar een modernere manier. De reden dat we het doen is dat we, voor ons gevoel, onevenredig veel tijd/geld kwijt zijn met bugfixing en nieuwe features bijna ondoenlijk zijn. Het kost gewoon heel veel tijd/geld een triviale bug op te lossen. Daarnaast is de performance om te huilen vanwege een paar hele matige design keuzes.CurlyMo schreef op woensdag 16 oktober 2019 @ 15:42:
We kennen hopelijk allemaal de blog https://www.joelonsoftwar...u-should-never-do-part-i/. Ondanks dat dit 19 jaar geleden is geschreven is zijn boodschap volgens mij nog steeds actueel.
Hoe gaan jullie met zijn verhaal om wanneer je in een organisatie terecht komt met veel spaghetti code en andere anti-patterns? Doorgaan op de huidige voet is dan niet echt een optie, maar bij vernieuwen trap je snel in de door hem benoemde valkuilen.
Wat we eerst doen is kijken of we met een PoC de performance kunnen halen die we willen. Vanuit daar kijken we of we verder gaan. Ik denk dat je in zulke gevallen een paar harde criteria moet stellen wanneer je door besluit te gaan of niet en in den beginne klein moet beginnen met de vervanger zodat de investeringen in tijd en geld niet enorm zijn voordat je go/nogo beslissingen neemt. Voor management is het altijd lastig verlies te nemen als de kosten al enorm opgelopen zijn en men diep geinvesteerd is in het volgende legacy project
Engineering is like Tetris. Succes disappears and errors accumulate.
Dus je vervangt concrete schakels terwijl de 'winkel open blijft' om zo langzaam oude code te vervangen door nieuwe code.armageddon_2k1 schreef op woensdag 16 oktober 2019 @ 15:47:
[...]
Wat we eerst doen is kijken of we met een PoC de performance kunnen halen die we willen.
Sinds de 2 dagen regel reageer ik hier niet meer
De winkel blijft open sowieso, en we gaan eerst haalbaarheidsstudie doen om onze aannames te staven. Vanuit daar komt een go/nogo.CurlyMo schreef op woensdag 16 oktober 2019 @ 15:52:
[...]
Dus je vervangt concrete schakels terwijl de 'winkel open blijft' om zo langzaam oude code te vervangen door nieuwe code.
Het is wel zo dat de JVM backend wel heel stabiel is, dus de REST-api waar de PHP-app mee praat gewoon hetzelfde blijft. Dus heel veel business-logica is onaangetast.
Het artikel van Joel is al vrij oud, en z'n referentie naar Netscape nog wel ouder. Het probleem bij Netscape was natuurlijk ook dat ze zich verkeken op de impact en het niet releasen van een nieuwe versie, terwijl er stiekem best veel concurrentie op de loer lag.
Engineering is like Tetris. Succes disappears and errors accumulate.
Ik haal andere belangrijke punten uit zijn artikel en dat is dat de oude methode meestal al beproefd is en er niet voor niks is. Je zult op een of andere manier die business logica moeten abstraheren en dat is vaak verdomd moeilijk als de originele ontwikkelaars er niet meer zijn en de documentatie op delen ontbreekt.armageddon_2k1 schreef op woensdag 16 oktober 2019 @ 15:57:
[...]
Het artikel van Joel is al vrij oud, en z'n referentie naar Netscape nog wel ouder. Het probleem bij Netscape was natuurlijk ook dat ze zich verkeken op de impact en het niet releasen van een nieuwe versie, terwijl er stiekem best veel concurrentie op de loer lag.
Sinds de 2 dagen regel reageer ik hier niet meer
@CurlyMo ik ook. Maar ik ben het niet direct eens met de stelling van Joel dat je het nooit moet doen. Er zijn redenen om het wel te doen alleen moeten die opwegen tegen de enorme nadelen. Bij Netscape was dat niet het geval.
Engineering is like Tetris. Succes disappears and errors accumulate.
Ik geloof dat eBay een keer of drie vanaf de grond opnieuw is opgebouwd. Soms is dat ook gewoon noodzakelijk en niet per se tijdrovender dan andere strategieën om zaken als flink gestegen volumes het hoofd te kunnen bieden.CurlyMo schreef op woensdag 16 oktober 2019 @ 16:05:
[...]
Ik haal andere belangrijke punten uit zijn artikel en dat is dat de oude methode meestal al beproefd is en er niet voor niks is. Je zult op een of andere manier die business logica moeten abstraheren en dat is vaak verdomd moeilijk als de originele ontwikkelaars er niet meer zijn en de documentatie op delen ontbreekt.
Ik zit nu ook in een fors herbouwtraject, waarbij we de kern van de architectuur herzien omdat de applicatie echt uit z'n voegen barst. Natuurlijk zijn er ook onderdelen die we gewoon in z'n geheel in een container overnemen, maar daar wordt per brokje naar gekeken. Veel geïsoleerde logica kunnen we wel aardig overnemen, dus dat is wel het nodige copy-paste werk. Scheelt ook dat we van doen hebben met een redelijk goed gestructureerde monolitische applicatie. Die kun je prima opknippen in microservices.
De herbouw die we hierna moeten doen is een stuk uitdagender. Dat wordt echt een poging om de 'big ball of mud' enigszins te ontrafelen.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Strangler pattern ?CurlyMo schreef op woensdag 16 oktober 2019 @ 15:52:
[...]
Dus je vervangt concrete schakels terwijl de 'winkel open blijft' om zo langzaam oude code te vervangen door nieuwe code.
Als je er dan ook nog eens kunt voor zorgen dat je traffic verdeelt wordt zodat bv 80% van de requests naar de oude services gaan, en 20% naar de nieuwe, dan kan je geleidelijk aan de boel gaan switchen
https://fgheysels.github.io/
Hoeveel lines of code was dat ongeveer?armageddon_2k1 schreef op woensdag 16 oktober 2019 @ 15:34:
In mijn vorige functie bij Philips hadden we simulatiemodellen gemaakt in Python3 en testapparatuur die aangestuurd werd met Python3.
En hoe vaak moest daar iets aan veranderd worden over de jaren heen?
Yup. Dat is hem op z'n meest basaal, inderdaad.Lethalis schreef op donderdag 10 oktober 2019 @ 08:34:
Dat klinkt op zich interessant, dus jij zegt dat ik (in de context van ASP.NET Core) het volgende kan doen:
code:
1 2 services.AddScoped<IDbConnection>(db => new SqlConnection( Configuration.GetConnectionString("AppConnectionString")));
Voorbeeld even van StackOverflow gekopieerd (en AddTransient vervangen door AddScoped).
Ondertussen heb ik vandaag er weer fijn een nieuw hoofdpijngeval bij gekregen.
Mijn werkgever schakelt voor een nieuwe schare projecten eindelijk vol over op een moderne toolchain gebruik makende van Webpack voor de front-end naast bestaande .NET Core voor de backend, en juist nu trekt Microsoft keihard de stekker uit de integratie tussen ASP.NET Core en de Webpack dev middleware: https://github.com/aspnet/AspNetCore/issues/12890
Enige migratie die ze bieden is het direct aanroepen van de CLI tooling voor Angular of React. Gebruik je iets met Webpack buiten die 2 frameworks of buiten de standaard opzet van bijv. create-react-app?
Geen ondersteuning meer.
Gebruik je hot-module reloading of server-side rendering?
Geen ondersteuning meer.
Had je graag de bestaande oplossing onder .NET Core 3 willen blijven gebruiken?
Verschillende aspecten er van zijn op het moment al stuk. En reken niet op een patch voor die problemen, want - aldus MS developers: "dat valt niet meer in lijn met onze lange termijn visie voor dit product"
Lekker dan...
[ Voor 50% gewijzigd door R4gnax op 16-10-2019 19:21 ]
Op zich heeft python tegenwoordig de mogelijkheid tot optionele type hinting. Ben laatst ook wel wat opensource projecten tegen gekomen waar het een item was op type-stubs te gaan maken.
Dus langzamerhand (omdat bij grotere python projecten het gebrek aan static typing idd een bottleneck werd) is de taal dus uitgebreid met de mogelijkheid tot type hinting (voor runtime wordt het totaal niet gebruikt, het is slechts voor IDE en tooling, maar goed met wat tooling heb je dan het meeste wel ondervangen.
En als de GIL ook zou gelden voor alle C-library bindings dan hadden we nooit numpy, tensorflow en pytorch in python gezien (en ook geen bindings als opencv).
Zelf wat testjes gedaan met rust ipv python met dat soort libraries en je merkt wel wat aan perfomance winst in je eventuele glue-code, maar als die beperkt is dan is dat vrij beperkt.
Dus zeker voor RAD is python zeker geschikt en kun je als je er uit je PoC bent het eventueel als nog (deels) implementeren in een andere taal.
Overigens hangt het er ook een beetje vanaf hoe je python gebruikt, de sleur en pleur algemene data structuren zijn ontzettend eenvoudig in gebruik, maar hebben wel een prijs (vooral ook in geheugen gebruik, wat wel een issue kan zijn met python).
Dus langzamerhand (omdat bij grotere python projecten het gebrek aan static typing idd een bottleneck werd) is de taal dus uitgebreid met de mogelijkheid tot type hinting (voor runtime wordt het totaal niet gebruikt, het is slechts voor IDE en tooling, maar goed met wat tooling heb je dan het meeste wel ondervangen.
En als de GIL ook zou gelden voor alle C-library bindings dan hadden we nooit numpy, tensorflow en pytorch in python gezien (en ook geen bindings als opencv).
Zelf wat testjes gedaan met rust ipv python met dat soort libraries en je merkt wel wat aan perfomance winst in je eventuele glue-code, maar als die beperkt is dan is dat vrij beperkt.
Dus zeker voor RAD is python zeker geschikt en kun je als je er uit je PoC bent het eventueel als nog (deels) implementeren in een andere taal.
Overigens hangt het er ook een beetje vanaf hoe je python gebruikt, de sleur en pleur algemene data structuren zijn ontzettend eenvoudig in gebruik, maar hebben wel een prijs (vooral ook in geheugen gebruik, wat wel een issue kan zijn met python).
[ Voor 42% gewijzigd door gekkie op 16-10-2019 19:39 ]
Potverdikkie het werkt:
Wilde ik even delen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Loading wav....done Creating deepspeech..... TensorFlow: v1.13.1-10-g3e0cc53 DeepSpeech: v0.5.1-0-g4b29b78 2019-10-16 21:36:04.817615: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA 2019-10-16 21:36:04.827163: E tensorflow/core/framework/op_kernel.cc:1325] OpKernel ('op: "UnwrapDatasetVariant" device_type: "CPU"') for unknown op: UnwrapDatasetVariant 2019-10-16 21:36:04.827205: E tensorflow/core/framework/op_kernel.cc:1325] OpKernel ('op: "WrapDatasetVariant" device_type: "GPU" host_memory_arg: "input_handle" host_memory_arg: "output_handle"') for unknown op: WrapDatasetVariant 2019-10-16 21:36:04.827216: E tensorflow/core/framework/op_kernel.cc:1325] OpKernel ('op: "WrapDatasetVariant" device_type: "CPU"') for unknown op: WrapDatasetVariant 2019-10-16 21:36:04.827297: E tensorflow/core/framework/op_kernel.cc:1325] OpKernel ('op: "UnwrapDatasetVariant" device_type: "GPU" host_memory_arg: "input_handle" host_memory_arg: "output_handle"') for unknown op: UnwrapDatasetVariant done Running inference.... Result: it was my reports from the north which Hello World from F#! Press any key to continue... |
Wilde ik even delen.
Less alienation, more cooperation.
@Sandor_Clegane Hoera 
Ook leuk om de aloude Python-discussie weer eens te zien. Dat was alweer even geleden

Ook leuk om de aloude Python-discussie weer eens te zien. Dat was alweer even geleden
🠕 This side up
Zelf aan het trainen, of alleen inference aan het toen op basis van engels model ?Sandor_Clegane schreef op woensdag 16 oktober 2019 @ 21:39:
Potverdikkie het werkt:
Running inference.... Result: it was my reports from the north which
Hello World from F#!
Press any key to continue...
[/code]
Wilde ik even delen.
Eerst inference, dat heb ik wat om te testen.gekkie schreef op donderdag 17 oktober 2019 @ 01:54:
[...]
Zelf aan het trainen, of alleen inference aan het toen op basis van engels model ?
Eerst alles aan de praat hebben, daarna maar eens kijken hoe goed het model is.
Less alienation, more cooperation.
Ik heb hem nu zo:R4gnax schreef op woensdag 16 oktober 2019 @ 19:13:
[...]
Yup. Dat is hem op z'n meest basaal, inderdaad.
code:
1
2
3
4
5
6
| services.AddScoped<IDbConnection>(db => { var dbConn = new SqlConnection(connectionString); dbConn.Open(); return dbConn; }); |
Ik open de SqlConnection om te voorkomen dat Dapper zelf de verbinding gaat managen.
Ah de zoveelste gekke beslissing van Microsoft.Ondertussen heb ik vandaag er weer fijn een nieuw hoofdpijngeval bij gekregen.
Fijn inderdaad

Ik hoop maar dat het niet echt is vanwege Blazor, want dan zijn ze echt heel fout bezig.
Ask yourself if you are happy and then you cease to be.
Oh, het was geen enterprise-y stuk code nee. En het had een nogal beperkte scope. Dus een paar honderd, tot duizend misschien?Olaf van der Spek schreef op woensdag 16 oktober 2019 @ 19:07:
[...]
Hoeveel lines of code was dat ongeveer?
En hoe vaak moest daar iets aan veranderd worden over de jaren heen?
Kwa change management viel het wel mee. Die werden vooral door projecten gedreven, dus wellicht 5 tot 10x per jaar.
Maar LOC en hoe onderhevig het was aan verandering heeft vrij weinig te maken met het punt dat ik wilde maken
Engineering is like Tetris. Succes disappears and errors accumulate.
Collega zegt hier plots achter mij:
Nog iemand koffie?
Waarna hij keihard facepalmed... Someone's having a rough morningMaar what the hell, dat is toch onmogelijk? What the fuck...
Nog iemand koffie?
Without nipples, boobs are pointless - 365 project - In mijn hoofd is het alle dagen Kerstmis - What type of bees make milk? Boobies! - What type of bees are scary? BoooOOOOOooobeees! - Cactusliefhebster
Zo zit ik er ook wel eens bij. Dan kom ik dingen tegen in de codebase waarbij ik mij echt afvraag hoe het ooit heeft kunnen werken (als het dat al deed).ElkeBxl schreef op donderdag 17 oktober 2019 @ 08:21:
Collega zegt hier plots achter mij:
[...]
Waarna hij keihard facepalmed... Someone's having a rough morning![]()
Nog iemand koffie?
[Afbeelding]
Ah kijk eens aan .. doe maar gewoon een zwart bakkie :-)ElkeBxl schreef op donderdag 17 oktober 2019 @ 08:21:
Collega zegt hier plots achter mij:
Waarna hij keihard facepalmed... Someone's having a rough morning![]()
Nog iemand koffie?
[Afbeelding]
Urghh pgloader nog niet compatible met postgres 12

Ik krijg nog wel eens het verzoek om werk van collega's te reviewen op architecturele hoofdlijnen en dan heb ik toch ook wel regelmatig van die WTF momentjes.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Vandaar dat we naast de Helm nu ook nog een Rudr schijnen te hebben.plofkip schreef op donderdag 17 oktober 2019 @ 13:37:
De learning curve van K8s en Helm...
[Afbeelding]
Ik voel een Navigator komen....... En dan is het cirkeltje weer rond.gekkie schreef op donderdag 17 oktober 2019 @ 15:32:
[...]
Vandaar dat we naast de Helm nu ook nog een Rudr schijnen te hebben.
Less alienation, more cooperation.
Vind dat mensen nogal overdreven doen over de complexiteit van K8s eerlijk gezegd. Er is nogal een verschil tussen iets in een cluster moeten deployen (typische skill voor een dev) en zelf een eigen cluster op moeten tuigen (iets voor een SRE). En als dat laatste 'moeilijk' is, kan je m.i. beter die shit gewoon bij Google of AWS betrekken.plofkip schreef op donderdag 17 oktober 2019 @ 13:37:
De learning curve van K8s en Helm...
Ik heb Kubernetes workshops gegeven voor devs en over 't algemeen kregen de meesten het wel voor elkaar om binnen een paar uur een eigen Java service te deployen.
https://niels.nu
Ik hoor nu al die namen van de nieuwe tools, en ik moet gelijk weer aan dit denken: https://pixelastic.github.io/pokemonorbigdata/
🠕 This side up
Sure, maar voordat je een setup hebt zoals ik die nu wil met CI/CD, kubernetes en helm ben je wel even verder...Hydra schreef op donderdag 17 oktober 2019 @ 17:28:
[...]
Vind dat mensen nogal overdreven doen over de complexiteit van K8s eerlijk gezegd. Er is nogal een verschil tussen iets in een cluster moeten deployen (typische skill voor een dev) en zelf een eigen cluster op moeten tuigen (iets voor een SRE). En als dat laatste 'moeilijk' is, kan je m.i. beter die shit gewoon bij Google of AWS betrekken.
Ik heb Kubernetes workshops gegeven voor devs en over 't algemeen kregen de meesten het wel voor elkaar om binnen een paar uur een eigen Java service te deployen.
Ik zeg niet dat het niet mogelijk is, maar het idee achter iets als docker vond ik een stuk eenvoudiger te volgen dan alles wat kubernetes kan.
GeweldigKoenvh schreef op donderdag 17 oktober 2019 @ 19:44:
Ik hoor nu al die namen van de nieuwe tools, en ik moet gelijk weer aan dit denken: https://pixelastic.github.io/pokemonorbigdata/

Ach, ik zat daarnet te Googlen wat een SRE is

Ik kruip wel weer terug onder mijn steen.
Ask yourself if you are happy and then you cease to be.
SRE wist ik ook niet. Heeft imo niet zoveel met onder een steen leven te maken, net als dat ik het niet persé als een (basic) skill van een dev beschouw om naar een cluster te deployen. Is gewoon net een beetje in welke omgeving je werkt. Hydra zit in een grote omgeving, waar je dat soort dingen inderdaad nodig hebt. In MKB heb je weer andere skills en kennis nodig.
Ik zou denk ik in plaats daarvan een Func<IDbConnection> registreren (wellicht zelfs nog met een eigen marker-interface als IOpenedDbConnection ofzo), zodat je wat meer invloed hebt op wat je waaraan wilt meegeven.
Weet je heel zeker dat je dat wilt? Dit opent je connectie op het moment dat je IDbConnection wordt geresolved, waardoor je connectie onnodig lang open is?Lethalis schreef op donderdag 17 oktober 2019 @ 07:29:
Ik heb hem nu zo:
code:
1 2 3 4 5 6 services.AddScoped<IDbConnection>(db => { var dbConn = new SqlConnection(connectionString); dbConn.Open(); return dbConn; });
Ik open de SqlConnection om te voorkomen dat Dapper zelf de verbinding gaat managen.
Ik zou denk ik in plaats daarvan een Func<IDbConnection> registreren (wellicht zelfs nog met een eigen marker-interface als IOpenedDbConnection ofzo), zodat je wat meer invloed hebt op wat je waaraan wilt meegeven.
*zucht*
Wij zijn een nieuwe applicatie aan het ontwikkelen en praten daarbij tegen een API aan die iets voor ons moet regelen.
Nou hebben ze van die API een v2 ontwikkelt, die ook gewoon andere paden heeft en andere responses. Deze is alleen op Test en Acceptatie beschikbaar.
Dus willen wij nog met v1 praten, want wij willen naar Productie (zijn zelfs al naar productie).
Zeggen ze van die API, nee op Test en Acceptatie moet je V2 gebruiken en dan op Prod V1.
En hoe moet ik dan mijn code testen?? Op Prod??
Nee Gitflow is volgens hem het magische woord.
Wij zijn een nieuwe applicatie aan het ontwikkelen en praten daarbij tegen een API aan die iets voor ons moet regelen.
Nou hebben ze van die API een v2 ontwikkelt, die ook gewoon andere paden heeft en andere responses. Deze is alleen op Test en Acceptatie beschikbaar.
Dus willen wij nog met v1 praten, want wij willen naar Productie (zijn zelfs al naar productie).
Zeggen ze van die API, nee op Test en Acceptatie moet je V2 gebruiken en dan op Prod V1.
En hoe moet ik dan mijn code testen?? Op Prod??

Nee Gitflow is volgens hem het magische woord.

Mja daarnaast is het een typische three letter acronymBertS schreef op vrijdag 18 oktober 2019 @ 08:31:
SRE wist ik ook niet. Heeft imo niet zoveel met onder een steen leven te maken, net als dat ik het niet persé als een (basic) skill van een dev beschouw om naar een cluster te deployen. Is gewoon net een beetje in welke omgeving je werkt. Hydra zit in een grote omgeving, waar je dat soort dingen inderdaad nodig hebt. In MKB heb je weer andere skills en kennis nodig.

Mijn vriendin heeft dat op haar werk in de zorg ook met van alles. Dan hebben ze een MDO met de VSO, VPK en AIO.
En dan heb ik zoiets van "kun je ook gewoon Nederlands praten?"
Tsja, mijn idee is dat ik 1 IDbConnection gebruik gedurende 1 request en dat het niet uitmaakt in hoeveel verschillende classes ik hem nodig heb.Weet je heel zeker dat je dat wilt? Dit opent je connectie op het moment dat je IDbConnection wordt geresolved, waardoor je connectie onnodig lang open is?
Ik zou denk ik in plaats daarvan een Func<IDbConnection> registreren (wellicht zelfs nog met een eigen marker-interface als IOpenedDbConnection ofzo), zodat je wat meer invloed hebt op wat je waaraan wilt meegeven.
Op zich heb je daar natuurlijk ook connection pooling voor. Het spannende is alleen hoe je met transacties omgaat. Dus ga je bij alles wat je doet rekening houden met transacties, of ga je de situaties waarin je transacties nodig hebt simpelweg anders afhandelen?
Om even terug te komen op jouw Func<IDbConnection>. Wat ik wel een keer gedaan heb, is een class maken die een IDbConnection als property heeft. Bij de eerste keer dat een getter wordt aangeroepen op de property, dan maak ik de verbinding pas aan en vanaf dat moment wordt hij hergebruikt.
De class implementeert uiteraard ook IDisposable en sluit de IDbConnection ook.
Zou je dit dan beter vinden dan direct een IDbConnection injecten? Het komt principieel op hetzelfde neer.
Ik noem zoiets bijvoorbeeld een IDbContext die dus een IDbConnection als property heeft.
Ask yourself if you are happy and then you cease to be.
Komt dat ook niet gewoon omdat je 3 nieuwe dingen tegelijkertijd aan 't doen bent? Je hebt voor Kubernetes niet perse Helm nodig bijvoorbeeld, en Helm an sich is best wel een vreemd ding waarbij je je afvraagt of niet gewoon zelf simpelweg die resources templaten met Jinja ofzo niet beter is. Da's in ieder geval de route waar we in een vorig project (een hoop microservices met allemaal identieke deployments) voor gegaan zijn. Helm is leuk in theorie, in de praktijk is de use-case; een heel kubernetes cluster van hele diverse applicaties neerzetten, niet erg common in mijn ervaring.plofkip schreef op donderdag 17 oktober 2019 @ 20:55:
Sure, maar voordat je een setup hebt zoals ik die nu wil met CI/CD, kubernetes en helm ben je wel even verder...
Ik zeg niet dat het niet mogelijk is, maar het idee achter iets als docker vond ik een stuk eenvoudiger te volgen dan alles wat kubernetes kan.
Wat je meestal juist hebt is dat het K8s cluster specifiek voor een zooi microservices gebruikt wordt die eigenlijk allemaal precies op dezelfde manier gedeployed worden. Geen databases enzo (waar K8s sowieso niet zo geschikt voor is). Met per deployment een paar dingen die gecustomized worden (geheugen e.d.). Dan is gewoon een templating sausje over die K8s YAML files leggen veruit het simpelste. Helm is eigenlijk hetzelfde, maar dan op een nogal complexe 'eigen' manier.
Dit soort shit escaleer ik vrij snel naar een manager. Ik heb echt geen geduld meer voor dit soort dingen. Als je als developer niet inziet dat dit gewoon niet kan, vind ik dat je beter aardappels kunt gaan schillen in een gaarkeuken ofzo. Laat software engineering dan maar over aan mensen die het wel kunnen.Vincentio schreef op vrijdag 18 oktober 2019 @ 08:39:
Dus willen wij nog met v1 praten, want wij willen naar Productie (zijn zelfs al naar productie).
Zeggen ze van die API, nee op Test en Acceptatie moet je V2 gebruiken en dan op Prod V1.
En hoe moet ik dan mijn code testen?? Op Prod??
[ Voor 18% gewijzigd door Hydra op 18-10-2019 08:56 ]
https://niels.nu
2 nieuwe dingen; k8s en Helm. Azure DevOps kende ik al, alleen de yaml variant nog niet. Maar dat is allemaal niet zo bijzonder.Hydra schreef op vrijdag 18 oktober 2019 @ 08:54:
[...]
Komt dat ook niet gewoon omdat je 3 nieuwe dingen tegelijkertijd aan 't doen bent? Je hebt voor Kubernetes niet perse Helm nodig bijvoorbeeld, en Helm an sich is best wel een vreemd ding waarbij je je afvraagt of niet gewoon zelf simpelweg die resources templaten met Jinja ofzo niet beter is. Da's in ieder geval de route waar we in een vorig project (een hoop microservices met allemaal identieke deployments) voor gegaan zijn. Helm is leuk in theorie, in de praktijk is de use-case; een heel kubernetes cluster van hele diverse applicaties neerzetten, niet erg common in mijn ervaring.
Wat je meestal juist hebt is dat het K8s cluster specifiek voor een zooi microservices gebruikt wordt die eigenlijk allemaal precies op dezelfde manier gedeployed worden. Geen databases enzo (waar K8s sowieso niet zo geschikt voor is). Met per deployment een paar dingen die gecustomized worden (geheugen e.d.). Dan is gewoon een templating sausje over die K8s YAML files leggen veruit het simpelste. Helm is eigenlijk hetzelfde, maar dan op een nogal complexe 'eigen' manier.
[...]
Dit soort shit escaleer ik vrij snel naar een manager. Ik heb echt geen geduld meer voor dit soort dingen. Als je als developer niet inziet dat dit gewoon niet kan, vind ik dat je beter aardappels kunt gaan schillen in een gaarkeuken ofzo. Laat software engineering dan maar over aan mensen die het wel kunnen.
Loop er alleen tegen aan dat ik niet echt een boilerplate template kan gebruiken die alle microservices gebruiken met eigen parameters. Dat had ik in Jenkins wel voor mekaar via een template plug-in.
Wat mij erg aansprak van Helm is dat het volgens mij eenvoudiger wordt om een complete release van je applicatie met veel microservices wat centraler aan te kunnen pakken middels een umbrella chart.
En op zich vind ik Helm niet heel complex, ik vlieg het gewoon one step at a time aan. Eerst maar eens DevOps inrichten zodat de ACR gevuld wordt.
Daarna k8s descriptions maken. En dan kan ik altijd nog kijken of we daar Helm bij gaan gebruiken of niet.
Ik zit in een MKB omgevingBertS schreef op vrijdag 18 oktober 2019 @ 08:31:
SRE wist ik ook niet. Heeft imo niet zoveel met onder een steen leven te maken, net als dat ik het niet persé als een (basic) skill van een dev beschouw om naar een cluster te deployen. Is gewoon net een beetje in welke omgeving je werkt. Hydra zit in een grote omgeving, waar je dat soort dingen inderdaad nodig hebt. In MKB heb je weer andere skills en kennis nodig.

[ Voor 10% gewijzigd door plofkip op 18-10-2019 09:01 ]
Er is een reden waarom "wij" (waar ik werk) veel werk hebben. O.a. dat dit dus gebeurd en wij de clusters mogen fixenHydra schreef op donderdag 17 oktober 2019 @ 17:28:
[...]
Vind dat mensen nogal overdreven doen over de complexiteit van K8s eerlijk gezegd. Er is nogal een verschil tussen iets in een cluster moeten deployen (typische skill voor een dev) en zelf een eigen cluster op moeten tuigen (iets voor een SRE). En als dat laatste 'moeilijk' is, kan je m.i. beter die shit gewoon bij Google of AWS betrekken.
Ik heb Kubernetes workshops gegeven voor devs en over 't algemeen kregen de meesten het wel voor elkaar om binnen een paar uur een eigen Java service te deployen.
Kubernetes is gewoon complex. Dit is volgens mij een definitie.
Ja, het is simpel om een yaml copy/paste op je cluster te flikkeren maar dan hebben we het niet meer zo zeer over k8s complexiteit. Die complexiteit zit hem uiteindelijk in observability en alle tools/software die je daarbij benodigd hebt, security, tenzij je gewoon yolo rbac'd (wat 99% van de mensen doen..). Het stukje CI/CD, vaults, en de automation & audits hiervan.
Want ja, ik zet ook in 5 min een cluster op GKE op met een ingress en een web app en done. Maar dat is 1% van wat k8s is en hoort te zijn in een gedegen prod omgeving.
Net zoals ik vaak zie dat men maar handmatig een soort vercrackte helm chart gebruiken om iets te deployen, public images gebruiken en whatnot.
Nog niet te spreken om k8s netjes op baremetal te zetten waar dat soms vereist is natuurlijk
---------
Vergeet alleen ook je eigen kennis niet. Voor sommige is niet eens 3 jaar geleden dat ze met FTP dingen online zetten. Niet om dat goed te praten maar af en toe is het niveau in de algemene zin erg laag. Voor k8s heb je eigenlijk wel een andere mindset benodigd, afhankelijk waar je vandaan komt. "12 factor app" is vaak nog zeer onbekend.
Heeft iemand een enige basis, dan kan je zeker binnen korte tijd iets met k8s doen, maar als we het echt hebben over production en dat alles "goed" is - dat is soms maanden werk.
Wel mooi dat je hier weer een mooi voorbeeld ziet van "who gets called at 2 am" als het omgevallen is.
Als je het zelf niet snapt moet je er ook geen software op draaien denk ik. Gewoon om je beheerders te vriend te houden.
Om een Microfoon in Linux te gebruiken is geen sinecure onder .Net zeg, jemig. Heb nu maar gewoon Unity 3d gepakt en in 5 min heb ik WAV files die ik DeepSpeech in kan lazeren.
Soms wil je gewoon dat het werkt.
Als je het zelf niet snapt moet je er ook geen software op draaien denk ik. Gewoon om je beheerders te vriend te houden.
Om een Microfoon in Linux te gebruiken is geen sinecure onder .Net zeg, jemig. Heb nu maar gewoon Unity 3d gepakt en in 5 min heb ik WAV files die ik DeepSpeech in kan lazeren.
Soms wil je gewoon dat het werkt.
[ Voor 32% gewijzigd door Sandor_Clegane op 18-10-2019 13:06 ]
Less alienation, more cooperation.
Wat ik dus aangaf is een cluster zelf opbouwen en onderhouden een heel ander verhaal dan er dingen in deployen. Als het bouwen / onderhouden van een cluster complex is, waarom het dan zelf doen? Ik snap dat nooit zo; dan ben je beter af met een cluster van een cloud provider. Dan zijn er echt wel zaken om rekening mee te houden, maar ook zaken als security zijn gewoon ingebouwd. In ieder geval wel toen ik vorig jaar nog zelf met Google Cloud een kubernetes pilot gestart ben.Douweegbertje schreef op vrijdag 18 oktober 2019 @ 12:34:
Er is een reden waarom "wij" (waar ik werk) veel werk hebben. O.a. dat dit dus gebeurd en wij de clusters mogen fixen
Kubernetes is gewoon complex. Dit is volgens mij een definitie.
Maar dat heeft toch weinig met K8s te maken? Hoe je services bij je secrets komen, is iets waar je met je eigen hardware volledig bare-metal werken net zo goed over na moet denken. CI/CD net zo goed; heeft wederom geen fluit met K8s zelf te maken. Het zal zo'n cluster een worst wezen als je alles met de hand deployed.Ja, het is simpel om een yaml copy/paste op je cluster te flikkeren maar dan hebben we het niet meer zo zeer over k8s complexiteit. Die complexiteit zit hem uiteindelijk in observability en alle tools/software die je daarbij benodigd hebt, security, tenzij je gewoon yolo rbac'd (wat 99% van de mensen doen..). Het stukje CI/CD, vaults, en de automation & audits hiervan.
Ik denk dat daar de crux zit: mensen die vanuit hele oude outdated gebruiken opeens naar het nieuwste van het nieuwste gaan. Als je 10 jaar achterloopt en dan ineens een enorme inhaalslag gaat maken, dus EN CI/CD, EN docker, EN k8s, dan heb je dus een jaar of 10 in te halen. Maar dat heeft niks met k8s te maken. In ieder geval, naar mijn mening.Vergeet alleen ook je eigen kennis niet. Voor sommige is niet eens 3 jaar geleden dat ze met FTP dingen online zetten.
Kubernetes zelf is weinig meer dan een orchestration en security laagje bovenop docker. En natuurlijk is zelf een cluster bouwen aardig wat werk, maar dat moet je m.i. gewoon lekker aan Google/AWS overlaten.
https://niels.nu
Mwoah, het is wel handig dat je een beetje weet hoe het werkt anders zijn straks de containers weer de nieuwe S3 buckets met read:everyone.....Hydra schreef op vrijdag 18 oktober 2019 @ 13:05:
[...]
Wat ik dus aangaf is een cluster zelf opbouwen en onderhouden een heel ander verhaal dan er dingen in deployen. Als het bouwen / onderhouden van een cluster complex is, waarom het dan zelf doen? Ik snap dat nooit zo; dan ben je beter af met een cluster van een cloud provider. Dan zijn er echt wel zaken om rekening mee te houden, maar ook zaken als security zijn gewoon ingebouwd. In ieder geval wel toen ik vorig jaar nog zelf met Google Cloud een kubernetes pilot gestart ben.
[...]
Maar dat heeft toch weinig met K8s te maken? Hoe je services bij je secrets komen, is iets waar je met je eigen hardware volledig bare-metal werken net zo goed over na moet denken. CI/CD net zo goed; heeft wederom geen fluit met K8s zelf te maken. Het zal zo'n cluster een worst wezen als je alles met de hand deployed.
[...]
Ik denk dat daar de crux zit: mensen die vanuit hele oude outdated gebruiken opeens naar het nieuwste van het nieuwste gaan. Als je 10 jaar achterloopt en dan ineens een enorme inhaalslag gaat maken, dus EN CI/CD, EN docker, EN k8s, dan heb je dus een jaar of 10 in te halen. Maar dat heeft niks met k8s te maken. In ieder geval, naar mijn mening.
Kubernetes zelf is weinig meer dan een orchestration en security laagje bovenop docker. En natuurlijk is zelf een cluster bouwen aardig wat werk, maar dat moet je m.i. gewoon lekker aan Google/AWS overlaten.
Less alienation, more cooperation.
Is wat voor te zeggen, maar dat is wel gegeven je huidige situatie. Heb je garantie dat die class altijd alleen maar vanuit een single request gebruikt wordt?Lethalis schreef op vrijdag 18 oktober 2019 @ 08:52:
[...]
Tsja, mijn idee is dat ik 1 IDbConnection gebruik gedurende 1 request en dat het niet uitmaakt in hoeveel verschillende classes ik hem nodig heb.
Voor je het weet zit'ie ook in een backend-service en staat'ie lange tijd open.
De scope van transacties wil je zo klein mogelijk houden. Wanneer zou die class-overstijgend zijn? Je hebt ergens een 'commit', waar je met OpenConnection->BeginTransaction->DoCommit->CommitTransaction->CloseConnection de hele riedel afhandelt. Als je een transactie gaat meegeven als parameter naar andere classes, waar heb je dan nog garantie dat die transactie ook gecommit wordt? Ik kan me er geen goede casus bij voorstellen zo?Lethalis schreef op vrijdag 18 oktober 2019 @ 08:52:
[...]
Op zich heb je daar natuurlijk ook connection pooling voor. Het spannende is alleen hoe je met transacties omgaat. Dus ga je bij alles wat je doet rekening houden met transacties, of ga je de situaties waarin je transacties nodig hebt simpelweg anders afhandelen?
Dat komt effectief op hetzelfde neer inderdaad, het is beide Lazy. Dat lijkt me zonder twijfel beter dan een geopende connectie injecten.Lethalis schreef op vrijdag 18 oktober 2019 @ 08:52:
[...]
Om even terug te komen op jouw Func<IDbConnection>. Wat ik wel een keer gedaan heb, is een class maken die een IDbConnection als property heeft. Bij de eerste keer dat een getter wordt aangeroepen op de property, dan maak ik de verbinding pas aan en vanaf dat moment wordt hij hergebruikt.
De class implementeert uiteraard ook IDisposable en sluit de IDbConnection ook.
Zou je dit dan beter vinden dan direct een IDbConnection injecten? Het komt principieel op hetzelfde neer.
Ik noem zoiets bijvoorbeeld een IDbContext die dus een IDbConnection als property heeft.
Hmmm... Op zoek naar een collega voor mij.
Onze recruitment afdeling is niet thuis in IT, dus hebben het uitbesteed aan.... starapple
Ik ken ze met name vanwege hun slechte naam. Nu een CV doorgestuurd gekregen waar ik niet op voorhand om sta te juichen. Recruitment afdeling heeft al een afspraak ingepland dus ik ga het maar met open vizier tegemoet. Nog iemand tips?
Onze recruitment afdeling is niet thuis in IT, dus hebben het uitbesteed aan.... starapple

Ik ken ze met name vanwege hun slechte naam. Nu een CV doorgestuurd gekregen waar ik niet op voorhand om sta te juichen. Recruitment afdeling heeft al een afspraak ingepland dus ik ga het maar met open vizier tegemoet. Nog iemand tips?
Tjolk is lekker. overal en altijd.
Als de CV in StarApple formaat is, is deze mogelijk aangepast. Check of de kandidaat daadwerkelijk de competenties heeft zoals op de CV staan.Tjolk schreef op vrijdag 18 oktober 2019 @ 13:51:
Hmmm... Op zoek naar een collega voor mij.
Onze recruitment afdeling is niet thuis in IT, dus hebben het uitbesteed aan.... starapple
Ik ken ze met name vanwege hun slechte naam. Nu een CV doorgestuurd gekregen waar ik niet op voorhand om sta te juichen. Recruitment afdeling heeft al een afspraak ingepland dus ik ga het maar met open vizier tegemoet. Nog iemand tips?
Stel je hebt een CustomerRepository waarmee je klantgegevens kunt ophalen en updaten, die gebruikt wordt vanuit een OrderController. Op zo'n moment wil je de verwerking van de order volledig transactioneel hebben, en toch ook graag klantgegevens ophalen / updaten binnen deze transactie bijvoorbeeld.BertS schreef op vrijdag 18 oktober 2019 @ 13:34:
[...]
De scope van transacties wil je zo klein mogelijk houden. Wanneer zou die class-overstijgend zijn?
Dit is even een hypothetisch voorbeeld, maar je wil sommige classes / functies vaak wel vanuit meerdere plekken kunnen gebruiken.
Met een IDbContext kun je dit soort dingen afvangen, omdat deze naast de IDbConnection ook een IDbTransaction vast zou kunnen houden. Aan de andere kant kun je dit ook allemaal overboord gooien en de IDbConnection en IDbTransaction als parameters aan een UpdateCustomer functie meegeven.
Het is simpel en to the point. En nog maar de vraag of ik het ooit door iets anders ga vervangen. Ik krijg nu namelijk ook allemaal nietszeggende interfaces zoals ICustomerRepository die maar 1 implementatie heeft.
In een functionele programmeertaal zou je zeggen dat het IDbConnection, IDbTransaction -> Customer wordt en dat dit deel van de interface is. Dat impliceert wellicht ook dat het niet logisch is om deze waarden te injecten, maar dat het parameters moeten zijn.
Ik wil dingen "netjes" doen nu ik met .NET Core features zoals DI heb, maar ik moet tegelijkertijd wel zeggen dat het er niet per se beter van wordt (beter leesbaar, onderhoudbaar, etc).
Heb ik nog wel iets aan het Repository pattern? (ik gebruik wel Dapper en geen ORM als EF, die an sich al een abstractie is en waarbij het Repository pattern vaak afgeraden wordt)
Of doe ik er gewoon goed aan om mijn data access functies zaken als de IDbConnection en IDbTransaction simpelweg als parameter mee te geven?
Overengineering is ook slecht natuurlijk. Want ik kan natuurlijk wel een IDbContext maken die naast een IDbConnection ook een IDbTransaction vasthoudt etc, maar het gevoel bekruipt me dat ik nu iets betrekkelijk simpels alleen maar ingewikkelder aan het maken ben

Maybe I should keep it simple. Too much indirection is also bad.
Waarom moet de recruitment afdeling per se thuis zijn in IT? Omdat ze niet genoeg communiceren met jullie?Tjolk schreef op vrijdag 18 oktober 2019 @ 13:51:
Hmmm... Op zoek naar een collega voor mij.
Onze recruitment afdeling is niet thuis in IT, dus hebben het uitbesteed aan.... starapple
Ik ken ze met name vanwege hun slechte naam. Nu een CV doorgestuurd gekregen waar ik niet op voorhand om sta te juichen. Recruitment afdeling heeft al een afspraak ingepland dus ik ga het maar met open vizier tegemoet. Nog iemand tips?
Ik neem aan dat jij wel een net lijstje kan maken met wat een kandidaat moet kunnen. Vervolgens kunnen zij het gewoon op diverse kanalen plaatsen (website, job boards, LinkedIn, Facebook, etc).
Wat denken ze dat een StarApple gaat doen dat zij niet kunnen?
[ Voor 15% gewijzigd door Lethalis op 18-10-2019 15:22 ]
Ask yourself if you are happy and then you cease to be.
Klein reclameblokje. Maar voor Devschuur wel relevant. We zijn een tijdje geleden begonnen met een Nederlandstalige podcast voor developers. Er staan inmiddels twee afleveringen online. Aflevering 3 hebben we net opgenomen, en zal begin volgende week online komen. Die aflevering gaat over AR/VR development. Oh en we verloten dan ook een licentie voor een Jetbrains IDE naar keus. Dus sowieso de moeite waard
We richten ons op alle developers, dus niet alleen een specifiek platform of type. We willen juist allerlei soorten developers de revue laten passeren. Inhoudelijk en luchtig.
Url staat in mijn signature. Maar voor de zekerheid : CodeKlets Podcast
P.S. Aflevering 1 hebben we audio issues gehad. Helaas. Kishen (host) valt vaak weg qua audio. We beloven dat we niet meer doen. Ondanks de audio was het wel een leuke aflevering.
We richten ons op alle developers, dus niet alleen een specifiek platform of type. We willen juist allerlei soorten developers de revue laten passeren. Inhoudelijk en luchtig.
Url staat in mijn signature. Maar voor de zekerheid : CodeKlets Podcast
P.S. Aflevering 1 hebben we audio issues gehad. Helaas. Kishen (host) valt vaak weg qua audio. We beloven dat we niet meer doen. Ondanks de audio was het wel een leuke aflevering.
Dè developers podcast in je moerstaal : CodeKlets Podcast
Nice. Misschien ook leuk om ze op Spotify te zetten?OMX2000 schreef op vrijdag 18 oktober 2019 @ 15:21:
Klein reclameblokje. Maar voor Devschuur wel relevant. We zijn een tijdje geleden begonnen met een Nederlandstalige podcast voor developers. Er staan inmiddels twee afleveringen online. Aflevering 3 hebben we net opgenomen, en zal begin volgende week online komen. Die aflevering gaat over AR/VR development. Oh en we verloten dan ook een licentie voor een Jetbrains IDE naar keus. Dus sowieso de moeite waard![]()
We richten ons op alle developers, dus niet alleen een specifiek platform of type. We willen juist allerlei soorten developers de revue laten passeren. Inhoudelijk en luchtig.
Url staat in mijn signature. Maar voor de zekerheid : CodeKlets Podcast
P.S. Aflevering 1 hebben we audio issues gehad. Helaas. Kishen (host) valt vaak weg qua audio. We beloven dat we niet meer doen. Ondanks de audio was het wel een leuke aflevering.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!
Daar staan we alAntrax schreef op vrijdag 18 oktober 2019 @ 15:29:
[...]
Nice. Misschien ook leuk om ze op Spotify te zetten?
https://open.spotify.com/show/0Sf8c3aGZmtGiNUEwgDTSu
[ Voor 8% gewijzigd door OMX2000 op 18-10-2019 15:38 ]
Dè developers podcast in je moerstaal : CodeKlets Podcast
Recruitment is thuis in het hoofdstuk waar ik zo'n 180 collega's in heb (and counting). Da's de grote geldmachine hier en hun focus waarvoor ze al lastig de vraag kunnen bijbenen. Ik ben alleen en lever niet zoveel op in verhoudingLethalis schreef op vrijdag 18 oktober 2019 @ 15:09:
[...]
Waarom moet de recruitment afdeling per se thuis zijn in IT? Omdat ze niet genoeg communiceren met jullie?
Ik neem aan dat jij wel een net lijstje kan maken met wat een kandidaat moet kunnen. Vervolgens kunnen zij het gewoon op diverse kanalen plaatsen (website, job boards, LinkedIn, Facebook, etc).
Wat denken ze dat een StarApple gaat doen dat zij niet kunnen?
Oftewel: kost teveel tijd.
Tjolk is lekker. overal en altijd.
Als je een micro-ORM zoals Dapper gebruikt, kan een repository pattern wel zijn voordelen hebben.Lethalis schreef op vrijdag 18 oktober 2019 @ 15:09:
[...]
Heb ik nog wel iets aan het Repository pattern? (ik gebruik wel Dapper en geen ORM als EF, die an sich al een abstractie is en waarbij het Repository pattern vaak afgeraden wordt)
Of doe ik er gewoon goed aan om mijn data access functies zaken als de IDbConnection en IDbTransaction simpelweg als parameter mee te geven?
Overengineering is ook slecht natuurlijk. Want ik kan natuurlijk wel een IDbContext maken die naast een IDbConnection ook een IDbTransaction vasthoudt etc, maar het gevoel bekruipt me dat ik nu iets betrekkelijk simpels alleen maar ingewikkelder aan het maken benEn niet per se flexibeler, want zodra je met meerdere nested transacties aan de slag moet, werkt het niet meer.
Maybe I should keep it simple. Too much indirection is also bad.
Echter, ik kijk de laatste tijd meer en meer naar een sliced architectuur.
Bij EF of NH zit je idd al met een DbContext of ISession die een UnitOfWork voorstelt, en zeker bij EF heb je met LINQ al een mooie abstractie over je DB. Ik vind het dan beter om Command and Query classes te hebben ipv een repository pattern. (Da's zo 2005
https://fgheysels.github.io/
Je krijgt dan echter weer een explosie van het aantal Command and Query classes.whoami schreef op vrijdag 18 oktober 2019 @ 15:51:
[...]
Als je een micro-ORM zoals Dapper gebruikt, kan een repository pattern wel zijn voordelen hebben.
Echter, ik kijk de laatste tijd meer en meer naar een sliced architectuur.
Bij EF of NH zit je idd al met een DbContext of ISession die een UnitOfWork voorstelt, en zeker bij EF heb je met LINQ al een mooie abstractie over je DB. Ik vind het dan beter om Command and Query classes te hebben ipv een repository pattern. (Da's zo 2005)
Voor zaken die in essentie gewoon functies zijn.
Maar goed, ik zou dus zelf een UnitOfWork pattern kunnen implementeren, of Repositories helemaal niet gebruiken. Maar in dat laatste geval wil ik alsnog mijn queries e.d. kunnen hergebruiken en kun je als simpel alternatief een CustomerFunctions class kunnen maken met bijvoorbeeld GetCustomer(int customerId, IDbConnection dbConnection, IDbTransaction dbTransaction = null).
Dan zijn we wel terug in 2002 ofzo
Ask yourself if you are happy and then you cease to be.
Als je maar ver genoeg abstraheert wordt het mouseclick -> moneyInTheBankLethalis schreef op vrijdag 18 oktober 2019 @ 15:09:
[...]
Stel je hebt een CustomerRepository waarmee je klantgegevens kunt ophalen en updaten, die gebruikt wordt vanuit een OrderController. Op zo'n moment wil je de verwerking van de order volledig transactioneel hebben, en toch ook graag klantgegevens ophalen / updaten binnen deze transactie bijvoorbeeld.
Dit is even een hypothetisch voorbeeld, maar je wil sommige classes / functies vaak wel vanuit meerdere plekken kunnen gebruiken.
Met een IDbContext kun je dit soort dingen afvangen, omdat deze naast de IDbConnection ook een IDbTransaction vast zou kunnen houden. Aan de andere kant kun je dit ook allemaal overboord gooien en de IDbConnection en IDbTransaction als parameters aan een UpdateCustomer functie meegeven.
Het is simpel en to the point. En nog maar de vraag of ik het ooit door iets anders ga vervangen. IIs dat dat object.Methode().Methode().Methode()?
Je geeft na elke methode aanroep gewoon this terug en dan kun je volgende methode op het object weer aanroepen. k krijg nu namelijk ook allemaal nietszeggende interfaces zoals ICustomerRepository die maar 1 implementatie heeft.
In een functionele programmeertaal zou je zeggen dat het IDbConnection, IDbTransaction -> Customer wordt en dat dit deel van de interface is. Dat impliceert wellicht ook dat het niet logisch is om deze waarden te injecten, maar dat het parameters moeten zijn.
Ik wil dingen "netjes" doen nu ik met .NET Core features zoals DI heb, maar ik moet tegelijkertijd wel zeggen dat het er niet per se beter van wordt (beter leesbaar, onderhoudbaar, etc).
Heb ik nog wel iets aan het Repository pattern? (ik gebruik wel Dapper en geen ORM als EF, die an sich al een abstractie is en waarbij het Repository pattern vaak afgeraden wordt)
Of doe ik er gewoon goed aan om mijn data access functies zaken als de IDbConnection en IDbTransaction simpelweg als parameter mee te geven?
Overengineering is ook slecht natuurlijk. Want ik kan natuurlijk wel een IDbContext maken die naast een IDbConnection ook een IDbTransaction vasthoudt etc, maar het gevoel bekruipt me dat ik nu iets betrekkelijk simpels alleen maar ingewikkelder aan het maken benEn niet per se flexibeler, want zodra je met meerdere nested transacties aan de slag moet, werkt het niet meer.
Maybe I should keep it simple. Too much indirection is also bad.
[...]
Waarom moet de recruitment afdeling per se thuis zijn in IT? Omdat ze niet genoeg communiceren met jullie?
Ik neem aan dat jij wel een net lijstje kan maken met wat een kandidaat moet kunnen. Vervolgens kunnen zij het gewoon op diverse kanalen plaatsen (website, job boards, LinkedIn, Facebook, etc).
Wat denken ze dat een StarApple gaat doen dat zij niet kunnen?
Volgens mij heb je een beetje last van analysis paralysis.
[ Voor 3% gewijzigd door Sandor_Clegane op 18-10-2019 17:37 ]
Less alienation, more cooperation.
Jij houdt van die term, meestal gevolgd door "als je nou F# gebruikt, dan..."Sandor_Clegane schreef op vrijdag 18 oktober 2019 @ 17:36:
[...]
Als je maar ver genoeg abstraheert wordt het mouseclick -> moneyInTheBank
Volgens mij heb je een beetje last van analysis paralysis.
Al neig ik soms wel naar ouderwets rechttoe rechtaan programmeren met functies. Want dan ben ik veel productiever.
Zolang die functies puur zijn en gestructureerd, is daar ook weinig mis mee. Want dan zijn ze nog steeds goed te testen, vinden, hergebruiken etc.
Ik kan mijn collega's geen F# aandoen, dus het moet wel in C#
[ Voor 6% gewijzigd door Lethalis op 18-10-2019 21:02 ]
Ask yourself if you are happy and then you cease to be.
Dat bedoelde ik er niet mee, ik wil niemand wat opdringen.Lethalis schreef op vrijdag 18 oktober 2019 @ 20:59:
[...]
Jij houdt van die term, meestal gevolgd door "als je nou F# gebruikt, dan..."![]()
Al neig ik soms wel naar ouderwets rechttoe rechtaan programmeren met functies. Want dan ben ik veel productiever.
Zolang die functies puur zijn en gestructureerd, is daar ook weinig mis mee. Want dan zijn ze nog steeds goed te testen, vinden, hergebruiken etc.
Ik kan mijn collega's geen F# aandoen, dus het moet wel in C#
Less alienation, more cooperation.
Ik heb ook wel last van een soort writers block. De beste oplossing is misschien wel gewoon back to basics en gewoon ouderwets code kloppen.Sandor_Clegane schreef op vrijdag 18 oktober 2019 @ 21:03:
[...]
Dat bedoelde ik er niet mee, ik wil niemand wat opdringen.
Het is veel belangrijker dat ik mijn werkgever en klanten happy hou dan dat ik code heb die hoogstaand is. Ten eerste ziet en waardeert niemand dat verder, ten tweede krijg ik er stress van als ik niet genoeg vooruitgang boek qua functionaliteit.
Zolang ik aan het eind van elke week tegen mezelf en anderen kan zeggen van "kijk, ik heb deze en deze functionaliteit toegevoegd" en dat kan laten zien, dan is er tastbare vooruitgang.
En daar voel ik mij meestal het beste bij.
Ask yourself if you are happy and then you cease to be.
Ik denk dat je een tussenweg moet vinden. Een klant-specifiek product waarbij de kans groot is dat de code die je nu schrijft, 6 jaar gebruikt wordt en daarna afzinkt, is een ander verhaal dan een product waarvan je weet dat je de komende jaren daar nog regelmatig aan ontwikkeld. "Gelukkig" (dat vind ik het leukste... vandaar gelukkig) doe ik vooral het 1e, en vind ik kwaliteit van code ondergeschikt aan functionaliteit en toekomstbestendigheid. Ik kan het makkelijker verkopen dat ik over 3 jaar misschien 2 dagen extra nodig heb om bepaalde functies toe te voegen, dan dat ik nu extra tijd kwijt ben aan iets dat je niet ziet. Al is het nooit zo zwart-wit natuurlijk, sommige dingen kosten net zoveel tijd om het direct "mooi en netjes" te doen. Maar extra classes en interfaces "omdat het zo hoort en je in de toekomst daarom veel makkelijker en sneller functies kunt toevoegen" is voor mijn klanten en opdrachten meestal overkill, tijdsverspilling en daarnee kapitaalverspilling.Lethalis schreef op zaterdag 19 oktober 2019 @ 08:58:
Het is veel belangrijker dat ik mijn werkgever en klanten happy hou dan dat ik code heb die hoogstaand is. Ten eerste ziet en waardeert niemand dat verder, ten tweede krijg ik er stress van als ik niet genoeg vooruitgang boek qua functionaliteit.
Exact expert nodig?
YAGNI.Crazy D schreef op zaterdag 19 oktober 2019 @ 09:17:
[...]
Ik denk dat je een tussenweg moet vinden. Een klant-specifiek product waarbij de kans groot is dat de code die je nu schrijft, 6 jaar gebruikt wordt en daarna afzinkt, is een ander verhaal dan een product waarvan je weet dat je de komende jaren daar nog regelmatig aan ontwikkeld. "Gelukkig" (dat vind ik het leukste... vandaar gelukkig) doe ik vooral het 1e, en vind ik kwaliteit van code ondergeschikt aan functionaliteit en toekomstbestendigheid. Ik kan het makkelijker verkopen dat ik over 3 jaar misschien 2 dagen extra nodig heb om bepaalde functies toe te voegen, dan dat ik nu extra tijd kwijt ben aan iets dat je niet ziet. Al is het nooit zo zwart-wit natuurlijk, sommige dingen kosten net zoveel tijd om het direct "mooi en netjes" te doen. Maar extra classes en interfaces "omdat het zo hoort en je in de toekomst daarom veel makkelijker en sneller functies kunt toevoegen" is voor mijn klanten en opdrachten meestal overkill, tijdsverspilling en daarnee kapitaalverspilling.
Less alienation, more cooperation.
Het is nog maar de vraag op welk punt het nou echt iets oplevert ten opzichte van het schrijven van herbruikbare functies.Crazy D schreef op zaterdag 19 oktober 2019 @ 09:17:
[...]
Ik denk dat je een tussenweg moet vinden.
Je kan een ICustomerRepository hebben met een implementatie, die je in de toekomst makkelijk door een andere kan vervangen.
Maar je kan ook gewoon een CustomerFunctions.GetCustomer(...) functie hebben die je met een eenvoudige replace kan vervangen door CustomerFunctions.GetCustomerV2(...).
Het is niet per definitie zo dat het qua onderhoudbaarheid iets oplevert.
Bovendien snapt elke jojo wat er gebeurt als je simpelweg een functie aanroept. Terwijl als je 5 jaar later naar al die abstracties en interfaces kijkt, ben je de hele tijd aan het puzzelen wat er nou echt gebeurt. En vooral ook waar.
Ik trap er alleen elke keer weer in dat ik dingen netter wil maken dan nodig is.
Iets kan nog steeds gestructureerd zijn zonder allemaal fancy dingen.
Ask yourself if you are happy and then you cease to be.
Ik denk dat er genoeg voorbeelden te bedenken zijn (niet theoretisch, maar praktisch) waarin de ICustomerRepo duidelijk meerwaarde biedt. En net zoveel praktijksituaties waarin dat geen extra voordeel biedt. Dat is de afweging.Lethalis schreef op zaterdag 19 oktober 2019 @ 10:48:
Je kan een ICustomerRepository hebben met een implementatie, die je in de toekomst makkelijk door een andere kan vervangen.
Exact expert nodig?
Voor mij is het precies omgekeerd: ik ben bij een bedrijf gaan werken met een eigen product, onder andere ook omdat je dan tijd krijgt om dingen goed te doen. We doen vaak eerst een matige snelle oplossing gekoppeld aan een A/B test en dan, als de feature positief ontvangen wordt, dan wordt het netjes geïmplementeerd, met meer tijd, maar dan is de business case al gemaakt. Het komt wel eens voor dat een code review leidt tot een opmerking dat we iets toch echt moeten refactoren en dan wordt daar een ticket voor gemaakt en ergens in een volgende sprint ingepland.Crazy D schreef op zaterdag 19 oktober 2019 @ 09:17:
[...]
Ik denk dat je een tussenweg moet vinden. Een klant-specifiek product waarbij de kans groot is dat de code die je nu schrijft, 6 jaar gebruikt wordt en daarna afzinkt, is een ander verhaal dan een product waarvan je weet dat je de komende jaren daar nog regelmatig aan ontwikkeld. "Gelukkig" (dat vind ik het leukste... vandaar gelukkig) doe ik vooral het 1e, en vind ik kwaliteit van code ondergeschikt aan functionaliteit en toekomstbestendigheid. Ik kan het makkelijker verkopen dat ik over 3 jaar misschien 2 dagen extra nodig heb om bepaalde functies toe te voegen, dan dat ik nu extra tijd kwijt ben aan iets dat je niet ziet. Al is het nooit zo zwart-wit natuurlijk, sommige dingen kosten net zoveel tijd om het direct "mooi en netjes" te doen. Maar extra classes en interfaces "omdat het zo hoort en je in de toekomst daarom veel makkelijker en sneller functies kunt toevoegen" is voor mijn klanten en opdrachten meestal overkill, tijdsverspilling en daarnee kapitaalverspilling.
Ik ben zelf ooit begonnen in webdevelopment en dan had je wel eens projecten van 8.000 euro ofzo en daar zit natuurljk erg weinig ruimte in om dingen te verbeteren. Maar goed, we hadden genoeg klanten die een website gewoon afschrijven in een paar jaar en dan een nieuwe inkopen, met een nieuwe code base. Dus dan is er geen sprake van jaren onderhoud en de dingen netjes achter laten voor de developer die na jou komt.
De enige reden die ik kan bedenken is als je vaak tussen meerdere implementaties wil switchen, of simpelweg meerdere wil ondersteunen en dat configureerbaar in het product is.Crazy D schreef op zaterdag 19 oktober 2019 @ 10:53:
[...]
Ik denk dat er genoeg voorbeelden te bedenken zijn (niet theoretisch, maar praktisch) waarin de ICustomerRepo duidelijk meerwaarde biedt. En net zoveel praktijksituaties waarin dat geen extra voordeel biedt. Dat is de afweging.
Functioneel gezien dus dat je klantgegevens uit meerdere bronnen kunt gebruiken.
Komen ze echter altijd uit dezelfde database en gaat dat praktisch nooit veranderen... tsja.
En natuurlijk zal je als OOP fanboy dan zeggen dat er diverse design patterns zijn waardoor je transparant een object kunt wrappen en bijvoorbeeld logging / caching / whatever kunt toevoegen, maar is dat wel handig?
Want in feite verstop je code dan ook. Mensen zoeken zich jaren later de rambam om dat dan te vinden.
Ik heb aardig wat design patterns versleten de afgelopen jaren en bijna altijd dacht ik later "waarom heb ik dit in vredesnaam zo ingewikkeld gemaakt?"

Plus dat mijn collega's veel minder thuis zijn er in, dus die nemen het mij ook niet in dank af.
Indirection maakt code moeilijker te begrijpen. Hoe mooi het in theorie ook is.
Ask yourself if you are happy and then you cease to be.
Het is natuurlijk ook zo dat velen van ons hier gewoon in de business software zitten en niet in de fundamentele frameworks. Wij hebben vaak niet te maken met vele duizenden andere ontwikkelaars die onze interfaces gebruiken, met vele dynamische wensen. Zaken als een uiterst stabiele API / interface, uitbreidbaarheid op alle vlakken, ondersteuning van vele platformen en ga zo maar door leggen veel meer druk op goed geschreven software met de juiste design patterns.Lethalis schreef op zaterdag 19 oktober 2019 @ 11:04:
[...]
De enige reden die ik kan bedenken is als je vaak tussen meerdere implementaties wil switchen, of simpelweg meerdere wil ondersteunen en dat configureerbaar in het product is.
Functioneel gezien dus dat je klantgegevens uit meerdere bronnen kunt gebruiken.
Komen ze echter altijd uit dezelfde database en gaat dat praktisch nooit veranderen... tsja.
En natuurlijk zal je als OOP fanboy dan zeggen dat er diverse design patterns zijn waardoor je transparant een object kunt wrappen en bijvoorbeeld logging / caching / whatever kunt toevoegen, maar is dat wel handig?
Want in feite verstop je code dan ook. Mensen zoeken zich jaren later de rambam om dat dan te vinden.
Ik heb aardig wat design patterns versleten de afgelopen jaren en bijna altijd dacht ik later "waarom heb ik dit in vredesnaam zo ingewikkeld gemaakt?"![]()
Plus dat mijn collega's veel minder thuis zijn er in, dus die nemen het mij ook niet in dank af.
Indirection maakt code moeilijker te begrijpen. Hoe mooi het in theorie ook is.
Niets zo frustrerend als een library of framework dat bij een major version upgrade haar interfaces volledig op de kop gooit.
Refactoren, interfaces herzien en meer van dat soort zaken zijn een stuk eenvoudiger als hoofdzakelijk of zelfs alleen je eigen team gebruikt maakt van interfaces. Het is handig als je kunt anticiperen op toekomstige uitbreidbaarheid en de grote architecturale hoofdlijnen zorgen dat je niet heel hard tegen schaalbaarheidsissues aanloopt, maar al te puristisch zijn is vaak om meerdere redenen niet handig.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Nou, waar ik werkte hadden we alle starapple telefoonnummers geblokkeerd en een email block gemaakt.Tjolk schreef op vrijdag 18 oktober 2019 @ 13:51:
Hmmm... Op zoek naar een collega voor mij.
Onze recruitment afdeling is niet thuis in IT, dus hebben het uitbesteed aan.... starapple
Ik ken ze met name vanwege hun slechte naam. Nu een CV doorgestuurd gekregen waar ik niet op voorhand om sta te juichen. Recruitment afdeling heeft al een afspraak ingepland dus ik ga het maar met open vizier tegemoet. Nog iemand tips?
Als er 1 pauper partij is, is het starapple wel.
Dus qua tip, lol. Ik zou er nog even neutraal in gaan omwille van de sollicitant maar misschien daarna toch eens met HR praten vanwege hun keuzes.
Dit topic is gesloten.
Let op:
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.
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.