Die is wel goed bedacht ja. Laten ze vooral @random tekens verzinnen voor functionaliteiten die al in andere talen bestaan en daar met andere karakters worden geïnitieerd. Toch blijf ik php wel gebruiken hoorHacku schreef op woensdag 25 maart 2009 @ 23:22:
Ik weet niet of het hier thuishoort, maar php 5.3 zal namespaces introduceren. Hebben jullie de syntax al gezien? Backslash (\) als separator
PHP:
1 namespace Foo\Bar;
Die zijn al in gebruik (al weet ik te weinig van php om te bepalen of beide ook dubbel gebruikt kunnen worden):Verwijderd schreef op woensdag 25 maart 2009 @ 23:25:
Want :: of . is natuurlijk saai. Dat doen al die andere talen al.
1
2
3
4
5
| $concat = $string1 . $string2; class Test{ public static function foo(){ echo 'Bar'; } } Test::foo(); |
1
2
3
4
5
6
7
8
9
10
11
12
13
| define ("foo", "constant"); function foo() { return "function"; } class foo { function __construct() { echo "class"; } } namespace foo { $var = 3; } echo foo; echo foo(); new foo(); echo foo\$var; |
Woei

[ Voor 3% gewijzigd door .oisyn op 25-03-2009 23:37 ]
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.
Die heb ik gemist, heb je de url nog ergens?Daar is hier al een topic over gevoerd.
Ik droom nog steeds van deze constructie:Woei
1
2
3
4
5
6
7
8
9
| function blaat () { return array ( 'test', 'test2' ); } echo blaat()[0]; // werkt niet $temp = blaat(); echo $temp[0]; // werkt wel |
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
PHP Namespaces
Hier nog het document met de proposal.
Is dat dan by design zo? Ik heb er inderdaad wel last van, maar heb me er nooit zo druk om gemaakt[...]
Ik droom nog steeds van deze constructie:
PHP:
1 2 3 4 5 6 7 8 9 function blaat () { return array ( 'test', 'test2' ); } echo blaat()[0]; // werkt niet $temp = blaat(); echo $temp[0]; // werkt wel
/edit: net te laat...

1
| getElementAt(5, $array['iets'][0]['ietsanders'].getAttributes()); |
1
2
3
| infiniteloop: 'do stuff goto infiniteloop |
Laten we de C#, de C/C++, de Basic, de Delphi, [insert taal], en de Chrome versie niet vergetenroy-t schreef op donderdag 26 maart 2009 @ 11:14:
Beetje laat maar imho de beste while(true) variant die er is:
Visual Basic:
1 2 3 infiniteloop: 'do stuff goto infiniteloop
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Toch is het in C#, C en C++ anders.Sebazzz schreef op donderdag 26 maart 2009 @ 12:41:
[...]
Laten we de C#, de C/C++, de Basic, de Delphi, [insert taal], en de Chrome versie niet vergetenGooglen mag je zelf doen. Goto is geloof ik het enige statement dat in alle talen hetzelfde eruit ziet, zelfs in TI basic
1
2
3
| infiniteloop: //do stuff goto infiniteloop; |
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Wat is dan het verschil op de puntkomma na?Woy schreef op donderdag 26 maart 2009 @ 12:44:
[...]
Toch is het in C#, C en C++ anders.
code:
1 2 3 infiniteloop: //do stuff goto infiniteloop;
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Het commentaarSebazzz schreef op donderdag 26 maart 2009 @ 16:57:
[...]
Wat is dan het verschil op de puntkomma na?
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
1
| namespace c\windows\system32\fietsbel |
Ik citeer:
Maakt commentaar uit van een statement dan
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Dat denk ik soms ook. Ik vind dat Microsoft met de Visual Studio/.NET combinatie een ijzersterk ontwikkelplatform in handen heeft, dus PHP is inderdaad een zinkend schip wat dat betreft.Zoijar schreef op donderdag 26 maart 2009 @ 17:48:
PHP updatesSteeds weer een nieuw stukje kauwgum om de gaten in het zinkende schip te dichten
.NET is sterk, vooral omdat heel veel talen zijn te '.NETten'. C#.NET, VB.net, Python.NET, A#.NET, Ruby.NET, Delphi.NET. Hiermee kan je heel veel programmeurs aantrekken, en met de sterke debugger van VS maak je het ontwikkelen ook nog eens leuk
[ Voor 10% gewijzigd door Sebazzz op 26-03-2009 18:19 ]
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
In C/C++ in combinatie met VxWorks is het nog makkelijkerSebazzz schreef op donderdag 26 maart 2009 @ 12:41:
[...]
Laten we de C#, de C/C++, de Basic, de Delphi, [insert taal], en de Chrome versie niet vergetenGooglen mag je zelf doen. Goto is geloof ik het enige statement dat in alle talen hetzelfde eruit ziet, zelfs in TI basic
1
2
3
| FOREVER { } |
Ik win
Eventjes nagekeken door twee simpele programmatjes te maken in C:ThunderNet schreef op woensdag 25 maart 2009 @ 15:40:
[...]
Maar dat is niet interresant... Naar hoeveel assembly-code wordt het gecompileerd, dat is interresanter om te weten
1
2
3
4
5
6
7
8
9
10
| #include <stdio.h> int main() { for (;;) { break; } return 0; } |
1
2
3
4
5
6
7
8
9
10
| #include <stdio.h> int main() { while(1) { break; } return 0; } |
Resulteert in dezelfde assembly-code:
1
2
3
4
5
6
7
8
9
10
| .text .globl _main _main: pushl %ebp movl %esp, %ebp subl $8, %esp movl $0, %eax leave ret .subsections_via_symbols |
--edit @hieronder--
Ik heb enkel de discussie afgesplitst die ontstond na de opmerking van Cartman!.
[ Voor 120% gewijzigd door Janoz op 27-03-2009 19:14 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Binnenkort ook een voorbeeld van mij ben ik bang, om een javabestand van 30KB te analyseren heb ik niet genoeg aan 128MB geheugen


* MBV blames Java
http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp Speel hier eens mee?MBV schreef op vrijdag 27 maart 2009 @ 17:41:
@Janoz: je bent er nog een paar vergeten, PHP komt hier veel vaker langs dan alleen de laatste 4pagina's.
Binnenkort ook een voorbeeld van mij ben ik bang, om een javabestand van 30KB te analyseren heb ik niet genoeg aan 128MB geheugenEn ja, ga dat maar eens debuggen... performance-analyse brengt Eclipse op z'n knieën
't komt erop neer dat ik bij 10 mogelijkheden alle permutaties bijhoud (3K), maar dat ik die string toch 27K keer opsla. Bij de eerstvolgende permutatie (verdubbeling van het geheugengebruik hiervoor, theoretisch 3MB) neemt het geheugengebruik met meer dan 60MB toe
* MBV blames Java
Going for adventure, lots of sun and a convertible! | GMT-8
Oh ja, de JVM doet al aardig zijn best: ik zie net dat ik die node (printf debugging FTW
1
2
3
4
5
6
7
| DefaultMutableTreeNode x = new DefaultMutableTreeNode("x"); DefaultMutableTreeNode y = new DefaultMutableTreeNode("y"); DefaultMutableTreeNode z = new DefaultMutableTreeNode("z"); y.add(x); // y heeft x, z heeft niks z.add(x); // z heeft x, y heeft niks |
Dus ik ben een beetje voorzichtig
[edit]
Inderdaad, 't gaat helemaal fout. greppen laat zien dat true/false niet symmetrisch is, waar dat wel zou moeten
[ Voor 73% gewijzigd door MBV op 27-03-2009 18:11 ]
Verwijderd
DefaultMutableTreeNode kan maar 1 parent hebben (En daardoor ook maar in 1 tree model voorkomen); Use the source lukeMBV schreef op vrijdag 27 maart 2009 @ 17:58:
Java:
1 2 3 4 5 6 7 DefaultMutableTreeNode x = new DefaultMutableTreeNode("x"); DefaultMutableTreeNode y = new DefaultMutableTreeNode("y"); DefaultMutableTreeNode z = new DefaultMutableTreeNode("z"); y.add(x); // y heeft x, z heeft niks z.add(x); // z heeft x, y heeft niks
DefaultMutableTreeNode:
1
2
| /** this node's parent, or null if this node has no parent */ protected MutableTreeNode parent; |
Denk inderdaad dat je door het implementen van de MutableTreeNode interface beter je doel van multiple parents kan bereiken.
Haha, ja doh, hij optimaliseert die hele loop eruitdev10 schreef op donderdag 26 maart 2009 @ 19:22:
Eventjes nagekeken door twee simpele programmatjes te maken in C:
Resulteert in dezelfde assembly-code:
code:
1 2 3 4 5 6 7 8 9 10 .text .globl _main _main: pushl %ebp movl %esp, %ebp subl $8, %esp movl $0, %eax leave ret .subsections_via_symbols
(maar dan nog zal je wel gelijk hebben, alleen de manier van aantonen klopt niet
[ Voor 8% gewijzigd door Zoijar op 29-03-2009 21:40 ]
Dan nog gaat het vaak niet helpen, omdat ik vaak niet kan gebruiken dat bij aanpassen van 1 node in de tree, de andere mee verandert. Ik zat meer te denken aan een overload van de add-method: if (node.parent != null) then copy; else node.parent = this; ofzo.Verwijderd schreef op zondag 29 maart 2009 @ 20:01:
[...]
DefaultMutableTreeNode kan maar 1 parent hebben (En daardoor ook maar in 1 tree model voorkomen); Use the source luke:
DefaultMutableTreeNode:
Java:
1 2 /** this node's parent, or null if this node has no parent */ protected MutableTreeNode parent;
Denk inderdaad dat je door het implementen van de MutableTreeNode interface beter je doel van multiple parents kan bereiken.
[/zwaar offtopic]
1
| <noscript><div class="message" onclick="this.style.display='none'">[enz.] |
Niet de slechtste, maar wel een beetje knullig
http://thedailywtf.com/Ar...JavaScript-Detection.aspxmcDavid schreef op dinsdag 31 maart 2009 @ 22:13:
HTML:
1 <noscript><div class="message" onclick="this.style.display='none'">[enz.]
Niet de slechtste, maar wel een beetje knullig. Gelukkig bedacht ik me toen ik er nog eens goed naar keek.
die is leuker
Het 'false' returnen bij geen JS, je snapt ook echt niet hoe het verzonnen wordt.
Verwijderd
Ik volg tegenwoordig de course "Database Applications" op een HBO school. Hier leren we dus op dit moment SQL, maar... is dit HBO niveau te noemen?
"Geef stuknummer, titel en speelduur van het kortste stuk."
1
2
3
4
5
| SELECT stuknr, titel, speelduur FROM Stuk WHERE speelduur <= ALL (SELECT speelduur FROM Stuk WHERE speelduur IS NOT NULL) |
Dit is een van de vele bagger query's uit een PPT, was toch wel even een "klein" WTF-momentje...
Verwijderd schreef op woensdag 01 april 2009 @ 15:09:
Weet niet of SQL ook onder "programmeervoorbeelden" vallen..
Ik volg tegenwoordig de course "Database Applications" op een HBO school. Hier leren we dus op dit moment SQL, maar... is dit HBO niveau te noemen?
"Geef stuknummer, titel en speelduur van het kortste stuk."
SQL:
1 2 3 4 5 SELECT stuknr, titel, speelduur FROM Stuk WHERE speelduur <= ALL (SELECT speelduur FROM Stuk WHERE speelduur IS NOT NULL)
Dit is een van de vele bagger query's uit een PPT, was toch wel even een "klein" WTF-momentje...

Weet je zeker dat het niet een voorbeeldje was van hoe het niet moest?
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Idd, voor hetzelfde geld maakt de optimizer er precies hetzelfde van. Echter lijkt me het voor de leesbaarheid ook beter om het met een limit te doen.Zoijar schreef op woensdag 01 april 2009 @ 15:23:
order by speelduur asc limit 1 lijkt me ook makkelijker... sneller weet ik niet, die query optimizers zijn raar; het is soms net een soort voodoo hoe snel ze de grootste bagger nog krijgen. Slimme beestjes.
Het enige nadeel is dat limit per RDBMS weer anders werkt. Dus dat is mischien een reden dat ze het niet gebruikt hebben.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
En zolang je geen b-tree-achtige index op speelduur hebt dan zal je alsnog de hele tabel moeten inlezen en ben je met de subquery-oplossing niet eens zo heel veel slechter af. Niet dat dat een sluitend argument voor het gebruik van een subquery is, maar toch.
[ Voor 5% gewijzigd door netvor op 01-04-2009 15:35 ]
Computer Science: describing our world with boxes and arrows.
Het schoolvoorbeeld is trouwens:
1
2
3
| SELECT stuknr, titel, speelduur FROM Stuk WHERE speelduur = (SELECT MIN(speelduur) FROM Stuk) |
Ongeoptimaliseerd is dit O(n), die met die ANY was O(n2). De b-tree gaat je ook alleen maar helpen als de optimizer snapt dat ie alsnog het minimum moet nemen bij de ANY query of als ie b-tree overhevelt naar de temporary table die hij voor de ANY query gegenereerd heeft.
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.
1
2
3
4
| void main() { main(); } |
Flickr
Canon 7D + Glas + Licht
Komt het rot over dan bedoel ik het anders en taalfouten zijn inbegrepen.
1
2
3
| SELECT stuknr, titel, speelduur FROM Stuk HAVING speelduur = MIN(speelduur) |
Uiteindelijk komt dat natuurlijk op hetzelfde neer, maar het is eenvoudiger te schrijven
[disclaimer]
Mijn SQL is een beetje roestig
[/disclaimer]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Geeft niets, compilet gelukkig toch niet
@Woy: een HAVING zonder GROUP BY?

[ Voor 73% gewijzigd door .oisyn op 01-04-2009 15:53 ]
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.
Daarom de disclaimer
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Verwijderd
De omschrijving: "Geef stuknummer, titel en speelduur van het kortste stuk.".
Dus het gaat dus om één stuk.
Ja, heel zeker.. Ook geen 1 april grap, want 't was gister...Woy schreef op woensdag 01 april 2009 @ 15:20:
[...]
Weet je zeker dat het niet een voorbeeldje was van hoe het niet moest?
Waarom heb ik het idee dat het volgende ook niet helemaal optimaal is?
"Geef stuknummer en titel van alle stukken die gecomponeerd zijn door een docent van een Amsterdamse muziekschool."
1
2
3
4
5
6
7
8
9
| SELECT stuknr, titel FROM Stuk WHERE componistId IN (SELECT componistId FROM Componist WHERE schoolId IN (SELECT schoolId FROM Muziekschool WHERE plaatsnaam = "Amsterdam")); |
Het resultaat was ook heel mooi te zien toen we de opgaven gingen maken, wat daar allemaal uit kwam...
[ Voor 15% gewijzigd door Verwijderd op 01-04-2009 16:02 ]
Ze zijn blijkbaar gewoon nog niet bij het hoofdstuk Joins beland. Maar dit soort dingen zal door de meeste optimizers wel goed opgepakt worden.Verwijderd schreef op woensdag 01 april 2009 @ 15:58:
s
[...]
Ja, heel zeker.. Ook geen 1 april grap, want 't was gister...
Waarom heb ik het idee dat het volgende ook niet helemaal optimaal is?
SQL:
1 2 3 4 5 6 7 8 9 SELECT stuknr, titel FROM Stuk WHERE componistId IN (SELECT componistId FROM Componist WHERE schoolId IN (SELECT schoolId FROM Muziekschool WHERE plaatsnaam = "Amsterdam"));
Het resultaat was ook heel mooi te zien toen we de opgaven gingen maken, wat daar allemaal uit kwam...
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Verwijderd
Jawel, dit was het laatste hoofdstuk.Woy schreef op woensdag 01 april 2009 @ 16:01:
[...]
Ze zijn blijkbaar gewoon nog niet bij het hoofdstuk Joins beland. Maar dit soort dingen zal door de meeste optimizers wel goed opgepakt worden.
query van oisyn met subquery min(): 2032 rows returned in 433ms
het slechte voorbeeld met <= ALL: na 5 minuten nog geen resultaat en een abort gedaan
Dan ben ik ook wel benieuwd wat het doet als je er wel een index op hebt, en met welk RDBMS je getest hebt.Zoijar schreef op woensdag 01 april 2009 @ 21:20:
Haha, ik heb het verschil tussen die twee "kortste speelduur" queries nog even getest. Tabel met 1,6 miljoen records, geen index op de "speelduur".
query van oisyn met subquery min(): 2032 rows returned in 433ms
het slechte voorbeeld met <= ALL: na 5 minuten nog geen resultaat en een abort gedaan
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Wel als je MySQL gebruiktWoy schreef op woensdag 01 april 2009 @ 15:55:
[...]
Daarom de disclaimer, ik zag idd in de docs dat dat niet kan.


handig...
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Oeh, dat herinnert me aan mijn stageverslag. De eerste keer dat ik echt lol had aan het schrijven van een verslag omdat het ook een soort programmeren was.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Verwijderd
LaTeX rocks!
Kater? Eerst water, de rest komt later
Tabellen in LaTeX zijn vooral moeilijk wanneer je er andere dingen mee wil doen dan tabulaire data in stoppen. Gewoon wat getalletjes gaat prima, zeker met een goede editor.Haan schreef op donderdag 02 april 2009 @ 08:31:
LaTeX ftw inderdaad! Al heb ik er ook soms ruzie mee, vooral als je een tabel moet maken die je in Word zo uit de grond stampt, maar in LaTeX kan dat een pain-in-the-*ss zijn
Wil je bijvoorbeeld een tabel maken met overwegingen, criteria en ratings voor een bepaald ontwerp, dan is dat best lastig. Ik bedenk altijd: als een tabel maken lastig is, is een tabel dan wel een goed idee? Daarmee kom je tot soms betere formats om je dingen op te schrijven
Nog even opnieuw getest voor je, alleen met die min() subqueryWoy schreef op woensdag 01 april 2009 @ 22:19:
Dan ben ik ook wel benieuwd wat het doet als je er wel een index op hebt, en met welk RDBMS je getest hebt.
Postgresql 8.3.7
no-index: 2164 rows returned in 450ms
index: 2164 rows returned in 125ms
Nou was ik vooral benieuwd naar de andere query met indexZoijar schreef op donderdag 02 april 2009 @ 09:56:
[...]
Nog even opnieuw getest voor je, alleen met die min() subquery
Postgresql 8.3.7
no-index: 2164 rows returned in 450ms
index: 2164 rows returned in 125ms
Gelukkig gebruik je geen MySql, Postgresql heeft volgens mij een stuk betere optimizer
[ Voor 9% gewijzigd door Woy op 02-04-2009 10:00 ]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Met als "voordeel" dat je je in MySQL geen zorgen hoeft te maken over het wel of niet hebben van een geschikte index... het is allemaal even traag.
Computer Science: describing our world with boxes and arrows.
Verwacht bij MySQL net zo goed een verschil tussen 3ms en 5 minuten op grote datasets tussen wel/niet optimaliseren. Daarbij helpen de indexen, maar ook de 481 instellingen uit de mysql-configuratie (standaard gebruikt een dedicated server 200MB van de 2GB beschikbaar

Verwijderd
Liever nu op t HBO blunderen dat ik me er achteraf om kan gaan schamen dan dat ik nu alles perfect maak en dr geen fuck van leer
nee, en ik ga het níet posten
Wat is dat nou voor instelling.Verwijderd schreef op donderdag 02 april 2009 @ 14:41:
nee, en ik ga het níet posten

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?
De echte explain held heeft niet zo veel moeite met indexje leggen hoor.MBV schreef op donderdag 02 april 2009 @ 14:33:
Dat zie je verkeerd: bij MySQL heeft juist díe index waarvan je denkt dat hij nooit effect kán hebben, het meeste effect. Zie die maar eens te vinden

De default settings zijn inderdaad een beetje conservatief gebaseerd op hardware uit 2001. Maar dan nog: Iedereen die blndelings met de default config start heeft het recht niet om te zeiken over performance.Daarbij helpen de indexen, maar ook de 481 instellingen uit de mysql-configuratie (standaard gebruikt een dedicated server 200MB van de 2GB beschikbaar)
{signature}
[ Voor 99% gewijzigd door ? ? op 25-01-2013 09:46 ]
Bill Gates: "640K ought to be enough for anyone"era.zer schreef op donderdag 02 april 2009 @ 15:53:
Nog eentje van mij uit de oude doos toen classic ASP nog hip was en ik nog geen diploma had...
code:
1 2 Dim tabData(10000, 30) '10000 should be more than enough
Mastermind schreef op donderdag 02 april 2009 @ 16:44:
[...]
Bill Gates: "640K ought to be enough for anyone"
Ben niet echt thuis in vb6, wat definieer je eigenlijk met Dim tabData(10000, 30)?
'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.
Wat ie alleen nooit heeft gezegd.Mastermind schreef op donderdag 02 april 2009 @ 16:44:
[...]
Bill Gates: "640K ought to be enough for anyone"
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.
Volgens mij een 2-dimensionale array van 10000x30Boeboe schreef op donderdag 02 april 2009 @ 16:50:
[...]
![]()
Ben niet echt thuis in vb6, wat definieer je eigenlijk met Dim tabData(10000, 30)?
Dat ben ik dan kennelijk nietVoutloos schreef op donderdag 02 april 2009 @ 15:03:
[...]
De echte explain held heeft niet zo veel moeite met indexje leggen hoor.

Een default config zou op z'n minst een beetje in de buurt moeten komen. Of er zou een configuratie bij moeten zitten als alternatief, voor het geval je 2GB geheugen wilt reserveren. Of er zou een wizzard moeten zitten in de installatie die vraagt hoeveel geheugen MySQL ongeveer mag pakken en nog wat relevante vragen.[...]
De default settings zijn inderdaad een beetje conservatief gebaseerd op hardware uit 2001. Maar dan nog: Iedereen die blndelings met de default config start heeft het recht niet om te zeiken over performance.
De databaseserver van mijn vorige baas bleek dus helemaal standaard te staan, wat vervelend werd toen de site echt door z'n knieën ging. Dé oplossing: de statische CSS pagina niet dynamisch genereren, scheelde de helft van de requests
CachingMBV schreef op donderdag 02 april 2009 @ 21:04:
Dé oplossing: de statische CSS pagina niet dynamisch genereren, scheelde de helft van de requests

- alles includen wat voor sessies nodig is
- alles wat nodig is om speciale url's te vertalen naar id's doen
- nog wat zooi
- roep caching-functie aan
- ga verder met hoe het was
caching-functie checkte of het ID overeenkwam met 81 of 34 (CSS en JS bestanden), en die uit ../cache/ uitspugen met de goede headers, gevolgd door een die(). De index wilde ik ook cachen, maar dat ging mis: de pagina voor interne IP-adressen werd per ongeluk naar buiten getoond... En de CSS en JS scheelde al genoeg.
Het ergste komt nog: er zat een caching-mechanisme in, wat alleen werkte voor het diepst genestte element uit de recursieve templates

@voorganger: SHOOT YOU!
[/frustratie]
Oh ja, MySQL caching had ook nauwelijks effect, omdat de queries iets te vaak verschilden, en allemaal van 100 tabellen afhingen. Tabellen die 1-op-1 uit het ERP werden gerepliceerd. 't Leuke daaraan is dat mijn collega voor een nieuwe applicatie ineens wist hoe je een view kon maken...
[/meer frustratie]
Lang lang geleden toen ik nog maar net programmeerde vond een bedrijfje waar ik af en toe Windows XP opnieuw installeerde dat ik zo knap was met computers en of ik niet een programmatje voor ze kon schrijven. Een kleine database met wat dingetjes, zouden maar 1 of 2 mensen gebruiken. Trots als ik was ging ik aan de gang, om na een paar maanden *bedrijfsnaam database 1.0* op te leveren. Het werkte allemaal prima, en de vereisten waren heerlijk laag.
-VB6 runtime
-Windows 95 of hoger
-FTP server
Dus ja prima... Wait what, FTP Server? Jaja alle transacties gingen via losse bestanden. Het vb6 programma haalde een bestandje op van de server, gebruikte VB6 interne "plain text database" functies om dit uit te lezen. Downloade daarna nog een keer het zelfde losse bestandje (er kon immers ondertussen wat veranderd zijn) en committe de nieuwe data naar het bestandje en uploade dat weer. Zoals je ziet was er slechts een periode van +- 10seconden waarin er echt troep kon gebeuren.
Nouja werkte dus prima, ik blij, zij blij. Totdat ze me meer dan twee jaar later opbellen (inmiddels studeer ik dan net informatica en had ik echt ontzettend veel geleerd doordat ik ook fulltime aan het prog hobbyen was) dat het wat traag aan het worden is. Geen wonder, de FTP server staat wel in hun lokale netwerk, maar 2x een bestand van 15MB downloaden en het daarna weer uploaden per verandering maakt het soms wel even traag. (En door de prachtige relaties die ik had gemaakt moest je soms meer dan 1 bestand hebben).
Ik kwam daar binnen en achter elke computer die ik zag stond de database open. Ook hadden ze twee nieuwe vestigingen ge-opened die ook de database gebruikt. Er waren in totaal continue 20 mensen tegelijkertijd met de DB bezig. (En somehow ging het nogsteeds goed).
Het half jaar daarna heb ik mijn vrije tijd besteed aan een nette database geschreven in C# die netjes gebruik maakt van een MySQL datbase bij een externe hoster. Gevuld met good practices als parameterized queries e.d.
(Wel ben ik stiekem nogsteeds trots op mijn "VB6-ftp based relational database"
- Site met dynamische webshop in meerdere talen (voorlopig en/nl) waarbij elke string uit de database komt
- Voor elke string die opgehaald moest worden werd een functie aangeroepen String::getString(id);
- Caching, wat is dat?
Komt er dus op neer dat er per opgevraagde pagina een paar honderd queries gedaan werden. Dan kun je je voorstellen dat met n paar duizend bezoekers per dag best in de knoop komt met performance
Ik heb t uiteindelijk opgelost door fullpage caching in te bouwen (met Zend_Cache) maar dit is iets waar we erg van geleerd hebben...
Dat hoeft nog niet eens zo'n probleem te zijn. Invision Power Board doet dit ook, alles wordt via index.php aangeroepen. Dat maakt bijvoorbeeld modrewriten een stuk makkelijker, en je hoeft ook niet dezelfde code, al is het maar een include in meerdere pagina's te plempen.MBV schreef op donderdag 02 april 2009 @ 23:40:
Jij hebt duidelijk die codebase niet gezienAlles werd via index.php doorgeschoten naar de 'back end'. Ik heb die caching als volgt opgelost:
Nu zijn zij niet altijd een even goed voorbeeld, want zij misbruiken classes bijvoorbeeld. Een pagina, zoals de 'post bericht' pagina is gewoon een class die aangeroepen wordt, deze doet zijn ding, en dan wordt via een soort GetHTML() aanroep de geparste HTML verkregen. Deze wordt dan verder verwerkt in andere templates. Zo ongeveer werkt 't:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class blaat { private $blaat; private $zoem; function __construct() { global $IN, $DB, // en nog wat variabelen // doe dingen // verwerk post data enz. parse templates } function GetHTML() { // return geparste template } } |
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Prachtig verhaalroy-t schreef op vrijdag 03 april 2009 @ 08:33:
Om maar is even een slecht programmeer (hoewel, eerder S.D.) voorbeeld te geven van mezelf.
*snip*
(Wel ben ik stiekem nogsteeds trots op mijn "VB6-ftp based relational database")
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
roy-t schreef op vrijdag 03 april 2009 @ 08:33:
[..mooi verhaal]
(Wel ben ik stiekem nogsteeds trots op mijn "VB6-ftp based relational database")
Geweldig verhaal! Dat je het eerst maar voor 1 of 2 mensen moet maken, kom je een paar jaar later daar weer binnen wandelen, draait dat programmaatje gewoon op 20 computers die er tegelijkertijd mee bezig zijn!
Front-controller pattern? of zeg ik nou iets heel doms?MBV schreef op donderdag 02 april 2009 @ 23:40:
Jij hebt duidelijk die codebase niet gezienAlles werd via index.php doorgeschoten naar de 'back end'. [...]
Ik vind dat ook niet slecht, maar de 'front controller' deed zo ontzettend veel dingen waar hij zich niet mee moest bemoeien, dat het een onoverzichtelijke brei was geworden. En dat alles in 1 grote lap code zonder opdeling in functies o.i.d.Muscrerior schreef op vrijdag 03 april 2009 @ 10:10:
[...]
Front-controller pattern? of zeg ik nou iets heel doms
Daarnaast waren noodzakelijke initialisaties verspreid over een stuk of 4 bestanden van 10.000 regels per stuk ofzo. Als je dat alles moet doen voordat de caching plaats vindt, heeft de caching geen zin meer: in die initialisaties werd halverwege namelijk de pagina uit de database gehaald...

Nu ik mijn bericht teruglees zie ik inderdaad dat ik vergeten ben om uit te leggen waarom de code zo slecht was. Dat had o.a. te maken met de structuur van de code (3/4 stond in common.php, manier van met templates omgaan, html-structuur van de templates,...), en natuurlijk de caching waarbij iemand vergeten was om te kijken of het wel effect had. Vandaar dat ik die smerige hack in index.php heb gezet die alles zo ver mogelijk bij het begin stopzette.
[ Voor 22% gewijzigd door MBV op 03-04-2009 11:33 ]
Verwijderd
Hèee, maar als ik het goed begrijp kan die Front-controller echt extreem groot worden?Muscrerior schreef op vrijdag 03 april 2009 @ 10:10:
[...]
Front-controller pattern? of zeg ik nou iets heel doms?
Verwijderd
Dat dusMBV schreef op vrijdag 03 april 2009 @ 11:28:
[...]
Ik vind dat ook niet slecht, maar de 'front controller' deed zo ontzettend veel dingen waar hij zich niet mee moest bemoeien, dat het een onoverzichtelijke brei was geworden.
Gewoon lekker duidelijk (wel met een O/R mapper, mgoed):
1
2
3
4
5
6
7
| DAL.BeerCollection dalBeers = new DAL.BeerCollection(); dalBeers.GetMulti(null); foreach(DAL.BeerEntity dalBeer in dalBeers) { dalBeer.SomeProperty = ....; } |
[ Voor 6% gewijzigd door Grijze Vos op 03-04-2009 15:33 ]
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
{signature}
Dan begrijp je t niet goed dusVerwijderd schreef op vrijdag 03 april 2009 @ 15:02:
[...]
Hèee, maar als ik het goed begrijp kan die Front-controller echt extreem groot worden?
xl2latex?Haan schreef op donderdag 02 april 2009 @ 08:31:
LaTeX ftw inderdaad! Al heb ik er ook soms ruzie mee, vooral als je een tabel moet maken die je in Word zo uit de grond stampt, maar in LaTeX kan dat een pain-in-the-*ss zijn
Verwijderd
Kost je toch weer een paar clockcycles extra elke keer. En dat op een vrij drukke site...you do the mathVoutloos schreef op vrijdag 03 april 2009 @ 15:44:
Ik mis het echte probleem? Bij 90% vd mysql_fetch_array() calls wereldwijd gaat de return value in een variabele genaamd $row. Of is de tussenvariabele het probleem? Dat zal me roesten, is een micro optimalisatie at best.
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Met een goede optimizer maakt het geen zak uit.Verwijderd schreef op zaterdag 04 april 2009 @ 13:19:
[...]
Kost je toch weer een paar clockcycles extra elke keer. En dat op een vrij drukke site...you do the math.
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.
@hieronder: nee, de PHP compiler prikt bijna nergens doorheen. Daar heb ik eerder dingen voor uitgeprobeerd: geef hem in een loopje 100.000 keer een string-constante van erg lang, vergelijk dat met een korte string, en geef de output: 10x zo lang als een korte string-constante

[ Voor 95% gewijzigd door MBV op 04-04-2009 16:24 ]
Verwijderd
Hoewel mijn reactie niet helemaal serieus was vraag ik me wel af of de PHP compiler hier doorheen prikt?.oisyn schreef op zaterdag 04 april 2009 @ 14:28:
[...]
Met een goede optimizer maakt het geen zak uit.
Zinnige naamgeving helpt bij het voorkomen van dit soort fouten wellicht? En het gebruik van een zinnige library (zelf geschreven of niet) zorgt er uberhaupt voor dat ie die code niet telkens opnieuw hoeft te schrijven.Voutloos schreef op vrijdag 03 april 2009 @ 15:44:
Ik mis het echte probleem? Bij 90% vd mysql_fetch_array() calls wereldwijd gaat de return value in een variabele genaamd $row. Of is de tussenvariabele het probleem? Dat zal me roesten, is een micro optimalisatie at best.
Welke compiler?Verwijderd schreef op zaterdag 04 april 2009 @ 16:07:
[...]
Hoewel mijn reactie niet helemaal serieus was vraag ik me wel af of de PHP compiler hier doorheen prikt?
[ Voor 18% gewijzigd door Grijze Vos op 04-04-2009 16:25 ]
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Verwijderd
PHP heeft een interpreter, dat is m.i. iets heel andersVerwijderd schreef op zaterdag 04 april 2009 @ 16:50:
Heeft PHP geen compiler dan? Wat in de .php files staat is toch geen uitvoerbare machinecode...dus er zal iets gecompileerd moeten worden
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
[ Voor 30% gewijzigd door AtleX op 04-04-2009 17:17 ]
Sole survivor of the Chicxulub asteroid impact.
Your point being...?
De vraag is, wat is de PHP compiler? Het staat iedereen vrij een eigen implementatie te maken, en daarom bestaan die ook, en tevens 3rd party optimizers.Verwijderd schreef op zaterdag 04 april 2009 @ 16:07:
[...]
Hoewel mijn reactie niet helemaal serieus was vraag ik me wel af of de PHP compiler hier doorheen prikt?
Verder lijken een aantal heren hierboven me te denken dat iets alleen maar een compiler is als het machinecode output.
[ Voor 10% gewijzigd door .oisyn op 04-04-2009 18:15 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Hoeveel mensen compileren nou een PHP script in plaats van deze gewoon direct te laten uitvoeren als plain text bestand?AtleX schreef op zaterdag 04 april 2009 @ 17:17:
En de bytecode compiler wordt voor het gemak maar even vergeten? Die bytecode wordt namelijk aan de Zend Engine gevoerd.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Sebazzz, het feit dat een stuk programmacode direct wordt uitgevoerd wil niet zeggen dat er geen interne compiler tussen zit die de code zelf transformeert naar een bytecode vorm oid, wat vervolgens eventueel wordt geoptimaliseerd en vervolgens wordt uitgevoerd.
[ Voor 86% gewijzigd door .oisyn op 04-04-2009 18:15 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Hoewel het wel een 'beetje' mierenneuken is, het zal 1 extra reference zijn...
{signature}
Van een master-student informatica verwacht ik toch echt dat je weet wat een compiler isGrijze Vos schreef op zaterdag 04 april 2009 @ 16:25:
Welke compiler?
Heb jij een betere definitie dan deze:
Ja, ik zie de flags dat een expert ernaar moet kijken, en als dat echt een probleem is, vraag ik het woensdag aan MarkA compiler is a computer program (or set of programs) that transforms source code written in a computer language (the source language) into another computer language (the target language, often having a binary form known as object code
Dat we er hier al eerder achter zijn gekomen dat de Zend compiler/interpreter zuigt
de PHP compiler is dat ding wat je van Zend.com gratis kan downloaden, dat lijkt me duidelijk. Dat is immers degene die het meeste wordt gebruikt, het ding wat je o.a. meekrijgt als je XAMP installeert, het ding wat je krijgt als je apt-get install apache-php intikt in Debian.De vraag is, wat is de PHP compiler? Het staat iedereen vrij een eigen implementatie te maken, en daarom bestaan die ook, en tevens 3rd party optimizers.
Net zoals de C# compiler de meest-gebruikte, standaard meegeleverde compiler is: dat ding van MS.
Net zoals de TomTom het ding is wat TomTom maakt, en niet die van Medion
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Dit topic is gesloten.
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes.